mirror of
https://git.ryujinx.app/projects/Kenji-NX.git
synced 2026-09-27 16:37:53 +02:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03623b73ef |
@@ -413,10 +413,6 @@ namespace ARMeilleure.Translation
|
||||
|
||||
context.CurrOp = opCode;
|
||||
|
||||
Operand nativeContext = context.LoadArgument(OperandType.I64, 0);
|
||||
Operand dispAddressAddr = context.Add(nativeContext, Const((ulong)NativeContext.GetDispatchAddressOffset()));
|
||||
context.Store(dispAddressAddr, Const(opCode.Address));
|
||||
|
||||
bool isLastOp = opcIndex == block.OpCodes.Count - 1;
|
||||
|
||||
if (isLastOp)
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
|
||||
{
|
||||
static class Decoder<T> where T : IInstEmit
|
||||
{
|
||||
public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool singleBlock, bool isThumb)
|
||||
public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool isThumb)
|
||||
{
|
||||
List<Block> blocks = [];
|
||||
List<ulong> branchTargets = [];
|
||||
@@ -24,7 +24,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32
|
||||
|
||||
blocks.Add(block);
|
||||
|
||||
if (block.IsTruncated || (singleBlock && block.EndsWithBranch) || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets))
|
||||
if (block.IsTruncated || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
|
||||
|
||||
public static CompiledFunction Compile(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, IAddressTable<ulong> funcTable, nint dispatchStubPtr, bool isThumb)
|
||||
{
|
||||
MultiBlock multiBlock = Decoder<InstEmit>.DecodeMulti(cpuPreset, memoryManager, address, singleBlock: true, isThumb);
|
||||
MultiBlock multiBlock = Decoder<InstEmit>.DecodeMulti(cpuPreset, memoryManager, address, isThumb);
|
||||
|
||||
Dictionary<ulong, int> targets = new();
|
||||
|
||||
|
||||
@@ -305,7 +305,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
||||
|
||||
public static CompiledFunction Compile(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, IAddressTable<ulong> funcTable, nint dispatchStubPtr)
|
||||
{
|
||||
MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address, singleBlock: true);
|
||||
MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address);
|
||||
|
||||
Dictionary<ulong, int> targets = new();
|
||||
List<PendingBranch> pendingBranches = [];
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
||||
private const uint NzcvFlags = 0xfu << 28;
|
||||
private const uint CFlag = 0x1u << 29;
|
||||
|
||||
public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool singleBlock)
|
||||
public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address)
|
||||
{
|
||||
List<Block> blocks = [];
|
||||
List<ulong> branchTargets = [];
|
||||
@@ -35,7 +35,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
||||
|
||||
blocks.Add(block);
|
||||
|
||||
if (block.IsTruncated || (singleBlock && block.EndsWithBranch) || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets))
|
||||
if (block.IsTruncated || !HasNextBlock(block, block.EndAddress - 4UL, branchTargets))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
public readonly bool SupportsGeometryShader;
|
||||
public readonly bool SupportsGeometryShaderPassthrough;
|
||||
public readonly bool SupportsTransformFeedback;
|
||||
public readonly bool SupportsImageBufferPixelAlignment;
|
||||
public readonly bool SupportsImageLoadFormatted;
|
||||
public readonly bool SupportsLayerVertexTessellation;
|
||||
public readonly bool SupportsMismatchingViewFormat;
|
||||
@@ -44,7 +43,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
public readonly bool SupportsShaderBarrierDivergence;
|
||||
public readonly bool SupportsShaderFloat64;
|
||||
public readonly bool SupportsShaderNonUniformIndexing;
|
||||
public readonly bool SupportsTextureBufferPixelAlignment;
|
||||
public readonly bool SupportsTextureGatherOffsets;
|
||||
public readonly bool SupportsTextureShadowLod;
|
||||
public readonly bool SupportsVertexStoreAndAtomics;
|
||||
@@ -103,7 +101,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
bool supportsGeometryShader,
|
||||
bool supportsGeometryShaderPassthrough,
|
||||
bool supportsTransformFeedback,
|
||||
bool supportsImageBufferPixelAlignment,
|
||||
bool supportsImageLoadFormatted,
|
||||
bool supportsLayerVertexTessellation,
|
||||
bool supportsMismatchingViewFormat,
|
||||
@@ -115,7 +112,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
bool supportsShaderBarrierDivergence,
|
||||
bool supportsShaderFloat64,
|
||||
bool supportsShaderNonUniformIndexing,
|
||||
bool supportsTextureBufferPixelAlignment,
|
||||
bool supportsTextureGatherOffsets,
|
||||
bool supportsTextureShadowLod,
|
||||
bool supportsVertexStoreAndAtomics,
|
||||
@@ -168,7 +164,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
SupportsGeometryShader = supportsGeometryShader;
|
||||
SupportsGeometryShaderPassthrough = supportsGeometryShaderPassthrough;
|
||||
SupportsTransformFeedback = supportsTransformFeedback;
|
||||
SupportsImageBufferPixelAlignment = supportsImageBufferPixelAlignment;
|
||||
SupportsImageLoadFormatted = supportsImageLoadFormatted;
|
||||
SupportsLayerVertexTessellation = supportsLayerVertexTessellation;
|
||||
SupportsMismatchingViewFormat = supportsMismatchingViewFormat;
|
||||
@@ -180,7 +175,6 @@ namespace Ryujinx.Graphics.GAL
|
||||
SupportsShaderBarrierDivergence = supportsShaderBarrierDivergence;
|
||||
SupportsShaderFloat64 = supportsShaderFloat64;
|
||||
SupportsShaderNonUniformIndexing = supportsShaderNonUniformIndexing;
|
||||
SupportsTextureBufferPixelAlignment = supportsTextureBufferPixelAlignment;
|
||||
SupportsTextureGatherOffsets = supportsTextureGatherOffsets;
|
||||
SupportsTextureShadowLod = supportsTextureShadowLod;
|
||||
SupportsVertexStoreAndAtomics = supportsVertexStoreAndAtomics;
|
||||
|
||||
@@ -466,7 +466,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
|
||||
engine.UpdateState(ulong.MaxValue & ~(1UL << StateUpdater.ShaderStateIndex));
|
||||
|
||||
_channel.TextureManager.SignalRenderTargetsModifiable();
|
||||
_channel.TextureManager.UpdateRenderTargets();
|
||||
|
||||
int textureId = _state.State.DrawTextureTextureId;
|
||||
@@ -804,7 +803,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
int index = (argument >> 6) & 0xf;
|
||||
int layer = (argument >> 10) & 0x3ff;
|
||||
|
||||
RenderTargetUpdateFlags updateFlags = RenderTargetUpdateFlags.SingleColor | RenderTargetUpdateFlags.ForClear;
|
||||
RenderTargetUpdateFlags updateFlags = RenderTargetUpdateFlags.SingleColor;
|
||||
|
||||
if (layer != 0 || layerCount > 1)
|
||||
{
|
||||
|
||||
@@ -38,11 +38,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
/// </summary>
|
||||
DiscardClip = 1 << 4,
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the render target will be used for a clear operation.
|
||||
/// </summary>
|
||||
ForClear = 1 << 5,
|
||||
|
||||
/// <summary>
|
||||
/// Default update flags for draw.
|
||||
/// </summary>
|
||||
|
||||
@@ -45,7 +45,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
private ProgramPipelineState _pipeline;
|
||||
|
||||
private bool _fsReadsFragCoord;
|
||||
private bool _fsAlwaysDiscards;
|
||||
private bool _vsUsesDrawParameters;
|
||||
private bool _vtgWritesRtLayer;
|
||||
private byte _vsClipDistancesWritten;
|
||||
@@ -492,8 +491,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
|
||||
Span<RtColorState> rtColorStateSpan = _state.State.RtColorState.AsSpan();
|
||||
|
||||
bool rtModifiable = updateFlags.HasFlag(RenderTargetUpdateFlags.ForClear) || !_fsAlwaysDiscards;
|
||||
|
||||
for (int index = 0; index < Constants.TotalRenderTargets; index++)
|
||||
{
|
||||
int rtIndex = useControl ? rtControl.UnpackPermutationIndex(index) : index;
|
||||
@@ -502,7 +499,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
|
||||
if (index >= count || !IsRtEnabled(colorState) || (singleColor && index != singleUse))
|
||||
{
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetColor(index, null, rtModifiable);
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetColor(index, null);
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -521,7 +518,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
samplesInY,
|
||||
sizeHint);
|
||||
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetColor(index, color, rtModifiable);
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetColor(index, color);
|
||||
|
||||
if (color != null)
|
||||
{
|
||||
@@ -575,7 +572,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
}
|
||||
}
|
||||
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetDepthStencil(depthStencil, rtModifiable);
|
||||
changedScale |= _channel.TextureManager.SetRenderTargetDepthStencil(depthStencil);
|
||||
|
||||
if (changedScale)
|
||||
{
|
||||
@@ -777,11 +774,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
float width = scaleX * 2;
|
||||
float height = scaleY * 2;
|
||||
|
||||
if (yNegate)
|
||||
{
|
||||
y += _state.State.ScreenScissorState.Height - MathF.Abs(height);
|
||||
}
|
||||
|
||||
float scale = _channel.TextureManager.RenderTargetScale;
|
||||
if (scale != 1f)
|
||||
{
|
||||
@@ -1525,38 +1517,20 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
||||
_currentProgramInfo[stageIndex] = info;
|
||||
}
|
||||
|
||||
_fsReadsFragCoord = false;
|
||||
|
||||
ShaderProgramInfo fragmentShaderInfo = gs.Shaders[5]?.Info;
|
||||
|
||||
if (fragmentShaderInfo != null)
|
||||
if (gs.Shaders[5]?.Info.UsesFragCoord == true)
|
||||
{
|
||||
if (fragmentShaderInfo.UsesFragCoord)
|
||||
// Make sure we update the viewport size on the support buffer if it will be consumed on the new shader.
|
||||
|
||||
if (!_fsReadsFragCoord && (_state.State.YControl & YControl.NegateY) != 0)
|
||||
{
|
||||
// Make sure we update the viewport size on the support buffer if it will be consumed on the new shader.
|
||||
|
||||
if (!_fsReadsFragCoord && (_state.State.YControl & YControl.NegateY) != 0)
|
||||
{
|
||||
UpdateSupportBufferViewportSize();
|
||||
}
|
||||
|
||||
_fsReadsFragCoord = true;
|
||||
UpdateSupportBufferViewportSize();
|
||||
}
|
||||
|
||||
if (_fsAlwaysDiscards != fragmentShaderInfo.HasUnconditionalDiscard)
|
||||
{
|
||||
_fsAlwaysDiscards = fragmentShaderInfo.HasUnconditionalDiscard;
|
||||
|
||||
if (!_fsAlwaysDiscards)
|
||||
{
|
||||
_channel.TextureManager.RefreshModifiedTextures();
|
||||
_channel.TextureManager.SignalRenderTargetsModifiable();
|
||||
}
|
||||
}
|
||||
_fsReadsFragCoord = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
_fsAlwaysDiscards = false;
|
||||
_fsReadsFragCoord = false;
|
||||
}
|
||||
|
||||
if (gs.VertexAsCompute != null)
|
||||
|
||||
@@ -1572,6 +1572,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
/// <param name="bound">True if the texture has been bound, false if it has been unbound</param>
|
||||
public void SignalModifying(bool bound)
|
||||
{
|
||||
if (bound)
|
||||
{
|
||||
_scaledSetScore = Math.Max(0, _scaledSetScore - 1);
|
||||
}
|
||||
|
||||
if (_modifiedStale || Group.HasCopyDependencies || Group.HasFlushBuffer)
|
||||
{
|
||||
_modifiedStale = false;
|
||||
@@ -1579,18 +1584,9 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
}
|
||||
|
||||
_physicalMemory.TextureCache.Lift(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Signals that a render target texture has been either bound or unbound.
|
||||
/// </summary>
|
||||
/// <param name="bound">True if the texture has been bound, false if it has been unbound</param>
|
||||
public void SignalBindingChange(bool bound)
|
||||
{
|
||||
if (bound)
|
||||
{
|
||||
_scaledSetScore = Math.Max(0, _scaledSetScore - 1);
|
||||
|
||||
IncrementReferenceCount();
|
||||
}
|
||||
else
|
||||
|
||||
@@ -4,7 +4,6 @@ using Ryujinx.Graphics.Gpu.Engine.Types;
|
||||
using Ryujinx.Graphics.Gpu.Memory;
|
||||
using Ryujinx.Graphics.Gpu.Shader;
|
||||
using Ryujinx.Graphics.Shader;
|
||||
using Ryujinx.Memory.Range;
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
@@ -68,9 +67,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
|
||||
private int _lastFragmentTotal;
|
||||
|
||||
private readonly int _bufferTextureAlignment;
|
||||
private readonly int _bufferImageAlignment;
|
||||
|
||||
/// <summary>
|
||||
/// Constructs a new instance of the texture bindings manager.
|
||||
/// </summary>
|
||||
@@ -112,10 +108,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
}
|
||||
|
||||
_textureCounts = [];
|
||||
|
||||
int alignment = context.Capabilities.TextureBufferOffsetAlignment;
|
||||
_bufferTextureAlignment = context.Capabilities.SupportsTextureBufferPixelAlignment ? 0 : alignment;
|
||||
_bufferImageAlignment = context.Capabilities.SupportsImageBufferPixelAlignment ? 0 : alignment;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -529,12 +521,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
|
||||
if (hostTexture != null && texture.Target == Target.TextureBuffer)
|
||||
{
|
||||
MultiRange range = GetAlignedBufferTextureRange(texture, index, stageIndex, false);
|
||||
|
||||
// Ensure that the buffer texture is using the correct buffer as storage.
|
||||
// Buffers are frequently re-created to accommodate larger data, so we need to re-bind
|
||||
// to ensure we're not using a old buffer that was already deleted.
|
||||
_channel.BufferManager.SetBufferTextureStorage(stage, hostTexture, range, bindingInfo, false);
|
||||
_channel.BufferManager.SetBufferTextureStorage(stage, hostTexture, texture.Range, bindingInfo, false);
|
||||
|
||||
// Cache is not used for buffer texture, it must always rebind.
|
||||
state.CachedTexture = null;
|
||||
@@ -669,9 +659,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
// Buffers are frequently re-created to accommodate larger data, so we need to re-bind
|
||||
// to ensure we're not using a old buffer that was already deleted.
|
||||
|
||||
MultiRange range = GetAlignedBufferTextureRange(texture, index, stageIndex, true);
|
||||
|
||||
_channel.BufferManager.SetBufferTextureStorage(stage, hostTexture, range, bindingInfo, true);
|
||||
_channel.BufferManager.SetBufferTextureStorage(stage, hostTexture, texture.Range, bindingInfo, true);
|
||||
|
||||
// Cache is not used for buffer texture, it must always rebind.
|
||||
state.CachedTexture = null;
|
||||
@@ -704,61 +692,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
return specStateMatches;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the aligned address of the texture according to the host requirements.
|
||||
/// </summary>
|
||||
/// <param name="texture">Texture to have its address aligned</param>
|
||||
/// <param name="index">Index of the texture in the shader</param>
|
||||
/// <param name="stageIndex">Index of the shader stage</param>
|
||||
/// <param name="isImage">True if the texture is bound as image, false for sampled textures</param>
|
||||
/// <returns>Aligned address and size of the buffer texture</returns>
|
||||
private MultiRange GetAlignedBufferTextureRange(Texture texture, int index, int stageIndex, bool isImage)
|
||||
{
|
||||
MultiRange range = texture.Range;
|
||||
int alignment = isImage ? _bufferImageAlignment : _bufferTextureAlignment;
|
||||
|
||||
if (alignment != 0)
|
||||
{
|
||||
MemoryRange firstRange = range.GetSubRange(0);
|
||||
ulong misalign = firstRange.Address & ((ulong)alignment - 1);
|
||||
int offset = misalign != 0 ? (int)misalign / texture.Info.FormatInfo.BytesPerPixel : 0;
|
||||
|
||||
if (misalign != 0)
|
||||
{
|
||||
firstRange = new MemoryRange(firstRange.Address - misalign, firstRange.Size + misalign);
|
||||
|
||||
if (range.Count > 1)
|
||||
{
|
||||
MemoryRange[] ranges = new MemoryRange[range.Count];
|
||||
|
||||
ranges[0] = firstRange;
|
||||
|
||||
for (int i = 1; i < range.Count; i++)
|
||||
{
|
||||
ranges[i] = range.GetSubRange(i);
|
||||
}
|
||||
|
||||
range = new MultiRange(ranges);
|
||||
}
|
||||
else
|
||||
{
|
||||
range = new MultiRange(firstRange.Address, firstRange.Size);
|
||||
}
|
||||
}
|
||||
|
||||
if (isImage)
|
||||
{
|
||||
_context.SupportBufferUpdater.UpdateBufferImageOffset(stageIndex, index, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
_context.SupportBufferUpdater.UpdateBufferTextureOffset(stageIndex, index, offset);
|
||||
}
|
||||
}
|
||||
|
||||
return range;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the texture descriptor for a given texture handle.
|
||||
/// </summary>
|
||||
|
||||
@@ -19,39 +19,12 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
private readonly TexturePoolCache _texturePoolCache;
|
||||
private readonly SamplerPoolCache _samplerPoolCache;
|
||||
|
||||
/// <summary>
|
||||
/// Bound render target texture modification report state.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
private enum BindState : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Render target texture has not been signalled for modification, and can't be modified on the next render operations.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// Render target texture has been signalled for modification.
|
||||
/// </summary>
|
||||
Bound = 1 << 0,
|
||||
|
||||
/// <summary>
|
||||
/// Render target texture might be modified on the next render operations.
|
||||
/// </summary>
|
||||
Modified = 1 << 1,
|
||||
|
||||
/// <summary>
|
||||
/// Render target texture has been signalled for modification and might be modified on the next render operations.
|
||||
/// </summary>
|
||||
BoundModified = Bound | Modified,
|
||||
}
|
||||
|
||||
private readonly Texture[] _rtColors;
|
||||
private readonly ITexture[] _rtHostColors;
|
||||
private readonly BindState[] _rtColorsBound;
|
||||
private readonly bool[] _rtColorsBound;
|
||||
private Texture _rtDepthStencil;
|
||||
private ITexture _rtHostDs;
|
||||
private BindState _rtDsBound;
|
||||
private bool _rtDsBound;
|
||||
|
||||
public int ClipRegionWidth { get; private set; }
|
||||
public int ClipRegionHeight { get; private set; }
|
||||
@@ -82,7 +55,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
|
||||
_rtColors = new Texture[Constants.TotalRenderTargets];
|
||||
_rtHostColors = new ITexture[Constants.TotalRenderTargets];
|
||||
_rtColorsBound = new BindState[Constants.TotalRenderTargets];
|
||||
_rtColorsBound = new bool[Constants.TotalRenderTargets];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -178,39 +151,27 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
/// </summary>
|
||||
/// <param name="index">The index of the color buffer to set (up to 8)</param>
|
||||
/// <param name="color">The color buffer texture</param>
|
||||
/// <param name="modified">Indicates if the following render operations will modidify <paramref name="color"/> contents</param>
|
||||
/// <returns>True if render target scale must be updated.</returns>
|
||||
public bool SetRenderTargetColor(int index, Texture color, bool modified)
|
||||
public bool SetRenderTargetColor(int index, Texture color)
|
||||
{
|
||||
bool hasValue = color != null;
|
||||
bool changesScale = (hasValue != (_rtColors[index] != null)) || (hasValue && RenderTargetScale != color.ScaleFactor);
|
||||
|
||||
if (_rtColors[index] != color)
|
||||
{
|
||||
Texture oldColor = _rtColors[index];
|
||||
|
||||
if (oldColor != null)
|
||||
if (_rtColorsBound[index])
|
||||
{
|
||||
if (_rtColorsBound[index].HasFlag(BindState.Bound))
|
||||
{
|
||||
oldColor.SignalModifying(false);
|
||||
}
|
||||
|
||||
oldColor.SignalBindingChange(false);
|
||||
_rtColors[index]?.SignalModifying(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_rtColorsBound[index] = true;
|
||||
}
|
||||
|
||||
_rtColorsBound[index] = modified ? BindState.BoundModified : BindState.None;
|
||||
|
||||
if (color != null)
|
||||
{
|
||||
color.SynchronizeMemory();
|
||||
|
||||
if (modified)
|
||||
{
|
||||
color.SignalModifying(true);
|
||||
}
|
||||
|
||||
color.SignalBindingChange(true);
|
||||
color.SignalModifying(true);
|
||||
}
|
||||
|
||||
_rtColors[index] = color;
|
||||
@@ -223,39 +184,27 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
/// Sets the render target depth-stencil buffer.
|
||||
/// </summary>
|
||||
/// <param name="depthStencil">The depth-stencil buffer texture</param>
|
||||
/// <param name="modified">Indicates if the following render operations will modidify <paramref name="depthStencil"/> contents</param>
|
||||
/// <returns>True if render target scale must be updated.</returns>
|
||||
public bool SetRenderTargetDepthStencil(Texture depthStencil, bool modified)
|
||||
public bool SetRenderTargetDepthStencil(Texture depthStencil)
|
||||
{
|
||||
bool hasValue = depthStencil != null;
|
||||
bool changesScale = (hasValue != (_rtDepthStencil != null)) || (hasValue && RenderTargetScale != depthStencil.ScaleFactor);
|
||||
|
||||
if (_rtDepthStencil != depthStencil)
|
||||
{
|
||||
Texture oldDepthStencil = _rtDepthStencil;
|
||||
|
||||
if (oldDepthStencil != null)
|
||||
if (_rtDsBound)
|
||||
{
|
||||
if (_rtDsBound.HasFlag(BindState.Bound))
|
||||
{
|
||||
oldDepthStencil.SignalModifying(false);
|
||||
}
|
||||
|
||||
oldDepthStencil.SignalBindingChange(false);
|
||||
_rtDepthStencil?.SignalModifying(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_rtDsBound = true;
|
||||
}
|
||||
|
||||
_rtDsBound = modified ? BindState.BoundModified : BindState.None;
|
||||
|
||||
if (depthStencil != null)
|
||||
{
|
||||
depthStencil.SynchronizeMemory();
|
||||
|
||||
if (modified)
|
||||
{
|
||||
depthStencil.SignalModifying(true);
|
||||
}
|
||||
|
||||
depthStencil.SignalBindingChange(true);
|
||||
depthStencil.SignalModifying(true);
|
||||
}
|
||||
|
||||
_rtDepthStencil = depthStencil;
|
||||
@@ -494,10 +443,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
{
|
||||
hostDsTexture = dsTexture.HostTexture;
|
||||
|
||||
if (_rtDsBound == BindState.Modified)
|
||||
if (!_rtDsBound)
|
||||
{
|
||||
dsTexture.SignalModifying(true);
|
||||
_rtDsBound |= BindState.Bound;
|
||||
_rtDsBound = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -521,10 +470,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
{
|
||||
hostTexture = texture.HostTexture;
|
||||
|
||||
if (_rtColorsBound[index] == BindState.Modified)
|
||||
if (!_rtColorsBound[index])
|
||||
{
|
||||
texture.SignalModifying(true);
|
||||
_rtColorsBound[index] |= BindState.Bound;
|
||||
_rtColorsBound[index] = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -569,37 +518,24 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
{
|
||||
Texture dsTexture = _rtDepthStencil;
|
||||
|
||||
if (dsTexture != null && _rtDsBound.HasFlag(BindState.Bound))
|
||||
if (dsTexture != null && _rtDsBound)
|
||||
{
|
||||
dsTexture.SignalModifying(false);
|
||||
_rtDsBound &= ~BindState.Bound;
|
||||
_rtDsBound = false;
|
||||
}
|
||||
|
||||
for (int index = 0; index < _rtColors.Length; index++)
|
||||
{
|
||||
Texture texture = _rtColors[index];
|
||||
|
||||
if (texture != null && _rtColorsBound[index].HasFlag(BindState.Bound))
|
||||
if (texture != null && _rtColorsBound[index])
|
||||
{
|
||||
texture.SignalModifying(false);
|
||||
_rtColorsBound[index] &= ~BindState.Bound;
|
||||
_rtColorsBound[index] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the currently bound render targets might be modified, if they are used on the next render operation.
|
||||
/// </summary>
|
||||
public void SignalRenderTargetsModifiable()
|
||||
{
|
||||
_rtDsBound |= BindState.Modified;
|
||||
|
||||
for (int index = 0; index < _rtColorsBound.Length; index++)
|
||||
{
|
||||
_rtColorsBound[index] |= BindState.Modified;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Forces the texture and sampler pools to be re-loaded from the cache on next use.
|
||||
/// </summary>
|
||||
@@ -636,11 +572,19 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||
|
||||
for (int i = 0; i < _rtColors.Length; i++)
|
||||
{
|
||||
_rtColors[i]?.DecrementReferenceCount();
|
||||
if (_rtColorsBound[i])
|
||||
{
|
||||
_rtColors[i]?.DecrementReferenceCount();
|
||||
}
|
||||
|
||||
_rtColors[i] = null;
|
||||
}
|
||||
|
||||
_rtDepthStencil?.DecrementReferenceCount();
|
||||
if (_rtDsBound)
|
||||
{
|
||||
_rtDepthStencil?.DecrementReferenceCount();
|
||||
}
|
||||
|
||||
_rtDepthStencil = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,38 +129,6 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the offset used for accessing buffer textures that are not aligned to the host requirements.
|
||||
/// </summary>
|
||||
/// <param name="stageIndex">Index of the shader stage where the texture is used</param>
|
||||
/// <param name="bindingIndex">Index of the texture binding in the shader</param>
|
||||
/// <param name="offset">Offset for the misaligned part of the address</param>
|
||||
public void UpdateBufferTextureOffset(int stageIndex, int bindingIndex, int offset)
|
||||
{
|
||||
if (_data.BufferTextureOffset[stageIndex][bindingIndex].X != offset)
|
||||
{
|
||||
_data.BufferTextureOffset[stageIndex][bindingIndex].X = offset;
|
||||
int index = stageIndex * SupportBuffer.TextureCount + bindingIndex;
|
||||
MarkDirty(SupportBuffer.BufferTextureOffsetOffset + index * sizeof(int) * 4, sizeof(int));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the offset used for accessing buffer images that are not aligned to the host requirements.
|
||||
/// </summary>
|
||||
/// <param name="stageIndex">Index of the shader stage where the image is used</param>
|
||||
/// <param name="bindingIndex">Index of the image binding in the shader</param>
|
||||
/// <param name="offset">Offset for the misaligned part of the address</param>
|
||||
public void UpdateBufferImageOffset(int stageIndex, int bindingIndex, int offset)
|
||||
{
|
||||
if (_data.BufferTextureOffset[stageIndex][bindingIndex].Y != offset)
|
||||
{
|
||||
_data.BufferTextureOffset[stageIndex][bindingIndex].Y = offset;
|
||||
int index = stageIndex * SupportBuffer.TextureCount + bindingIndex;
|
||||
MarkDirty(SupportBuffer.BufferTextureOffsetOffset + index * sizeof(int) * 4 + sizeof(int), sizeof(int));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets whether the format of a given render target is a BGRA format.
|
||||
/// </summary>
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||
private const ushort FileFormatVersionMajor = 1;
|
||||
private const ushort FileFormatVersionMinor = 2;
|
||||
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
||||
private const uint CodeGenVersion = 6371;
|
||||
private const uint CodeGenVersion = 7354;
|
||||
|
||||
private const string SharedTocFileName = "shared.toc";
|
||||
private const string SharedDataFileName = "shared.data";
|
||||
@@ -170,11 +170,6 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||
/// </summary>
|
||||
public bool UsesRtLayer;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the fragment shader always discards the fragment, not producing any output for the bound render targets.
|
||||
/// </summary>
|
||||
public bool HasUnconditionalDiscard;
|
||||
|
||||
/// <summary>
|
||||
/// Bit mask with the clip distances written on the vertex stage.
|
||||
/// </summary>
|
||||
@@ -811,7 +806,6 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||
dataInfo.UsesInstanceId,
|
||||
dataInfo.UsesDrawParameters,
|
||||
dataInfo.UsesRtLayer,
|
||||
dataInfo.HasUnconditionalDiscard,
|
||||
dataInfo.ClipDistancesWritten,
|
||||
dataInfo.FragmentOutputMap);
|
||||
}
|
||||
@@ -842,7 +836,6 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||
UsesInstanceId = info.UsesInstanceId,
|
||||
UsesDrawParameters = info.UsesDrawParameters,
|
||||
UsesRtLayer = info.UsesRtLayer,
|
||||
HasUnconditionalDiscard = info.HasUnconditionalDiscard,
|
||||
ClipDistancesWritten = info.ClipDistancesWritten,
|
||||
FragmentOutputMap = info.FragmentOutputMap,
|
||||
};
|
||||
|
||||
@@ -207,10 +207,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
|
||||
public bool QueryHostSupportsBgraFormat() => _context.Capabilities.SupportsBgraFormat;
|
||||
|
||||
public bool QueryHostSupportsBufferImagePixelAlignment() => _context.Capabilities.SupportsImageBufferPixelAlignment;
|
||||
|
||||
public bool QueryHostSupportsBufferTexturePixelAlignment() => _context.Capabilities.SupportsTextureBufferPixelAlignment;
|
||||
|
||||
public bool QueryHostSupportsFragmentShaderInterlock() => _context.Capabilities.SupportsFragmentShaderInterlock;
|
||||
|
||||
public bool QueryHostSupportsFragmentShaderOrderingIntel() => _context.Capabilities.SupportsFragmentShaderOrderingIntel;
|
||||
|
||||
@@ -430,8 +430,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
|
||||
TranslatorContext lastInVertexPipeline = geometryToCompute ? translatorContexts[4] ?? currentStage : currentStage;
|
||||
|
||||
(program, ShaderProgramInfo vacInfo) = lastInVertexPipeline.GenerateVertexPassthroughForCompute();
|
||||
infoBuilder.AddStageInfoVac(vacInfo);
|
||||
program = lastInVertexPipeline.GenerateVertexPassthroughForCompute();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -536,7 +535,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
private ShaderAsCompute CreateHostVertexAsComputeProgram(ShaderProgram program, TranslatorContext context, bool tfEnabled)
|
||||
{
|
||||
ShaderSource source = new(program.Code, program.BinaryCode, ShaderStage.Compute, program.Language);
|
||||
ShaderInfo info = ShaderInfoBuilder.BuildForVertexAsCompute(_context, program.Info, context.GetVertexAsComputeInfo(), tfEnabled);
|
||||
ShaderInfo info = ShaderInfoBuilder.BuildForVertexAsCompute(_context, program.Info, tfEnabled);
|
||||
|
||||
return new(_context.Renderer.CreateProgram([source], info), program.Info, context.GetResourceReservations());
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
private void PopulateDescriptorAndUsages(ResourceStages stages, ResourceType type, int setIndex, int start, int count, bool write = false)
|
||||
{
|
||||
AddDescriptor(stages, type, setIndex, start, count);
|
||||
// AddUsage(stages, type, setIndex, start, count, write);
|
||||
AddUsage(stages, type, setIndex, start, count, write);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -159,25 +159,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
AddUsage(info.Images, stages, isImage: true);
|
||||
}
|
||||
|
||||
public void AddStageInfoVac(ShaderProgramInfo info)
|
||||
{
|
||||
ResourceStages stages = info.Stage switch
|
||||
{
|
||||
ShaderStage.Compute => ResourceStages.Compute,
|
||||
ShaderStage.Vertex => ResourceStages.Vertex,
|
||||
ShaderStage.TessellationControl => ResourceStages.TessellationControl,
|
||||
ShaderStage.TessellationEvaluation => ResourceStages.TessellationEvaluation,
|
||||
ShaderStage.Geometry => ResourceStages.Geometry,
|
||||
ShaderStage.Fragment => ResourceStages.Fragment,
|
||||
_ => ResourceStages.None,
|
||||
};
|
||||
|
||||
AddUsage(info.CBuffers, stages, isStorage: false);
|
||||
AddUsage(info.SBuffers, stages, isStorage: true);
|
||||
AddUsage(info.Textures, stages, isImage: false);
|
||||
AddUsage(info.Images, stages, isImage: true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a resource descriptor to the list of descriptors.
|
||||
/// </summary>
|
||||
@@ -441,11 +422,10 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||
/// <param name="tfEnabled">Indicates if the graphics shader is used with transform feedback enabled</param>
|
||||
/// <param name="fromCache">True if the compute shader comes from a disk cache, false otherwise</param>
|
||||
/// <returns>Shader information</returns>
|
||||
public static ShaderInfo BuildForVertexAsCompute(GpuContext context, ShaderProgramInfo info, ShaderProgramInfo info2, bool tfEnabled, bool fromCache = false)
|
||||
public static ShaderInfo BuildForVertexAsCompute(GpuContext context, ShaderProgramInfo info, bool tfEnabled, bool fromCache = false)
|
||||
{
|
||||
ShaderInfoBuilder builder = new(context, tfEnabled, vertexAsCompute: true);
|
||||
|
||||
builder.AddStageInfoVac(info2);
|
||||
builder.AddStageInfo(info, vertexAsCompute: true);
|
||||
|
||||
return builder.Build(null, fromCache);
|
||||
|
||||
@@ -174,7 +174,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
supportsGeometryShader: true,
|
||||
supportsGeometryShaderPassthrough: HwCapabilities.SupportsGeometryShaderPassthrough,
|
||||
supportsTransformFeedback: true,
|
||||
supportsImageBufferPixelAlignment: false,
|
||||
supportsImageLoadFormatted: HwCapabilities.SupportsImageLoadFormatted,
|
||||
supportsLayerVertexTessellation: HwCapabilities.SupportsShaderViewportLayerArray,
|
||||
supportsMismatchingViewFormat: HwCapabilities.SupportsMismatchingViewFormat,
|
||||
@@ -186,7 +185,6 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
supportsShaderBarrierDivergence: !(intelWindows || intelUnix),
|
||||
supportsShaderFloat64: true,
|
||||
supportsShaderNonUniformIndexing: false,
|
||||
supportsTextureBufferPixelAlignment: false,
|
||||
supportsTextureGatherOffsets: true,
|
||||
supportsTextureShadowLod: HwCapabilities.SupportsTextureShadowLod,
|
||||
supportsVertexStoreAndAtomics: true,
|
||||
|
||||
@@ -522,7 +522,6 @@ namespace Ryujinx.Graphics.Shader.Decoders
|
||||
|
||||
enum PMode
|
||||
{
|
||||
Idx = 0,
|
||||
F4e = 1,
|
||||
B4e = 2,
|
||||
Rc8 = 3,
|
||||
|
||||
@@ -234,24 +234,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries host support for buffer image access with the buffer offset aligned to a single pixel rather than a fixed alignment.
|
||||
/// </summary>
|
||||
/// <returns>True if the host supports buffer image access with pixel alignment, false otherwise</returns>
|
||||
bool QueryHostSupportsBufferImagePixelAlignment()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries host support for buffer texture access with the buffer offset aligned to a single pixel rather than a fixed alignment.
|
||||
/// </summary>
|
||||
/// <returns>True if the host supports buffer texture access with pixel alignment, false otherwise</returns>
|
||||
bool QueryHostSupportsBufferTexturePixelAlignment()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries host support for fragment shader ordering critical sections on the shader code.
|
||||
/// </summary>
|
||||
|
||||
@@ -215,6 +215,34 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction Pret is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtR(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtR>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtR is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtI(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtI>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtI is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtC(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtC>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtC is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtRc(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtRc>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtRc is not implemented.");
|
||||
}
|
||||
|
||||
public static void R2b(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstR2b>();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using Ryujinx.Graphics.Shader.Decoders;
|
||||
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
||||
using Ryujinx.Graphics.Shader.Translation;
|
||||
using System;
|
||||
|
||||
using static Ryujinx.Graphics.Shader.Instructions.InstEmitHelper;
|
||||
using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
|
||||
|
||||
@@ -37,38 +37,6 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||
context.Copy(GetDest(op.Dest), GetSrcImm(context, op.Imm32));
|
||||
}
|
||||
|
||||
public static void PrmtR(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtR>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtR is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtI(EmitterContext context)
|
||||
{
|
||||
InstPrmtI op = context.GetOp<InstPrmtI>();
|
||||
|
||||
Operand op1 = GetSrcReg(context, op.SrcA);
|
||||
Operand control = GetSrcImm(context, op.Imm20);
|
||||
Operand op2 = GetSrcReg(context, op.SrcC);
|
||||
|
||||
EmitPrmt(context, op1, control, op2, op.PMode, op.Dest);
|
||||
}
|
||||
|
||||
public static void PrmtC(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtC>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtC is not implemented.");
|
||||
}
|
||||
|
||||
public static void PrmtRc(EmitterContext context)
|
||||
{
|
||||
context.GetOp<InstPrmtRc>();
|
||||
|
||||
context.TranslatorContext.GpuAccessor.Log("Shader instruction PrmtRc is not implemented.");
|
||||
}
|
||||
|
||||
public static void R2pR(EmitterContext context)
|
||||
{
|
||||
InstR2pR op = context.GetOp<InstR2pR>();
|
||||
@@ -201,39 +169,6 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||
context.Copy(GetDest(op.Dest), src);
|
||||
}
|
||||
|
||||
public static void SelR(EmitterContext context)
|
||||
{
|
||||
InstSelR op = context.GetOp<InstSelR>();
|
||||
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcReg(context, op.SrcB);
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
public static void SelI(EmitterContext context)
|
||||
{
|
||||
InstSelI op = context.GetOp<InstSelI>();
|
||||
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20));
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
public static void SelC(EmitterContext context)
|
||||
{
|
||||
InstSelC op = context.GetOp<InstSelC>();
|
||||
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset);
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
private static Operand EmitLoadSubgroupLaneId(EmitterContext context)
|
||||
{
|
||||
if (context.TranslatorContext.GpuAccessor.QueryHostSubgroupSize() <= 32)
|
||||
@@ -280,34 +215,37 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||
}
|
||||
}
|
||||
|
||||
private static void EmitPrmt(EmitterContext context, Operand op1, Operand control, Operand op2, PMode pMode, int rd)
|
||||
public static void SelR(EmitterContext context)
|
||||
{
|
||||
if (pMode == PMode.Idx)
|
||||
{
|
||||
Operand res = Const(0);
|
||||
InstSelR op = context.GetOp<InstSelR>();
|
||||
|
||||
for (int b = 0; b < 4; b++)
|
||||
{
|
||||
Operand sel = context.ShiftRightU32(control, Const(b * 4));
|
||||
Operand byteSel = context.BitwiseAnd(sel, Const(7));
|
||||
Operand copySign = context.BitwiseAnd(sel, Const(8));
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcReg(context, op.SrcB);
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
Operand srcOp = context.ConditionalSelect(context.BitwiseAnd(byteSel, Const(4)), op2, op1);
|
||||
Operand srcValue = context.ShiftRightU32(srcOp, context.ShiftLeft(context.BitwiseAnd(byteSel, Const(3)), Const(3)));
|
||||
Operand srcSign = context.ShiftRightS32(context.ShiftLeft(srcValue, Const(24)), Const(31));
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
srcValue = context.ConditionalSelect(copySign, srcSign, srcValue);
|
||||
srcValue = context.BitwiseAnd(srcValue, Const(0xff));
|
||||
public static void SelI(EmitterContext context)
|
||||
{
|
||||
InstSelI op = context.GetOp<InstSelI>();
|
||||
|
||||
res = context.BitfieldInsert(res, srcValue, Const(b * 8), Const(8));
|
||||
}
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20));
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
context.Copy(GetDest(rd), res);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException(pMode.ToString());
|
||||
}
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
public static void SelC(EmitterContext context)
|
||||
{
|
||||
InstSelC op = context.GetOp<InstSelC>();
|
||||
|
||||
Operand srcA = GetSrcReg(context, op.SrcA);
|
||||
Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset);
|
||||
Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
|
||||
|
||||
EmitSel(context, srcA, srcB, srcPred, op.Dest);
|
||||
}
|
||||
|
||||
private static void EmitR2p(EmitterContext context, Operand value, Operand mask, ByteSel byteSel, bool ccpr)
|
||||
|
||||
@@ -23,7 +23,6 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
|
||||
set => _branch = AddSuccessor(_branch, value);
|
||||
}
|
||||
|
||||
public bool HasSuccessor => _branch != null || _next != null;
|
||||
public bool HasBranch => _branch != null;
|
||||
public bool Reachable => Index == 0 || Predecessors.Count != 0;
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
public bool UsesInstanceId { get; }
|
||||
public bool UsesDrawParameters { get; }
|
||||
public bool UsesRtLayer { get; }
|
||||
public bool HasUnconditionalDiscard { get; }
|
||||
public byte ClipDistancesWritten { get; }
|
||||
public int FragmentOutputMap { get; }
|
||||
|
||||
@@ -35,7 +34,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
bool usesInstanceId,
|
||||
bool usesDrawParameters,
|
||||
bool usesRtLayer,
|
||||
bool hasUnconditionalDiscard,
|
||||
byte clipDistancesWritten,
|
||||
int fragmentOutputMap)
|
||||
{
|
||||
@@ -52,7 +50,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
UsesInstanceId = usesInstanceId;
|
||||
UsesDrawParameters = usesDrawParameters;
|
||||
UsesRtLayer = usesRtLayer;
|
||||
HasUnconditionalDiscard = hasUnconditionalDiscard;
|
||||
ClipDistancesWritten = clipDistancesWritten;
|
||||
FragmentOutputMap = fragmentOutputMap;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
RenderScale,
|
||||
TfeOffset,
|
||||
TfeVertexCount,
|
||||
BufferTextureOffset,
|
||||
}
|
||||
|
||||
public struct SupportBuffer
|
||||
@@ -43,13 +42,10 @@ namespace Ryujinx.Graphics.Shader
|
||||
public static readonly int ComputeRenderScaleOffset;
|
||||
public static readonly int TfeOffsetOffset;
|
||||
public static readonly int TfeVertexCountOffset;
|
||||
public static readonly int BufferTextureOffsetOffset;
|
||||
|
||||
public const int FragmentIsBgraCount = 8;
|
||||
public const int TextureCount = 64;
|
||||
|
||||
// One for the render target, 64 for the textures, and 8 for the images.
|
||||
public const int RenderScaleMaxCount = 1 + TextureCount + 8;
|
||||
public const int RenderScaleMaxCount = 1 + 64 + 8;
|
||||
|
||||
private static int OffsetOf<T>(ref SupportBuffer storage, ref T target)
|
||||
{
|
||||
@@ -72,7 +68,6 @@ namespace Ryujinx.Graphics.Shader
|
||||
ComputeRenderScaleOffset = GraphicsRenderScaleOffset + FieldSize;
|
||||
TfeOffsetOffset = OffsetOf(ref instance, ref instance.TfeOffset);
|
||||
TfeVertexCountOffset = OffsetOf(ref instance, ref instance.TfeVertexCount);
|
||||
BufferTextureOffsetOffset = OffsetOf(ref instance, ref instance.BufferTextureOffset);
|
||||
}
|
||||
|
||||
internal static StructureType GetStructureType()
|
||||
@@ -85,8 +80,7 @@ namespace Ryujinx.Graphics.Shader
|
||||
new StructureField(AggregateType.S32, "frag_scale_count"),
|
||||
new StructureField(AggregateType.Array | AggregateType.FP32, "render_scale", RenderScaleMaxCount),
|
||||
new StructureField(AggregateType.Vector4 | AggregateType.S32, "tfe_offset"),
|
||||
new StructureField(AggregateType.S32, "tfe_vertex_count"),
|
||||
new StructureField(AggregateType.Array | AggregateType.Vector2 | AggregateType.S32, "buffer_texture_offset")
|
||||
new StructureField(AggregateType.S32, "tfe_vertex_count")
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -101,7 +95,5 @@ namespace Ryujinx.Graphics.Shader
|
||||
|
||||
public Vector4<int> TfeOffset;
|
||||
public Vector4<int> TfeVertexCount;
|
||||
|
||||
public Array5<Array64<Vector4<int>>> BufferTextureOffset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,5 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
SharedMemory = 1 << 11,
|
||||
Store = 1 << 12,
|
||||
VtgAsCompute = 1 << 13,
|
||||
UnconditionalDiscard = 1 << 14,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
||||
|
||||
namespace Ryujinx.Graphics.Shader.Translation
|
||||
{
|
||||
static class FeatureIdentification
|
||||
{
|
||||
public static void RunPass(BasicBlock[] blocks, ShaderStage stage, ref FeatureFlags usedFeatures)
|
||||
{
|
||||
if (stage == ShaderStage.Fragment)
|
||||
{
|
||||
bool endsWithDiscardOnly = true;
|
||||
|
||||
for (int blockIndex = 0; blockIndex < blocks.Length; blockIndex++)
|
||||
{
|
||||
BasicBlock block = blocks[blockIndex];
|
||||
|
||||
if (block.HasSuccessor)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (block.Operations.Count == 0 ||
|
||||
block.Operations.Last.Value is not Operation operation ||
|
||||
operation.Inst != Instruction.Discard)
|
||||
{
|
||||
endsWithDiscardOnly = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (endsWithDiscardOnly)
|
||||
{
|
||||
usedFeatures |= FeatureFlags.UnconditionalDiscard;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,11 +43,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
private readonly Dictionary<TextureInfo, TextureMeta> _usedTextures;
|
||||
private readonly Dictionary<TextureInfo, TextureMeta> _usedImages;
|
||||
|
||||
private readonly List<BufferDefinition> _vacConstantBuffers;
|
||||
private readonly List<BufferDefinition> _vacStorageBuffers;
|
||||
private readonly List<TextureDefinition> _vacTextures;
|
||||
private readonly List<TextureDefinition> _vacImages;
|
||||
|
||||
public int LocalMemoryId { get; private set; }
|
||||
public int SharedMemoryId { get; private set; }
|
||||
|
||||
@@ -83,11 +78,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
_usedTextures = new();
|
||||
_usedImages = new();
|
||||
|
||||
_vacConstantBuffers = new();
|
||||
_vacStorageBuffers = new();
|
||||
_vacTextures = new();
|
||||
_vacImages = new();
|
||||
|
||||
Properties.AddOrUpdateConstantBuffer(new(BufferLayout.Std140, 0, SupportBuffer.Binding, "support_buffer", SupportBuffer.GetStructureType()));
|
||||
|
||||
LocalMemoryId = -1;
|
||||
@@ -573,76 +563,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
return descriptors.ToArray();
|
||||
}
|
||||
|
||||
public ShaderProgramInfo GetVertexAsComputeInfo(bool isVertex = false)
|
||||
{
|
||||
var cbDescriptors = new BufferDescriptor[_vacConstantBuffers.Count];
|
||||
int cbDescriptorIndex = 0;
|
||||
|
||||
foreach (BufferDefinition definition in _vacConstantBuffers)
|
||||
{
|
||||
cbDescriptors[cbDescriptorIndex++] = new BufferDescriptor(definition.Set, definition.Binding, 0, 0, 0, BufferUsageFlags.None);
|
||||
}
|
||||
|
||||
var sbDescriptors = new BufferDescriptor[_vacStorageBuffers.Count];
|
||||
int sbDescriptorIndex = 0;
|
||||
|
||||
foreach (BufferDefinition definition in _vacStorageBuffers)
|
||||
{
|
||||
sbDescriptors[sbDescriptorIndex++] = new BufferDescriptor(definition.Set, definition.Binding, 0, 0, 0, BufferUsageFlags.Write);
|
||||
}
|
||||
|
||||
var tDescriptors = new TextureDescriptor[_vacTextures.Count];
|
||||
int tDescriptorIndex = 0;
|
||||
|
||||
foreach (TextureDefinition definition in _vacTextures)
|
||||
{
|
||||
tDescriptors[tDescriptorIndex++] = new TextureDescriptor(
|
||||
definition.Set,
|
||||
definition.Binding,
|
||||
definition.Type,
|
||||
definition.Format,
|
||||
0,
|
||||
0,
|
||||
definition.ArrayLength,
|
||||
definition.Separate,
|
||||
definition.Flags);
|
||||
}
|
||||
|
||||
var iDescriptors = new TextureDescriptor[_vacImages.Count];
|
||||
int iDescriptorIndex = 0;
|
||||
|
||||
foreach (TextureDefinition definition in _vacImages)
|
||||
{
|
||||
iDescriptors[iDescriptorIndex++] = new TextureDescriptor(
|
||||
definition.Set,
|
||||
definition.Binding,
|
||||
definition.Type,
|
||||
definition.Format,
|
||||
0,
|
||||
0,
|
||||
definition.ArrayLength,
|
||||
definition.Separate,
|
||||
definition.Flags);
|
||||
}
|
||||
|
||||
return new ShaderProgramInfo(
|
||||
cbDescriptors,
|
||||
sbDescriptors,
|
||||
tDescriptors,
|
||||
iDescriptors,
|
||||
isVertex ? ShaderStage.Vertex : ShaderStage.Compute,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
public bool TryGetCbufSlotAndHandleForTexture(int binding, out int cbufSlot, out int handle)
|
||||
{
|
||||
foreach ((TextureInfo info, TextureMeta meta) in _usedTextures)
|
||||
@@ -707,30 +627,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
Properties.AddOrUpdateStorageBuffer(new(BufferLayout.Std430, setIndex, binding, name, type));
|
||||
}
|
||||
|
||||
public void AddVertexAsComputeConstantBuffer(BufferDefinition definition)
|
||||
{
|
||||
_vacConstantBuffers.Add(definition);
|
||||
Properties.AddOrUpdateConstantBuffer(definition);
|
||||
}
|
||||
|
||||
public void AddVertexAsComputeStorageBuffer(BufferDefinition definition)
|
||||
{
|
||||
_vacStorageBuffers.Add(definition);
|
||||
Properties.AddOrUpdateStorageBuffer(definition);
|
||||
}
|
||||
|
||||
public void AddVertexAsComputeTexture(TextureDefinition definition)
|
||||
{
|
||||
_vacTextures.Add(definition);
|
||||
Properties.AddOrUpdateTexture(definition);
|
||||
}
|
||||
|
||||
public void AddVertexAsComputeImage(TextureDefinition definition)
|
||||
{
|
||||
_vacImages.Add(definition);
|
||||
Properties.AddOrUpdateImage(definition);
|
||||
}
|
||||
|
||||
public static string GetShaderStagePrefix(ShaderStage stage)
|
||||
{
|
||||
uint index = (uint)stage;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
||||
using Ryujinx.Graphics.Shader.Translation.Optimizations;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
|
||||
@@ -28,19 +27,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms
|
||||
|
||||
if (texOp.Type == SamplerType.TextureBuffer && !context.GpuAccessor.QueryHostSupportsSnormBufferTextureFormat())
|
||||
{
|
||||
if (!context.GpuAccessor.QueryHostSupportsSnormBufferTextureFormat())
|
||||
{
|
||||
node = InsertSnormNormalization(node, context.ResourceManager, context.GpuAccessor);
|
||||
}
|
||||
|
||||
if (!context.GpuAccessor.QueryHostSupportsBufferTexturePixelAlignment())
|
||||
{
|
||||
node = InsertCoordOffset(node, context.ResourceManager, context.Stage, isImage: false);
|
||||
}
|
||||
}
|
||||
else if (!context.GpuAccessor.QueryHostSupportsBufferTexturePixelAlignment() && texOp.Inst.IsImage())
|
||||
{
|
||||
node = InsertCoordOffset(node, context.ResourceManager, context.Stage, isImage: true);
|
||||
node = InsertSnormNormalization(node, context.ResourceManager, context.GpuAccessor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -291,87 +278,6 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms
|
||||
return node;
|
||||
}
|
||||
|
||||
private static LinkedListNode<INode> InsertCoordOffset(LinkedListNode<INode> node, ResourceManager resourceManager, ShaderStage stage, bool isImage)
|
||||
{
|
||||
// Some GPUs have fixed alignment requirements for buffer textures.
|
||||
// For those cases, we bind the aligned buffer offset, and apply the remaining offset on the shader.
|
||||
|
||||
TextureOperation texOp = (TextureOperation)node.Value;
|
||||
|
||||
if ((texOp.Type & SamplerType.Mask) != SamplerType.TextureBuffer)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
|
||||
Operand[] sources = new Operand[texOp.SourcesCount];
|
||||
|
||||
for (int i = 0; i < texOp.SourcesCount; i++)
|
||||
{
|
||||
sources[i] = texOp.GetSource(i);
|
||||
}
|
||||
|
||||
bool isBindless = (texOp.Flags & TextureFlags.Bindless) != 0;
|
||||
bool isIndexed = resourceManager.IsArrayOfTexturesOrImages(texOp.Binding, isImage);
|
||||
|
||||
int coordsIndex = isBindless || isIndexed ? 1 : 0;
|
||||
|
||||
Operand[] dests = new Operand[texOp.DestsCount];
|
||||
|
||||
for (int i = 0; i < texOp.DestsCount; i++)
|
||||
{
|
||||
dests[i] = texOp.GetDest(i);
|
||||
}
|
||||
|
||||
LinkedListNode<INode> oldNode = node;
|
||||
|
||||
Operand source = sources[coordsIndex];
|
||||
Operand offset = Local();
|
||||
Operand coordPlusOffset = Local();
|
||||
|
||||
int stageIndex = stage switch
|
||||
{
|
||||
ShaderStage.TessellationControl => 1,
|
||||
ShaderStage.TessellationEvaluation => 2,
|
||||
ShaderStage.Geometry => 3,
|
||||
ShaderStage.Fragment => 4,
|
||||
_ => 0,
|
||||
};
|
||||
|
||||
int bindingIndex = isImage
|
||||
? resourceManager.FindImageDescriptorIndex(texOp.Binding)
|
||||
: resourceManager.FindTextureDescriptorIndex(texOp.Binding);
|
||||
|
||||
node.List.AddBefore(node, new Operation(
|
||||
Instruction.Load,
|
||||
StorageKind.ConstantBuffer,
|
||||
offset,
|
||||
Const(SupportBuffer.Binding),
|
||||
Const((int)SupportBufferField.BufferTextureOffset),
|
||||
Const(stageIndex * SupportBuffer.TextureCount + bindingIndex),
|
||||
Const(isImage ? 1 : 0)));
|
||||
|
||||
node.List.AddBefore(node, new Operation(Instruction.Add, coordPlusOffset, source, offset));
|
||||
|
||||
sources[coordsIndex] = coordPlusOffset;
|
||||
|
||||
TextureOperation newTexOp = new(
|
||||
texOp.Inst,
|
||||
texOp.Type,
|
||||
texOp.Format,
|
||||
texOp.Flags,
|
||||
texOp.Set,
|
||||
texOp.Binding,
|
||||
texOp.Index,
|
||||
dests,
|
||||
sources);
|
||||
|
||||
node = node.List.AddBefore(node, newTexOp);
|
||||
|
||||
Utils.DeleteNode(oldNode, texOp);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
private static LinkedListNode<INode> InsertConstOffsets(LinkedListNode<INode> node, ResourceManager resourceManager, IGpuAccessor gpuAccessor, ShaderStage stage)
|
||||
{
|
||||
// Non-constant texture offsets are not allowed (according to the spec),
|
||||
|
||||
@@ -301,11 +301,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
|
||||
Optimizer.RunPass(context);
|
||||
TransformPasses.RunPass(context);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
FeatureIdentification.RunPass(cfg.Blocks, Definitions.Stage, ref usedFeatures);
|
||||
}
|
||||
}
|
||||
|
||||
funcs[i] = new Function(cfg.Blocks, $"fun{i}", false, inArgumentsCount, outArgumentsCount);
|
||||
@@ -358,7 +353,6 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
usedFeatures.HasFlag(FeatureFlags.InstanceId),
|
||||
usedFeatures.HasFlag(FeatureFlags.DrawParameters),
|
||||
usedFeatures.HasFlag(FeatureFlags.RtLayer),
|
||||
usedFeatures.HasFlag(FeatureFlags.UnconditionalDiscard),
|
||||
clipDistancesWritten,
|
||||
originalDefinitions.OmapTargets);
|
||||
|
||||
@@ -399,7 +393,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
{
|
||||
int binding = resourceManager.Reservations.GetTfeBufferStorageBufferBinding(i);
|
||||
BufferDefinition tfeDataBuffer = new(BufferLayout.Std430, 1, binding, $"tfe_data{i}", tfeDataStruct);
|
||||
resourceManager.AddVertexAsComputeStorageBuffer(tfeDataBuffer);
|
||||
resourceManager.Properties.AddOrUpdateStorageBuffer(tfeDataBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -407,7 +401,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
{
|
||||
int vertexInfoCbBinding = resourceManager.Reservations.VertexInfoConstantBufferBinding;
|
||||
BufferDefinition vertexInfoBuffer = new(BufferLayout.Std140, 0, vertexInfoCbBinding, "vb_info", VertexInfoBuffer.GetStructureType());
|
||||
resourceManager.AddVertexAsComputeConstantBuffer(vertexInfoBuffer);
|
||||
resourceManager.Properties.AddOrUpdateConstantBuffer(vertexInfoBuffer);
|
||||
|
||||
StructureType vertexOutputStruct = new([
|
||||
new StructureField(AggregateType.Array | AggregateType.FP32, "data", 0)
|
||||
@@ -415,13 +409,13 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
|
||||
int vertexOutputSbBinding = resourceManager.Reservations.VertexOutputStorageBufferBinding;
|
||||
BufferDefinition vertexOutputBuffer = new(BufferLayout.Std430, 1, vertexOutputSbBinding, "vertex_output", vertexOutputStruct);
|
||||
resourceManager.AddVertexAsComputeStorageBuffer(vertexOutputBuffer);
|
||||
resourceManager.Properties.AddOrUpdateStorageBuffer(vertexOutputBuffer);
|
||||
|
||||
if (Stage == ShaderStage.Vertex)
|
||||
{
|
||||
SetBindingPair ibSetAndBinding = resourceManager.Reservations.GetIndexBufferTextureSetAndBinding();
|
||||
TextureDefinition indexBuffer = new(ibSetAndBinding.SetIndex, ibSetAndBinding.Binding, "ib_data", SamplerType.TextureBuffer);
|
||||
resourceManager.AddVertexAsComputeTexture(indexBuffer);
|
||||
resourceManager.Properties.AddOrUpdateTexture(indexBuffer);
|
||||
|
||||
int inputMap = _program.AttributeUsage.UsedInputAttributes;
|
||||
|
||||
@@ -430,7 +424,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
int location = BitOperations.TrailingZeroCount(inputMap);
|
||||
SetBindingPair setAndBinding = resourceManager.Reservations.GetVertexBufferTextureSetAndBinding(location);
|
||||
TextureDefinition vaBuffer = new(setAndBinding.SetIndex, setAndBinding.Binding, $"vb_data{location}", SamplerType.TextureBuffer);
|
||||
resourceManager.AddVertexAsComputeTexture(vaBuffer);
|
||||
resourceManager.Properties.AddOrUpdateTexture(vaBuffer);
|
||||
|
||||
inputMap &= ~(1 << location);
|
||||
}
|
||||
@@ -439,11 +433,11 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
{
|
||||
SetBindingPair trbSetAndBinding = resourceManager.Reservations.GetTopologyRemapBufferTextureSetAndBinding();
|
||||
TextureDefinition remapBuffer = new(trbSetAndBinding.SetIndex, trbSetAndBinding.Binding, "trb_data", SamplerType.TextureBuffer);
|
||||
resourceManager.AddVertexAsComputeTexture(remapBuffer);
|
||||
resourceManager.Properties.AddOrUpdateTexture(remapBuffer);
|
||||
|
||||
int geometryVbOutputSbBinding = resourceManager.Reservations.GeometryVertexOutputStorageBufferBinding;
|
||||
BufferDefinition geometryVbOutputBuffer = new(BufferLayout.Std430, 1, geometryVbOutputSbBinding, "geometry_vb_output", vertexOutputStruct);
|
||||
resourceManager.AddVertexAsComputeStorageBuffer(geometryVbOutputBuffer);
|
||||
resourceManager.Properties.AddOrUpdateStorageBuffer(geometryVbOutputBuffer);
|
||||
|
||||
StructureType geometryIbOutputStruct = new([
|
||||
new StructureField(AggregateType.Array | AggregateType.U32, "data", 0)
|
||||
@@ -451,7 +445,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
|
||||
int geometryIbOutputSbBinding = resourceManager.Reservations.GeometryIndexOutputStorageBufferBinding;
|
||||
BufferDefinition geometryIbOutputBuffer = new(BufferLayout.Std430, 1, geometryIbOutputSbBinding, "geometry_ib_output", geometryIbOutputStruct);
|
||||
resourceManager.AddVertexAsComputeStorageBuffer(geometryIbOutputBuffer);
|
||||
resourceManager.Properties.AddOrUpdateStorageBuffer(geometryIbOutputBuffer);
|
||||
}
|
||||
|
||||
resourceManager.SetVertexAsComputeLocalMemories(Definitions.Stage, Definitions.InputTopology);
|
||||
@@ -484,17 +478,12 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
return new ResourceReservations(GpuAccessor, IsTransformFeedbackEmulated, vertexAsCompute: true, _vertexOutput, ioUsage);
|
||||
}
|
||||
|
||||
public ShaderProgramInfo GetVertexAsComputeInfo()
|
||||
{
|
||||
return CreateResourceManager(true).GetVertexAsComputeInfo();
|
||||
}
|
||||
|
||||
public void SetVertexOutputMapForGeometryAsCompute(TranslatorContext vertexContext)
|
||||
{
|
||||
_vertexOutput = vertexContext._program.GetIoUsage();
|
||||
}
|
||||
|
||||
public (ShaderProgram, ShaderProgramInfo) GenerateVertexPassthroughForCompute()
|
||||
public ShaderProgram GenerateVertexPassthroughForCompute()
|
||||
{
|
||||
AttributeUsage attributeUsage = new(GpuAccessor);
|
||||
ResourceManager resourceManager = new(ShaderStage.Vertex, GpuAccessor);
|
||||
@@ -506,7 +495,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
if (Stage == ShaderStage.Vertex)
|
||||
{
|
||||
BufferDefinition vertexInfoBuffer = new(BufferLayout.Std140, 0, vertexInfoCbBinding, "vb_info", VertexInfoBuffer.GetStructureType());
|
||||
resourceManager.AddVertexAsComputeConstantBuffer(vertexInfoBuffer);
|
||||
resourceManager.Properties.AddOrUpdateConstantBuffer(vertexInfoBuffer);
|
||||
}
|
||||
|
||||
StructureType vertexInputStruct = new([
|
||||
@@ -515,7 +504,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
|
||||
int vertexDataSbBinding = reservations.VertexOutputStorageBufferBinding;
|
||||
BufferDefinition vertexOutputBuffer = new(BufferLayout.Std430, 1, vertexDataSbBinding, "vb_input", vertexInputStruct);
|
||||
resourceManager.AddVertexAsComputeStorageBuffer(vertexOutputBuffer);
|
||||
resourceManager.Properties.AddOrUpdateStorageBuffer(vertexOutputBuffer);
|
||||
|
||||
EmitterContext context = new();
|
||||
|
||||
@@ -573,14 +562,14 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||
LastInVertexPipeline = true
|
||||
};
|
||||
|
||||
return (Generate(
|
||||
return Generate(
|
||||
[function],
|
||||
attributeUsage,
|
||||
definitions,
|
||||
definitions,
|
||||
resourceManager,
|
||||
FeatureFlags.None,
|
||||
0), resourceManager.GetVertexAsComputeInfo(isVertex: true));
|
||||
0);
|
||||
}
|
||||
|
||||
public ShaderProgram GenerateGeometryPassthrough()
|
||||
|
||||
@@ -36,7 +36,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
queueLock,
|
||||
_gd.QueueFamilyIndex,
|
||||
_gd.IsQualcommProprietary,
|
||||
_gd.IsTurnip,
|
||||
isLight: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
private readonly Queue _queue;
|
||||
private readonly Lock _queueLock;
|
||||
private readonly bool _concurrentFenceWaitUnsupported;
|
||||
private readonly bool _fenceAlwaysWaits;
|
||||
private readonly CommandPool _pool;
|
||||
private readonly Thread _owner;
|
||||
|
||||
@@ -67,7 +66,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
Lock queueLock,
|
||||
uint queueFamilyIndex,
|
||||
bool concurrentFenceWaitUnsupported,
|
||||
bool fenceAlwaysWaits,
|
||||
bool isLight = false)
|
||||
{
|
||||
_api = api;
|
||||
@@ -75,7 +73,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
_queue = queue;
|
||||
_queueLock = queueLock;
|
||||
_concurrentFenceWaitUnsupported = concurrentFenceWaitUnsupported;
|
||||
_fenceAlwaysWaits = fenceAlwaysWaits;
|
||||
_owner = Thread.CurrentThread;
|
||||
|
||||
CommandPoolCreateInfo commandPoolCreateInfo = new()
|
||||
@@ -210,7 +207,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
ref ReservedCommandBuffer entry = ref _commandBuffers[index];
|
||||
|
||||
if (wait || !entry.InConsumption || entry.Fence.IsSignaledLazy())
|
||||
if (wait || !entry.InConsumption || entry.Fence.IsSignaled())
|
||||
{
|
||||
WaitAndDecrementRef(index);
|
||||
|
||||
@@ -352,7 +349,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
if (refreshFence)
|
||||
{
|
||||
entry.Fence = new FenceHolder(_api, _device, _concurrentFenceWaitUnsupported, _fenceAlwaysWaits);
|
||||
entry.Fence = new FenceHolder(_api, _device, _concurrentFenceWaitUnsupported);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -12,15 +12,13 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
private int _referenceCount;
|
||||
private int _lock;
|
||||
private readonly bool _concurrentWaitUnsupported;
|
||||
private readonly bool _alwaysWaits;
|
||||
private bool _disposed;
|
||||
|
||||
public unsafe FenceHolder(Vk api, Device device, bool concurrentWaitUnsupported, bool alwaysWaits)
|
||||
public unsafe FenceHolder(Vk api, Device device, bool concurrentWaitUnsupported)
|
||||
{
|
||||
_api = api;
|
||||
_device = device;
|
||||
_concurrentWaitUnsupported = concurrentWaitUnsupported;
|
||||
_alwaysWaits = alwaysWaits;
|
||||
|
||||
FenceCreateInfo fenceCreateInfo = new()
|
||||
{
|
||||
@@ -125,16 +123,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSignaledLazy()
|
||||
{
|
||||
if (_alwaysWaits)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return IsSignaled();
|
||||
}
|
||||
|
||||
public bool IsSignaled()
|
||||
{
|
||||
if (_concurrentWaitUnsupported)
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
private ProgramPipelineState _state;
|
||||
private DisposableRenderPass _dummyRenderPass;
|
||||
private ShaderCompilationRequest _compileRequest;
|
||||
private readonly Task _compileTask;
|
||||
private bool _firstBackgroundUse;
|
||||
|
||||
public ShaderCollection(
|
||||
@@ -139,7 +139,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
// Updating buffer texture bindings using template updates crashes the Adreno driver on Windows.
|
||||
UpdateTexturesWithoutTemplate = gd.IsQualcommProprietary && usesBufferTextures;
|
||||
|
||||
_compileRequest = new ShaderCompilationRequest(Task.CompletedTask);
|
||||
_compileTask = Task.CompletedTask;
|
||||
_firstBackgroundUse = false;
|
||||
}
|
||||
|
||||
@@ -153,9 +153,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
{
|
||||
_state = state;
|
||||
|
||||
_compileRequest = gd.ShaderCompilationQueue != null
|
||||
? gd.ShaderCompilationQueue.Add(BackgroundCompilation)
|
||||
: new ShaderCompilationRequest(BackgroundCompilationAsync());
|
||||
_compileTask = BackgroundCompilation();
|
||||
_firstBackgroundUse = !fromCache;
|
||||
}
|
||||
|
||||
@@ -460,25 +458,10 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
return (buffer, texture);
|
||||
}
|
||||
|
||||
private async Task BackgroundCompilationAsync()
|
||||
private async Task BackgroundCompilation()
|
||||
{
|
||||
await Task.WhenAll(_shaders.Select(shader => shader.CompileTask));
|
||||
|
||||
BackgroundCompilationImpl();
|
||||
}
|
||||
|
||||
private void BackgroundCompilation()
|
||||
{
|
||||
foreach (var shader in _shaders)
|
||||
{
|
||||
shader.CompileTask.Wait();
|
||||
}
|
||||
|
||||
BackgroundCompilationImpl();
|
||||
}
|
||||
|
||||
private void BackgroundCompilationImpl()
|
||||
{
|
||||
if (Array.Exists(_shaders, shader => shader.CompileStatus == ProgramLinkStatus.Failure))
|
||||
{
|
||||
LinkStatus = ProgramLinkStatus.Failure;
|
||||
@@ -621,11 +604,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
}
|
||||
}
|
||||
|
||||
if (!_compileRequest.IsCompleted)
|
||||
if (!_compileTask.IsCompleted)
|
||||
{
|
||||
if (blocking)
|
||||
{
|
||||
_compileRequest.Wait();
|
||||
_compileTask.Wait();
|
||||
|
||||
if (LinkStatus == ProgramLinkStatus.Failure)
|
||||
{
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Graphics.Vulkan
|
||||
{
|
||||
class ShaderCompilationQueue
|
||||
{
|
||||
private const int MaxParallelCompilations = 8;
|
||||
private const int MaxThreadStackSize = 2 * 1024 * 1024; // MB
|
||||
|
||||
private struct Request
|
||||
{
|
||||
public readonly ulong Id;
|
||||
public readonly Action Callback;
|
||||
|
||||
public Request(ulong id, Action callback)
|
||||
{
|
||||
Id = id;
|
||||
Callback = callback;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly Thread[] _workerThreads;
|
||||
private readonly CancellationTokenSource _cts;
|
||||
private readonly BlockingCollection<Request>[] _queues;
|
||||
private readonly ulong[] _finishedIds;
|
||||
private ulong _currentId;
|
||||
private int _currentQueueIndex;
|
||||
|
||||
public ShaderCompilationQueue()
|
||||
{
|
||||
_workerThreads = new Thread[MaxParallelCompilations];
|
||||
_queues = new BlockingCollection<Request>[MaxParallelCompilations];
|
||||
_finishedIds = new ulong[MaxParallelCompilations];
|
||||
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
for (int i = 0; i < MaxParallelCompilations; i++)
|
||||
{
|
||||
_queues[i] = new BlockingCollection<Request>();
|
||||
|
||||
Thread thread = new Thread(DoWork, MaxThreadStackSize) { Name = $"BackgroundShaderCompiler.{i}" };
|
||||
thread.IsBackground = true;
|
||||
thread.Start(i);
|
||||
|
||||
_workerThreads[i] = thread;
|
||||
}
|
||||
}
|
||||
|
||||
private void DoWork(object threadId)
|
||||
{
|
||||
int queueIndex = (int)threadId;
|
||||
|
||||
try
|
||||
{
|
||||
var queue = _queues[queueIndex];
|
||||
|
||||
foreach (var request in queue.GetConsumingEnumerable(_cts.Token))
|
||||
{
|
||||
request.Callback();
|
||||
|
||||
lock (queue)
|
||||
{
|
||||
_finishedIds[queueIndex] = request.Id;
|
||||
|
||||
Monitor.PulseAll(queue);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public ShaderCompilationRequest Add(Action callback)
|
||||
{
|
||||
ulong newId = Interlocked.Increment(ref _currentId);
|
||||
|
||||
// Let's keep rotating between the queues to increase the chances
|
||||
// that the selected queue thread is currently idle.
|
||||
int queueIndex = Interlocked.Increment(ref _currentQueueIndex) % MaxParallelCompilations;
|
||||
|
||||
_queues[queueIndex].Add(new Request(newId, callback));
|
||||
|
||||
return new ShaderCompilationRequest(this, queueIndex, newId);
|
||||
}
|
||||
|
||||
public void Wait(int queueIndex, ulong id)
|
||||
{
|
||||
var queue = _queues[queueIndex];
|
||||
|
||||
lock (queue)
|
||||
{
|
||||
while (_finishedIds[queueIndex] < id)
|
||||
{
|
||||
Monitor.Wait(queue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsCompleted(int queueIndex, ulong id)
|
||||
{
|
||||
var queue = _queues[queueIndex];
|
||||
|
||||
lock (queue)
|
||||
{
|
||||
return _finishedIds[queueIndex] >= id;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
for (int i = 0; i < MaxParallelCompilations; i++)
|
||||
{
|
||||
_queues[i].CompleteAdding();
|
||||
}
|
||||
|
||||
_cts.Cancel();
|
||||
|
||||
for (int i = 0; i < MaxParallelCompilations; i++)
|
||||
{
|
||||
_workerThreads[i].Join();
|
||||
|
||||
_queues[i].Dispose();
|
||||
}
|
||||
|
||||
_cts.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ryujinx.Graphics.Vulkan
|
||||
{
|
||||
struct ShaderCompilationRequest
|
||||
{
|
||||
private readonly Task _task;
|
||||
private readonly ShaderCompilationQueue _queue;
|
||||
private readonly int _queueIndex;
|
||||
private readonly ulong _requestId;
|
||||
|
||||
public bool IsCompleted
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_task != null)
|
||||
{
|
||||
return _task.IsCompleted;
|
||||
}
|
||||
else
|
||||
{
|
||||
return _queue.IsCompleted(_queueIndex, _requestId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ShaderCompilationRequest(Task task)
|
||||
{
|
||||
_task = task;
|
||||
_queue = null;
|
||||
_queueIndex = 0;
|
||||
_requestId = 0;
|
||||
}
|
||||
|
||||
public ShaderCompilationRequest(ShaderCompilationQueue queue, int queueIndex, ulong requestId)
|
||||
{
|
||||
_task = null;
|
||||
_queue = queue;
|
||||
_queueIndex = queueIndex;
|
||||
_requestId = requestId;
|
||||
}
|
||||
|
||||
public void Wait()
|
||||
{
|
||||
if (_task != null)
|
||||
{
|
||||
_task.Wait();
|
||||
}
|
||||
else
|
||||
{
|
||||
_queue.Wait(_queueIndex, _requestId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,7 +266,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
public void FreeCompleted()
|
||||
{
|
||||
FenceHolder signalledFence = null;
|
||||
while (_pendingCopies.TryPeek(out PendingCopy pc) && pc.Fence != null && (pc.Fence == signalledFence || pc.Fence.IsSignaledLazy()))
|
||||
while (_pendingCopies.TryPeek(out PendingCopy pc) && pc.Fence != null && (pc.Fence == signalledFence || pc.Fence.IsSignaled()))
|
||||
{
|
||||
signalledFence = pc.Fence; // Already checked - don't need to do it again.
|
||||
PendingCopy dequeued = _pendingCopies.Dequeue();
|
||||
|
||||
@@ -55,7 +55,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
internal CommandBufferPool CommandBufferPool { get; private set; }
|
||||
internal PipelineLayoutCache PipelineLayoutCache { get; private set; }
|
||||
internal BackgroundResources BackgroundResources { get; private set; }
|
||||
internal ShaderCompilationQueue ShaderCompilationQueue { get; private set; }
|
||||
internal Action<Action> InterruptAction { get; private set; }
|
||||
internal SyncManager SyncManager { get; private set; }
|
||||
|
||||
@@ -97,7 +96,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
internal bool IsNvidiaPreTuring { get; private set; }
|
||||
internal bool IsIntelArc { get; private set; }
|
||||
internal bool IsQualcommProprietary { get; private set; }
|
||||
internal bool IsTurnip { get; private set; }
|
||||
internal bool IsMoltenVk { get; private set; }
|
||||
internal bool SupportsMTL31 { get; private set; }
|
||||
internal bool IsTBDR { get; private set; }
|
||||
@@ -129,12 +127,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
// Any device running on MacOS is using MoltenVK, even Intel and AMD vendors.
|
||||
IsMoltenVk = true;
|
||||
|
||||
// The default thread stack size on MacOS is low, and can cause stack overflow
|
||||
// on SPIR-V Cross during shader compilation.
|
||||
// As a workaround, we use this custom queue which allows us to specify the stack
|
||||
// size of the threads used for compilation.
|
||||
ShaderCompilationQueue = new ShaderCompilationQueue();
|
||||
}
|
||||
|
||||
SupportsMTL31 = OperatingSystem.IsMacOSVersionAtLeast(14);
|
||||
@@ -404,8 +396,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
IsFeedbackLoopDevice = IsAmdRdna3;
|
||||
|
||||
IsTurnip = GpuRenderer.StartsWith("Turnip");
|
||||
|
||||
if (Vendor == Vendor.Nvidia)
|
||||
{
|
||||
Match match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
|
||||
@@ -486,7 +476,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtExternalMemoryHost hostMemoryApi);
|
||||
HostMemoryAllocator = new HostMemoryAllocator(MemoryAllocator, Api, hostMemoryApi, _device);
|
||||
|
||||
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsQualcommProprietary, IsTurnip);
|
||||
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsQualcommProprietary);
|
||||
|
||||
PipelineLayoutCache = new PipelineLayoutCache();
|
||||
|
||||
@@ -787,7 +777,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
supportsGeometryShader: Capabilities.SupportsGeometryShader,
|
||||
supportsGeometryShaderPassthrough: Capabilities.SupportsGeometryShaderPassthrough,
|
||||
supportsTransformFeedback: Capabilities.SupportsTransformFeedback,
|
||||
supportsImageBufferPixelAlignment: false,
|
||||
supportsImageLoadFormatted: features2.Features.ShaderStorageImageReadWithoutFormat,
|
||||
supportsLayerVertexTessellation: featuresVk12.ShaderOutputLayer,
|
||||
supportsMismatchingViewFormat: true,
|
||||
@@ -801,7 +790,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
supportsShaderNonUniformIndexing:
|
||||
featuresVk12.ShaderSampledImageArrayNonUniformIndexing &&
|
||||
featuresVk12.ShaderStorageImageArrayNonUniformIndexing,
|
||||
supportsTextureBufferPixelAlignment: false,
|
||||
supportsTextureGatherOffsets: features2.Features.ShaderImageGatherExtended,
|
||||
supportsTextureShadowLod: false,
|
||||
supportsVertexStoreAndAtomics: features2.Features.VertexPipelineStoresAndAtomics,
|
||||
@@ -1124,8 +1112,6 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
SurfaceApi.DestroySurface(_instance.Instance, _surface, null);
|
||||
|
||||
ShaderCompilationQueue?.Dispose();
|
||||
|
||||
Api.DestroyDevice(_device, null);
|
||||
|
||||
_debugMessenger.Dispose();
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace Ryujinx.ShaderTools
|
||||
|
||||
if (options.VertexPassthrough)
|
||||
{
|
||||
(program, _) = translatorContext.GenerateVertexPassthroughForCompute();
|
||||
program = translatorContext.GenerateVertexPassthroughForCompute();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -34,14 +34,9 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
public BackendThreading BackendThreading { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Resolution Scale. An integer scale applied to applicable render targets. Values 1-4, or -1 to use a custom floating point scale instead.
|
||||
/// Resolution Scale. A float value containing the resolution scale.
|
||||
/// </summary>
|
||||
public int ResScale { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Custom Resolution Scale. A custom floating point scale applied to applicable render targets. Only active when Resolution Scale is -1.
|
||||
/// </summary>
|
||||
public float ResScaleCustom { get; set; }
|
||||
public float ResScale { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.
|
||||
@@ -264,7 +259,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
/// Enables or disables low-power profiled translation cache persistency loading
|
||||
/// </summary>
|
||||
public bool EnableLowPowerPtc { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Clock tick scalar, in percent points (100 = 1.0).
|
||||
/// </summary>
|
||||
@@ -473,7 +468,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
/// Uses Hypervisor over JIT if available
|
||||
/// </summary>
|
||||
public bool UseHypervisor { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Enables or disables the GDB stub
|
||||
/// </summary>
|
||||
|
||||
@@ -340,7 +340,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
/// <summary>
|
||||
/// Enables or disables profiled translation cache persistency
|
||||
/// </summary>
|
||||
public ReactiveObject<bool> EnablePtc { get; private set; }
|
||||
public ReactiveObject<bool> EnablePptc { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Clock tick scalar, in percent points (100 = 1.0).
|
||||
@@ -350,7 +350,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
/// <summary>
|
||||
/// Enables or disables low-power profiled translation cache persistency loading
|
||||
/// </summary>
|
||||
public ReactiveObject<bool> EnableLowPowerPtc { get; private set; }
|
||||
public ReactiveObject<bool> EnableLowPowerPptc { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enables or disables guest Internet access
|
||||
@@ -401,7 +401,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
/// Skip User Profiles Manager
|
||||
/// </summary>
|
||||
public ReactiveObject<bool> SkipUserProfilesManager { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Uses Hypervisor over JIT if available
|
||||
/// </summary>
|
||||
@@ -418,10 +418,10 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
MatchSystemTime.Event += static (_, e) => LogValueChange(e, nameof(MatchSystemTime));
|
||||
EnableDockedMode = new ReactiveObject<bool>();
|
||||
EnableDockedMode.Event += static (_, e) => LogValueChange(e, nameof(EnableDockedMode));
|
||||
EnablePtc = new ReactiveObject<bool>();
|
||||
EnablePtc.Event += static (_, e) => LogValueChange(e, nameof(EnablePtc));
|
||||
EnableLowPowerPtc = new ReactiveObject<bool>();
|
||||
EnableLowPowerPtc.Event += static (_, e) => LogValueChange(e, nameof(EnableLowPowerPtc));
|
||||
EnablePptc = new ReactiveObject<bool>();
|
||||
EnablePptc.Event += static (_, e) => LogValueChange(e, nameof(EnablePptc));
|
||||
EnableLowPowerPptc = new ReactiveObject<bool>();
|
||||
EnableLowPowerPptc.Event += static (_, e) => LogValueChange(e, nameof(EnableLowPowerPptc));
|
||||
TickScalar = new ReactiveObject<long>();
|
||||
TickScalar.Event += static (_, e) => LogValueChange(e, nameof(TickScalar));
|
||||
TickScalar.Event += static (_, e) =>
|
||||
@@ -513,14 +513,9 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
public ReactiveObject<AspectRatio> AspectRatio { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Resolution Scale. An integer scale applied to applicable render targets. Values 1-4, or -1 to use a custom floating point scale instead.
|
||||
/// Resolution Scale. A float value containing the resolution scale.
|
||||
/// </summary>
|
||||
public ReactiveObject<int> ResScale { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Custom Resolution Scale. A custom floating point scale applied to applicable render targets. Only active when Resolution Scale is -1.
|
||||
/// </summary>
|
||||
public ReactiveObject<float> ResScaleCustom { get; private set; }
|
||||
public ReactiveObject<float> ResScale { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Directory to save the game shaders.
|
||||
@@ -611,10 +606,8 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
BackendThreading = new ReactiveObject<BackendThreading>();
|
||||
BackendThreading.Event += static (_, e) => LogValueChange(e, nameof(BackendThreading));
|
||||
ResScale = new ReactiveObject<int>();
|
||||
ResScale = new ReactiveObject<float>();
|
||||
ResScale.Event += static (_, e) => LogValueChange(e, nameof(ResScale));
|
||||
ResScaleCustom = new ReactiveObject<float>();
|
||||
ResScaleCustom.Event += static (_, e) => LogValueChange(e, nameof(ResScaleCustom));
|
||||
MaxAnisotropy = new ReactiveObject<float>();
|
||||
MaxAnisotropy.Event += static (_, e) => LogValueChange(e, nameof(MaxAnisotropy));
|
||||
AspectRatio = new ReactiveObject<AspectRatio>();
|
||||
@@ -824,7 +817,6 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
BackendThreading = Graphics.BackendThreading,
|
||||
EnableFileLog = Logger.EnableFileLog,
|
||||
ResScale = Graphics.ResScale,
|
||||
ResScaleCustom = Graphics.ResScaleCustom,
|
||||
MaxAnisotropy = Graphics.MaxAnisotropy,
|
||||
AspectRatio = Graphics.AspectRatio,
|
||||
AntiAliasing = Graphics.AntiAliasing,
|
||||
@@ -864,8 +856,8 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
EnableTextureRecompression = Graphics.EnableTextureRecompression,
|
||||
EnableMacroHLE = Graphics.EnableMacroHLE,
|
||||
EnableColorSpacePassthrough = Graphics.EnableColorSpacePassthrough,
|
||||
EnablePtc = System.EnablePtc,
|
||||
EnableLowPowerPtc = System.EnableLowPowerPtc,
|
||||
EnablePtc = System.EnablePptc,
|
||||
EnableLowPowerPtc = System.EnableLowPowerPptc,
|
||||
TickScalar = System.TickScalar,
|
||||
EnableInternetAccess = System.EnableInternetAccess,
|
||||
EnableFsIntegrityChecks = System.EnableFsIntegrityChecks,
|
||||
@@ -953,8 +945,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
Logger.EnableFileLog.Value = true;
|
||||
Graphics.BackendThreading.Value = BackendThreading.Auto;
|
||||
Graphics.ResScale.Value = 1;
|
||||
Graphics.ResScaleCustom.Value = 1.0f;
|
||||
Graphics.ResScale.Value = 1.0f;
|
||||
Graphics.MaxAnisotropy.Value = -1.0f;
|
||||
Graphics.AspectRatio.Value = AspectRatio.Fixed16x9;
|
||||
Graphics.GraphicsBackend.Value = DefaultGraphicsBackend();
|
||||
@@ -995,7 +986,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
Graphics.AntiAliasing.Value = AntiAliasing.None;
|
||||
Graphics.ScalingFilter.Value = ScalingFilter.Bilinear;
|
||||
Graphics.ScalingFilterLevel.Value = 80;
|
||||
System.EnablePtc.Value = true;
|
||||
System.EnablePptc.Value = true;
|
||||
System.EnableInternetAccess.Value = false;
|
||||
System.EnableFsIntegrityChecks.Value = true;
|
||||
System.FsGlobalAccessLogMode.Value = 0;
|
||||
@@ -1208,8 +1199,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 11.");
|
||||
|
||||
configurationFileFormat.ResScale = 1;
|
||||
configurationFileFormat.ResScaleCustom = 1.0f;
|
||||
configurationFileFormat.ResScale = 1.0f;
|
||||
|
||||
configurationFileUpdated = true;
|
||||
}
|
||||
@@ -1808,7 +1798,6 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
|
||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
||||
Graphics.MaxAnisotropy.Value = configurationFileFormat.MaxAnisotropy;
|
||||
Graphics.AspectRatio.Value = configurationFileFormat.AspectRatio;
|
||||
Graphics.ShadersDumpPath.Value = configurationFileFormat.GraphicsShadersDumpPath;
|
||||
@@ -1851,8 +1840,8 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
Graphics.EnableTextureRecompression.Value = configurationFileFormat.EnableTextureRecompression;
|
||||
Graphics.EnableMacroHLE.Value = configurationFileFormat.EnableMacroHLE;
|
||||
Graphics.EnableColorSpacePassthrough.Value = configurationFileFormat.EnableColorSpacePassthrough;
|
||||
System.EnablePtc.Value = configurationFileFormat.EnablePtc;
|
||||
System.EnableLowPowerPtc.Value = configurationFileFormat.EnableLowPowerPtc;
|
||||
System.EnablePptc.Value = configurationFileFormat.EnablePtc;
|
||||
System.EnableLowPowerPptc.Value = configurationFileFormat.EnableLowPowerPtc;
|
||||
System.TickScalar.Value = configurationFileFormat.TickScalar;
|
||||
System.EnableInternetAccess.Value = configurationFileFormat.EnableInternetAccess;
|
||||
System.EnableFsIntegrityChecks.Value = configurationFileFormat.EnableFsIntegrityChecks;
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
using Ryujinx.UI.Common.Models;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Ryujinx.Common.Configuration
|
||||
{
|
||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||
[JsonSerializable(typeof(CustomSettingsModel))]
|
||||
public partial class CustomSettingsMetadataJsonSerializerContext : JsonSerializerContext
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
using Ryujinx.UI.Common.Configuration.System;
|
||||
using System.IO;
|
||||
using CustomSettingsModel = Ryujinx.UI.Common.Models.CustomSettingsModel;
|
||||
using Path = System.IO.Path;
|
||||
|
||||
namespace Ryujinx.UI.Common.Helper
|
||||
{
|
||||
public static class CustomSettingsHelper
|
||||
{
|
||||
private static readonly CustomSettingsMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||
|
||||
public static CustomSettingsModel LoadCustomSettingsJson(string customSettingsJsonPath)
|
||||
{
|
||||
var customSettingsModel = new CustomSettingsModel();
|
||||
|
||||
if (!File.Exists(customSettingsJsonPath))
|
||||
{
|
||||
return customSettingsModel;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Logger.Info?.Print(LogClass.Configuration, $"Found custom settings data for application at {customSettingsJsonPath}");
|
||||
customSettingsModel = JsonHelper.DeserializeFromFile(customSettingsJsonPath, _serializerContext.CustomSettingsModel);
|
||||
return customSettingsModel;
|
||||
}
|
||||
catch
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Configuration, $"Failed to deserialize custom settings data for application at {customSettingsJsonPath}");
|
||||
return customSettingsModel;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SaveCustomSettingsJson(string customSettingsJsonPath, CustomSettingsModel customSettingsModel)
|
||||
{
|
||||
if (!File.Exists(customSettingsJsonPath))
|
||||
{
|
||||
string directoryPath = Path.GetDirectoryName(customSettingsJsonPath);
|
||||
|
||||
if (!string.IsNullOrEmpty(directoryPath))
|
||||
{
|
||||
Directory.CreateDirectory(directoryPath);
|
||||
}
|
||||
}
|
||||
|
||||
JsonHelper.SerializeToFile(customSettingsJsonPath, customSettingsModel, _serializerContext.CustomSettingsModel);
|
||||
}
|
||||
|
||||
public static bool HasCustomSettings(string customSettingsJsonPath)
|
||||
{
|
||||
return File.Exists(customSettingsJsonPath);
|
||||
}
|
||||
|
||||
public static void DeleteCustomSettings(string customSettingsJsonPath)
|
||||
{
|
||||
FileInfo file = new(customSettingsJsonPath);
|
||||
|
||||
if (file.Exists)
|
||||
{
|
||||
file.Delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static void OverrideSettings(CustomSettingsModel customSettingsModel)
|
||||
{
|
||||
ConfigurationState.Instance.System.EnableDockedMode.Value = customSettingsModel.EnableDockedMode;
|
||||
ConfigurationState.Instance.System.Language.Value = (Language)customSettingsModel.SystemLanguage;
|
||||
ConfigurationState.Instance.System.Region.Value = (Region)customSettingsModel.SystemRegion;
|
||||
ConfigurationState.Instance.Graphics.VSyncMode.Value = (VSyncMode)customSettingsModel.VSyncMode;
|
||||
ConfigurationState.Instance.System.DramSize.Value = (MemoryConfiguration)customSettingsModel.DramSize;
|
||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks.Value = customSettingsModel.EnableFsIntegrityChecks;
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices.Value = customSettingsModel.IgnoreMissingServices;
|
||||
ConfigurationState.Instance.System.EnableLowPowerPptc.Value = customSettingsModel.EnableLowPowerPptc;
|
||||
ConfigurationState.Instance.System.MemoryManagerMode.Value = (MemoryManagerMode)customSettingsModel.MemoryManagerMode;
|
||||
ConfigurationState.Instance.System.UseHypervisor.Value = customSettingsModel.UseHypervisor;
|
||||
ConfigurationState.Instance.System.TickScalar.Value = customSettingsModel.TickScalar;
|
||||
ConfigurationState.Instance.System.AudioBackend.Value = customSettingsModel.AudioBackend;
|
||||
ConfigurationState.Instance.System.AudioVolume.Value = customSettingsModel.AudioVolume;
|
||||
ConfigurationState.Instance.Graphics.GraphicsBackend.Value = (GraphicsBackend)customSettingsModel.GraphicsBackend;
|
||||
ConfigurationState.Instance.Graphics.PreferredGpu.Value = customSettingsModel.PreferredGpu;
|
||||
ConfigurationState.Instance.Graphics.EnableShaderCache.Value = customSettingsModel.EnableShaderCache;
|
||||
ConfigurationState.Instance.Graphics.EnableTextureRecompression.Value = customSettingsModel.EnableTextureRecompression;
|
||||
ConfigurationState.Instance.Graphics.EnableMacroHLE.Value = customSettingsModel.EnableMacroHLE;
|
||||
ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value = customSettingsModel.EnableColorSpacePassthrough;
|
||||
ConfigurationState.Instance.Graphics.ResScale.Value = customSettingsModel.ResScale;
|
||||
ConfigurationState.Instance.Graphics.MaxAnisotropy.Value = customSettingsModel.MaxAnisotropy;
|
||||
ConfigurationState.Instance.Graphics.BackendThreading.Value = (BackendThreading)customSettingsModel.BackendThreading;
|
||||
}
|
||||
|
||||
public static string PathToGameSettingsJson(ulong applicationIdBase)
|
||||
{
|
||||
return Path.Combine(AppDataManager.GamesDirPath, applicationIdBase.ToString("x16"), "settings.json");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,13 +31,13 @@ namespace Ryujinx.UI.Common.Helper
|
||||
|
||||
try
|
||||
{
|
||||
List<DownloadableContentContainer> downloadableContentContainerList = JsonHelper.DeserializeFromFile(downloadableContentJsonPath,
|
||||
_serializerContext.ListDownloadableContentContainer);
|
||||
// Logger.Info?.Print(LogClass.Configuration, $"Found downloadable content data for {applicationIdBase:x16} at {downloadableContentJsonPath}");
|
||||
List<DownloadableContentContainer> downloadableContentContainerList = JsonHelper.DeserializeFromFile(downloadableContentJsonPath,_serializerContext.ListDownloadableContentContainer);
|
||||
return LoadDownloadableContents(vfs, downloadableContentContainerList);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Configuration, "Downloadable Content JSON failed to deserialize.");
|
||||
Logger.Error?.Print(LogClass.Configuration, $"Failed to deserialize downloadable content data for {applicationIdBase:x16} at {downloadableContentJsonPath}");
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,12 +39,13 @@ namespace Ryujinx.UI.Common.Helper
|
||||
|
||||
try
|
||||
{
|
||||
// Logger.Info?.Print(LogClass.Application, $"Found title updates data for {applicationIdBase:x16} at {titleUpdatesJsonPath}");
|
||||
TitleUpdateMetadata titleUpdateWindowData = JsonHelper.DeserializeFromFile(titleUpdatesJsonPath, _serializerContext.TitleUpdateMetadata);
|
||||
return LoadTitleUpdates(vfs, titleUpdateWindowData, applicationIdBase);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Application, $"Failed to deserialize title update data for {applicationIdBase:x16} at {titleUpdatesJsonPath}");
|
||||
Logger.Error?.Print(LogClass.Application, $"Failed to deserialize title updates data for {applicationIdBase:x16} at {titleUpdatesJsonPath}");
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
|
||||
namespace Ryujinx.UI.Common.Models
|
||||
{
|
||||
// NOTE: most consuming code relies on this model being value-comparable
|
||||
public record CustomSettingsModel()
|
||||
{
|
||||
public bool HasCustomSettings { get; set; }
|
||||
public bool EnableDockedMode { get; set; }
|
||||
public int SystemLanguage { get; set; }
|
||||
public int SystemRegion { get; set; }
|
||||
public int VSyncMode { get; set; }
|
||||
public int DramSize { get; set; }
|
||||
public bool EnableFsIntegrityChecks { get; set; }
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
public bool EnablePptc { get; set; }
|
||||
public bool EnableLowPowerPptc { get; set; }
|
||||
public int MemoryManagerMode { get; set; }
|
||||
public bool UseHypervisor { get; set; }
|
||||
public long TickScalar { get; set; }
|
||||
public int GraphicsBackend { get; set; }
|
||||
public string PreferredGpu { get; set; }
|
||||
public bool EnableShaderCache { get; set; }
|
||||
public bool EnableTextureRecompression { get; set; }
|
||||
public bool EnableMacroHLE { get; set; }
|
||||
public bool EnableColorSpacePassthrough { get; set; }
|
||||
public float ResScale { get; set; }
|
||||
public float MaxAnisotropy { get; set; }
|
||||
public int BackendThreading { get; set; }
|
||||
public AudioBackend AudioBackend { get; set; }
|
||||
public float AudioVolume { get; set; }
|
||||
}
|
||||
}
|
||||
+53
-41
@@ -43,6 +43,7 @@ using Ryujinx.UI.App.Common;
|
||||
using Ryujinx.UI.Common;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
using Ryujinx.UI.Common.Helper;
|
||||
using Ryujinx.UI.Common.Models;
|
||||
using Silk.NET.Vulkan;
|
||||
using SkiaSharp;
|
||||
using SPB.Graphics.Exceptions;
|
||||
@@ -84,6 +85,7 @@ namespace Ryujinx.Ava
|
||||
|
||||
private readonly AccountManager _accountManager;
|
||||
private readonly UserChannelPersistence _userChannelPersistence;
|
||||
private readonly CustomSettingsModel _customSettingsModel;
|
||||
private readonly InputManager _inputManager;
|
||||
|
||||
private readonly MainWindowViewModel _viewModel;
|
||||
@@ -181,6 +183,12 @@ namespace Ryujinx.Ava
|
||||
_chrono = new Stopwatch();
|
||||
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
||||
|
||||
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(applicationId)))
|
||||
{
|
||||
CustomSettingsModel customSettings = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(applicationId));
|
||||
CustomSettingsHelper.OverrideSettings(customSettings);
|
||||
}
|
||||
|
||||
if (ApplicationPath.StartsWith("@SystemContent"))
|
||||
{
|
||||
ApplicationPath = VirtualFileSystem.SwitchPathToSystemPath(ApplicationPath);
|
||||
@@ -476,7 +484,7 @@ namespace Ryujinx.Ava
|
||||
|
||||
public void Start()
|
||||
{
|
||||
ARMeilleure.Optimizations.EcoFriendly = ConfigurationState.Instance.System.EnableLowPowerPtc;
|
||||
ARMeilleure.Optimizations.EcoFriendly = ConfigurationState.Instance.System.EnableLowPowerPptc;
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
@@ -616,6 +624,12 @@ namespace Ryujinx.Ava
|
||||
_gpuCancellationTokenSource.Dispose();
|
||||
|
||||
DisposeGpu();
|
||||
|
||||
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationId)))
|
||||
{
|
||||
Program.ReloadConfig();
|
||||
}
|
||||
|
||||
AppExit?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
@@ -959,45 +973,45 @@ namespace Ryujinx.Ava
|
||||
|
||||
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
|
||||
|
||||
// Initialize Configuration.
|
||||
MemoryConfiguration memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
|
||||
CustomSettingsModel customSettingsModel = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationId));
|
||||
|
||||
HLEConfiguration configuration = new(VirtualFileSystem,
|
||||
_viewModel.LibHacHorizonManager,
|
||||
ContentManager,
|
||||
_accountManager,
|
||||
_userChannelPersistence,
|
||||
renderer,
|
||||
InitializeAudio(),
|
||||
memoryConfiguration,
|
||||
_viewModel.UiHandler,
|
||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
||||
ConfigurationState.Instance.Graphics.VSyncMode,
|
||||
ConfigurationState.Instance.System.EnableDockedMode,
|
||||
ConfigurationState.Instance.System.EnablePtc,
|
||||
ConfigurationState.Instance.System.TickScalar,
|
||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
||||
ConfigurationState.Instance.System.MatchSystemTime
|
||||
? 0
|
||||
: ConfigurationState.Instance.System.SystemTimeOffset,
|
||||
ConfigurationState.Instance.System.TimeZone,
|
||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
||||
ConfigurationState.Instance.System.AudioVolume,
|
||||
ConfigurationState.Instance.System.UseHypervisor,
|
||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
||||
ConfigurationState.Instance.Multiplayer.Mode,
|
||||
ConfigurationState.Instance.Multiplayer.DisableP2p,
|
||||
ConfigurationState.Instance.Multiplayer.LdnPassphrase,
|
||||
ConfigurationState.Instance.Multiplayer.LdnServer,
|
||||
ConfigurationState.Instance.Debug.EnableGdbStub,
|
||||
ConfigurationState.Instance.Debug.GdbStubPort,
|
||||
ConfigurationState.Instance.Debug.DebuggerSuspendOnStart,
|
||||
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value);
|
||||
HLEConfiguration configuration = new(
|
||||
VirtualFileSystem,
|
||||
_viewModel.LibHacHorizonManager,
|
||||
ContentManager,
|
||||
_accountManager,
|
||||
_userChannelPersistence,
|
||||
renderer,
|
||||
InitializeAudio(),
|
||||
customSettingsModel.HasCustomSettings ? (MemoryConfiguration)customSettingsModel.DramSize : ConfigurationState.Instance.System.DramSize.Value,
|
||||
_viewModel.UiHandler,
|
||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
||||
ConfigurationState.Instance.Graphics.VSyncMode,
|
||||
ConfigurationState.Instance.System.EnableDockedMode,
|
||||
ConfigurationState.Instance.System.EnablePptc,
|
||||
ConfigurationState.Instance.System.TickScalar,
|
||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
||||
ConfigurationState.Instance.System.MatchSystemTime
|
||||
? 0
|
||||
: ConfigurationState.Instance.System.SystemTimeOffset,
|
||||
ConfigurationState.Instance.System.TimeZone,
|
||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
||||
ConfigurationState.Instance.System.AudioVolume,
|
||||
ConfigurationState.Instance.System.UseHypervisor,
|
||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
||||
ConfigurationState.Instance.Multiplayer.Mode,
|
||||
ConfigurationState.Instance.Multiplayer.DisableP2p,
|
||||
ConfigurationState.Instance.Multiplayer.LdnPassphrase,
|
||||
ConfigurationState.Instance.Multiplayer.LdnServer,
|
||||
ConfigurationState.Instance.Debug.EnableGdbStub,
|
||||
ConfigurationState.Instance.Debug.GdbStubPort,
|
||||
ConfigurationState.Instance.Debug.DebuggerSuspendOnStart,
|
||||
ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value);
|
||||
|
||||
Device = new Switch(configuration);
|
||||
}
|
||||
@@ -1064,8 +1078,6 @@ namespace Ryujinx.Ava
|
||||
}
|
||||
}
|
||||
|
||||
MainWindowViewModel.SaveConfig();
|
||||
|
||||
return deviceDriver;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "يفتح نافذة إدارة تحديث اللُعبة",
|
||||
"GameListContextMenuManageDlc": "إدارة المحتوي الإضافي",
|
||||
"GameListContextMenuManageDlcToolTip": "يفتح نافذة إدارة المحتوي الإضافي",
|
||||
"GameListContextMenuManageCustomSettings": "إدارة ملف الإعدادات المخصصة",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "إدارة الإعدادات المخصصة للتطبيق المحدد",
|
||||
"GameListContextMenuCustomSettingsOpen": "فتح دليل الإعدادات المخصصة",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "فتح الدليل الذي يحتوي على الإعدادات المخصصة للتطبيق",
|
||||
"GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـPPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "مقياس الدقة",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "مخصص (لا ينصح به)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "الأصل (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (لا ينصح به)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "نسبة الارتفاع إلى العرض:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "الكل",
|
||||
"SettingsTabLoggingEnableDebugLogs": "تمكين سجلات التصحيح",
|
||||
"SettingsTabInput": "الإدخال",
|
||||
"SettingsTabInputEnableDockedMode": "تركيب بالمنصة",
|
||||
"SettingsTabSystemEnableDockedMode": "تركيب بالمنصة",
|
||||
"SettingsTabInputDirectKeyboardAccess": "الوصول المباشر للوحة المفاتيح",
|
||||
"SettingsButtonDelete": "حذف",
|
||||
"SettingsButtonSave": "حفظ",
|
||||
"SettingsButtonClose": "إغلاق",
|
||||
"SettingsButtonOk": "موافق",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "حذف الملف الشخصي",
|
||||
"DialogProfileDeleteProfileMessage": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"DialogWarning": "تحذير",
|
||||
"DialogCustomSettingsDeleteMessage": "أنت على وشك حذف الإعدادات المخصصة لـ:\n\n{0}\n\nهل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟",
|
||||
"DialogPPTCDeletionErrorMessage": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "أنت على وشك حذف جميع بيانات PPTC من:\n\n{0}\n\nهل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"DialogShaderDeletionErrorMessage": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "واجه ريوجينكس خطأ",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "الملف المحدد لا يحتوي على تحديث للعنوان المحدد!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "تحذير - خلفية متعددة المسارات",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "يجب إعادة تشغيل ريوجينكس بعد تغيير هذا الخيار حتى يتم تطبيقه بالكامل. اعتمادا على النظام الأساسي الخاص بك، قد تحتاج إلى تعطيل تعدد المسارات الخاص ببرنامج الرسومات التشغيل الخاص بك يدويًا عند استخدام الخاص بريوجينكس.",
|
||||
"DialogModManagerDeletionWarningMessage": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"DialogModManagerDeletionAllWarningMessage": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"SettingsTabGraphicsFeaturesOptions": "المميزات",
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Öffnet den Spiel-Update-Manager",
|
||||
"GameListContextMenuManageDlc": "Verwalten von DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Öffnet den DLC-Manager",
|
||||
"GameListContextMenuManageCustomSettings": "Benutzerdefinierte Einstellungsdatei verwalten",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Verwalten Sie die benutzerdefinierten Einstellungen für die ausgewählte Anwendung",
|
||||
"GameListContextMenuCustomSettingsOpen": "Verzeichnis der benutzerdefinierten Einstellungen öffnen",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Öffnen Sie das Verzeichnis, das die benutzerdefinierten Einstellungen der Anwendung enthält",
|
||||
"GameListContextMenuCacheManagement": "Cache-Verwaltung",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird",
|
||||
@@ -173,11 +177,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Auflösungsskalierung:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Benutzerdefiniert (nicht empfohlen)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Nativ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Nicht empfohlen)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Bildseitenverhältnis:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -208,8 +213,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Aktiviere Debug-Log",
|
||||
"SettingsTabInput": "Eingabe",
|
||||
"SettingsTabInputEnableDockedMode": "Angedockter Modus",
|
||||
"SettingsTabSystemEnableDockedMode": "Angedockter Modus",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Direkter Tastaturzugriff",
|
||||
"SettingsButtonDelete": "Löschen",
|
||||
"SettingsButtonSave": "Speichern",
|
||||
"SettingsButtonClose": "Schließen",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -488,9 +494,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Profil löschen",
|
||||
"DialogProfileDeleteProfileMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Wirklich fortfahren?",
|
||||
"DialogWarning": "Warnung",
|
||||
"DialogCustomSettingsDeleteMessage": "Sie sind dabei, benutzerdefinierte Einstellungen zu löschen für:\n\n{0}\n\nSind Sie sicher, dass Sie fortfahren möchten?",
|
||||
"DialogPPTCDeletionMessage": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?",
|
||||
"DialogPPTCDeletionErrorMessage": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Sie sind dabei, alle PPTC-Daten zu löschen von:\n\n{0}\n\nSind Sie sicher, dass Sie fortfahren möchten?",
|
||||
"DialogShaderDeletionMessage": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?",
|
||||
"DialogShaderDeletionErrorMessage": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten",
|
||||
"DialogRyujinxErrorMessage": "Ein Fehler ist aufgetreten",
|
||||
@@ -529,7 +536,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Bitte beende die Emulation oder schließe den Emulator, vor dem Starten eines neuen Spiels",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Warnung - Render Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx muss muss neu gestartet werden, damit die Änderungen wirksam werden. Abhängig von dem Betriebssystem muss möglicherweise das Multithreading des Treibers manuell deaktiviert werden, wenn Ryujinx verwendet wird.",
|
||||
"DialogModManagerDeletionWarningMessage": "Du bist dabei, diesen Mod zu lösche. {0}\n\nMöchtest du wirklich fortfahren?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Erweiterungen",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού",
|
||||
"GameListContextMenuManageDlc": "Διαχείριση DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Ανοίγει το παράθυρο διαχείρισης DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Διαχείριση Αρχείου Προσαρμοσμένων Ρυθμίσεων",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Διαχειριστείτε τις προσαρμοσμένες ρυθμίσεις για την επιλεγμένη Εφαρμογή",
|
||||
"GameListContextMenuCustomSettingsOpen": "Άνοιγμα Καταλόγου Προσαρμοσμένων Ρυθμίσεων",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Ανοίξτε τον κατάλογο που περιέχει τις προσαρμοσμένες ρυθμίσεις της Εφαρμογής",
|
||||
"GameListContextMenuCacheManagement": "Διαχείριση Προσωρινής Μνήμης",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Κλίμακα Ανάλυσης:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Προσαρμοσμένο (Δεν συνιστάται)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Εγγενής (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Αναλογία Απεικόνισης:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Όλα",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Ενεργοποίηση Αρχείων Καταγραφής Εντοπισμού Σφαλμάτων",
|
||||
"SettingsTabInput": "Χειρισμός",
|
||||
"SettingsTabInputEnableDockedMode": "Ενεργοποίηση Docked Mode",
|
||||
"SettingsTabSystemEnableDockedMode": "Ενεργοποίηση Docked Mode",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Άμεση Πρόσβαση στο Πληκτρολόγιο",
|
||||
"SettingsButtonDelete": "Διαγραφή",
|
||||
"SettingsButtonSave": "Αποθήκευση",
|
||||
"SettingsButtonClose": "Κλείσιμο",
|
||||
"SettingsButtonOk": "ΟΚ",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Διαγραφή Προφίλ",
|
||||
"DialogProfileDeleteProfileMessage": "Αυτή η ενέργεια είναι μη αναστρέψιμη, είστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogWarning": "Προειδοποίηση",
|
||||
"DialogCustomSettingsDeleteMessage": "Πρόκειται να διαγράψετε τις προσαρμοσμένες ρυθμίσεις για:\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogPPTCDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogPPTCDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Πρόκειται να διαγράψετε όλα τα δεδομένα PPTC από:\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogShaderDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
|
||||
"DialogShaderDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Σταματήστε την εξομοίωση ή κλείστε τον εξομοιωτή πριν ξεκινήσετε ένα άλλο παιχνίδι.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Προειδοποίηση - Backend Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Το Ryujinx πρέπει να επανεκκινηθεί αφού αλλάξει αυτή η επιλογή για να εφαρμοστεί πλήρως. Ανάλογα με την πλατφόρμα σας, μπορεί να χρειαστεί να απενεργοποιήσετε με μη αυτόματο τρόπο το multithreading του ίδιου του προγράμματος οδήγησης όταν χρησιμοποιείτε το Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Χαρακτηριστικά",
|
||||
|
||||
@@ -71,6 +71,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Opens the Title Update management window",
|
||||
"GameListContextMenuManageDlc": "Manage DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Opens the DLC management window",
|
||||
"GameListContextMenuManageCustomSettings": "Manage Custom Settings",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Opens the Custom Settings management windows",
|
||||
"GameListContextMenuCustomSettingsOpen": "Open Custom Settings Directory",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Open the directory which contains Application's custom settings",
|
||||
"GameListContextMenuCacheManagement": "Cache Management",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Queue PPTC Rebuild",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Trigger PPTC to rebuild at boot time on the next game launch",
|
||||
@@ -197,11 +201,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Resolution Scale:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Custom (Not recommended)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Native (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Aspect Ratio:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -238,8 +243,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "All",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Enable Debug Logs",
|
||||
"SettingsTabInput": "Input",
|
||||
"SettingsTabInputEnableDockedMode": "Docked Mode",
|
||||
"SettingsTabSystemEnableDockedMode": "Docked Mode",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Direct Keyboard Access",
|
||||
"SettingsButtonDelete": "Delete",
|
||||
"SettingsButtonSave": "Save",
|
||||
"SettingsButtonClose": "Close",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -525,6 +531,7 @@
|
||||
"DialogProfileDeleteProfileTitle": "Deleting Profile",
|
||||
"DialogProfileDeleteProfileMessage": "This action is irreversible, are you sure you want to continue?",
|
||||
"DialogWarning": "Warning",
|
||||
"DialogCustomSettingsDeleteMessage": "You are about to delete custom settings for:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCDeletionMessage": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCDeletionErrorMessage": "Error purging PPTC cache at {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
@@ -566,7 +573,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Please stop emulation or close the emulator before launching another game.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "The specified file does not contain an update for the selected title!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Warning - Backend Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx must be restarted after changing this option for it to apply fully. Depending on your platform, you may need to manually disable your driver's own multithreading when using Ryujinx's.",
|
||||
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Features",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Abrir la ventana de gestión de actualizaciones de esta aplicación",
|
||||
"GameListContextMenuManageDlc": "Gestionar DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Abrir la ventana de gestión del DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Gestionar Archivo de Configuración Personalizada",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Gestionar la configuración personalizada para la Aplicación seleccionada",
|
||||
"GameListContextMenuCustomSettingsOpen": "Abrir Directorio de Configuración Personalizada",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Abrir el directorio que contiene la configuración personalizada de la Aplicación",
|
||||
"GameListContextMenuCacheManagement": "Gestión de caché ",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "x8",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "x16",
|
||||
"SettingsTabGraphicsResolutionScale": "Escala de resolución:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Personalizada (no recomendado)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (no recomendado)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Relación de aspecto:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Todo",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Habilitar registros de debug",
|
||||
"SettingsTabInput": "Entrada",
|
||||
"SettingsTabInputEnableDockedMode": "Modo dock/TV",
|
||||
"SettingsTabSystemEnableDockedMode": "Modo dock/TV",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Acceso directo al teclado",
|
||||
"SettingsButtonDelete": "Eliminar",
|
||||
"SettingsButtonSave": "Guardar",
|
||||
"SettingsButtonClose": "Cerrar",
|
||||
"SettingsButtonOk": "Aceptar",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Eliminando perfil",
|
||||
"DialogProfileDeleteProfileMessage": "Esta acción es irreversible, ¿estás seguro de querer continuar?",
|
||||
"DialogWarning": "Advertencia",
|
||||
"DialogCustomSettingsDeleteMessage": "Está a punto de eliminar la configuración personalizada para:\n\n{0}\n\n¿Está seguro de que desea continuar?",
|
||||
"DialogPPTCDeletionMessage": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
|
||||
"DialogPPTCDeletionErrorMessage": "Error purgando la caché de PPTC en {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Está a punto de eliminar todos los datos PPTC de:\n\n{0}\n\n¿Está seguro de que desea continuar?",
|
||||
"DialogShaderDeletionMessage": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
|
||||
"DialogShaderDeletionErrorMessage": "Error purgando la caché de sombreadores en {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx ha encontrado un error",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, detén la emulación o cierra el emulador antes de iniciar otro juego.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "¡Ese archivo no contiene una actualización para el título seleccionado!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Advertencia - multihilado de gráficos",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx debe reiniciarse para aplicar este cambio. Dependiendo de tu plataforma, puede que tengas que desactivar manualmente la optimización enlazada de tus controladores gráficos para usar el multihilo de Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Estás a punto de eliminar el mod: {0}\n\n¿Estás seguro de que quieres continuar?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Estás a punto de eliminar todos los Mods para este título.\n\n¿Estás seguro de que quieres continuar?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Funcionalidades",
|
||||
@@ -597,7 +603,7 @@
|
||||
"MemoryManagerSoftwareTooltip": "Usa una tabla de paginación de software para traducir direcciones. Ofrece la precisión más exacta pero el rendimiento más lento.",
|
||||
"MemoryManagerHostTooltip": "Mapea la memoria directamente en la dirección de espacio del host. Compilación y ejecución JIT mucho más rápida.",
|
||||
"MemoryManagerUnsafeTooltip": "Mapea la memoria directamente, pero no enmascara la dirección dentro del espacio de dirección del guest antes del acceso. El modo más rápido, pero a costa de seguridad. La aplicación guest puede acceder a la memoria desde cualquier parte en Ryujinx, así que ejecuta solo programas en los que confíes cuando uses este modo.",
|
||||
"UseHypervisorTooltip": "Usar Hypervisor en lugar de JIT. Mejora enormemente el rendimiento cuando está disponible, pero puede ser inestable en su estado actual.",
|
||||
"UseHypervisorTooltip": "Usar Hypervisor en lugar de JIT. Mejora enormemente el rendimiento cuando está disponible, pero puede ser inestable en su estado actual.",
|
||||
"DRamTooltip": "Expande la memoria DRAM del sistema emulado de 4GiB a 6GiB.\n\nUtilizar solo con packs de texturas HD o mods de resolución 4K. NO mejora el rendimiento.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"IgnoreMissingServicesTooltip": "Hack para ignorar servicios no implementados del Horizon OS. Esto puede ayudar a sobrepasar crasheos cuando inicies ciertos juegos.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"GraphicsBackendThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion des mises à jour du jeu",
|
||||
"GameListContextMenuManageDlc": "Gérer les DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Ouvre la fenêtre de gestion des DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Gérer les paramètres personnalisés",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Gérer les paramètres personnalisés pour l'Application sélectionnée",
|
||||
"GameListContextMenuCustomSettingsOpen": "Ouvrir le Répertoire des Paramètres Personnalisés",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Ouvrir le répertoire contenant les paramètres personnalisés de l'Application",
|
||||
"GameListContextMenuCacheManagement": "Gestion des caches",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu",
|
||||
@@ -174,11 +178,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "x8",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "x16",
|
||||
"SettingsTabGraphicsResolutionScale": "Échelle de résolution:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non recommandé)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Format d'affichage :",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -209,8 +214,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Tout",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Activer les journaux de debug",
|
||||
"SettingsTabInput": "Contrôles",
|
||||
"SettingsTabInputEnableDockedMode": "Active le mode station d'accueil",
|
||||
"SettingsTabSystemEnableDockedMode": "Active le mode station d'accueil",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Accès direct au clavier",
|
||||
"SettingsButtonDelete": "Supprimer",
|
||||
"SettingsButtonSave": "Enregistrer",
|
||||
"SettingsButtonClose": "Fermer",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -489,9 +495,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Supprimer le profil",
|
||||
"DialogProfileDeleteProfileMessage": "Cette action est irréversible, êtes-vous sûr de vouloir continuer ?",
|
||||
"DialogWarning": "Avertissement",
|
||||
"DialogCustomSettingsDeleteMessage": "Vous êtes sur le point de supprimer les paramètres personnalisés pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogPPTCDeletionMessage": "Vous êtes sur le point de mettre en file d'attente une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogPPTCDeletionErrorMessage": "Erreur lors de la purge du cache PPTC à {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Vous êtes sur le point de supprimer toutes les données PPTC de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogShaderDeletionMessage": "Vous êtes sur le point de supprimer le cache du Shader pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogShaderDeletionErrorMessage": "Erreur lors de la purge du cache du Shader à {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx a rencontré une erreur",
|
||||
@@ -530,7 +537,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Veuillez arrêter l'émulation ou fermer l'émulateur avant de lancer un autre jeu.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Avertissement - Backend Threading ",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx doit être redémarré après avoir changé cette option pour qu'elle s'applique complètement. Selon votre plate-forme, vous devrez peut-être désactiver manuellement le multithreading de votre pilote lorsque vous utilisez Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Fonctionnalités",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "פותח את חלון מנהל עדכוני המשחקים",
|
||||
"GameListContextMenuManageDlc": "מנהל הרחבות",
|
||||
"GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים",
|
||||
"GameListContextMenuManageCustomSettings": "נהל קובץ הגדרות מותאמות אישית",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "נהל הגדרות מותאמות אישית עבור האפליקציה שנבחרה",
|
||||
"GameListContextMenuCustomSettingsOpen": "פתח תיקיית הגדרות מותאמות אישית",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "פתח את התיקייה המכילה את הגדרות מותאמות אישית של האפליקציה",
|
||||
"GameListContextMenuCacheManagement": "ניהול מטמון",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "קנה מידה של רזולוציה:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "מותאם אישית (לא מומלץ)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "מקורי (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (לא מומלץ)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "יחס גובה-רוחב:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "הכל",
|
||||
"SettingsTabLoggingEnableDebugLogs": "אפשר רישום ניפוי באגים",
|
||||
"SettingsTabInput": "קלט",
|
||||
"SettingsTabInputEnableDockedMode": "מצב עגינה",
|
||||
"SettingsTabSystemEnableDockedMode": "מצב עגינה",
|
||||
"SettingsTabInputDirectKeyboardAccess": "גישה ישירה למקלדת",
|
||||
"SettingsButtonDelete": "מחק",
|
||||
"SettingsButtonSave": "שמירה",
|
||||
"SettingsButtonClose": "סגירה",
|
||||
"SettingsButtonOk": "אישור",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "מוחק פרופיל",
|
||||
"DialogProfileDeleteProfileMessage": "פעולה זו היא בלתי הפיכה, האם אתם בטוחים שברצונכם להמשיך?",
|
||||
"DialogWarning": "אזהרה",
|
||||
"DialogCustomSettingsDeleteMessage": "אתה עומד למחוק הגדרות מותאמות אישית עבור:\n\n{0}\n\nהאם אתה בטוח שברצונך להמשיך?",
|
||||
"DialogPPTCDeletionMessage": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}",
|
||||
"DialogPPTCDeletionErrorMessage": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "אתה עומד למחוק את כל נתוני PPTC מ:\n\n{0}\n\nהאם אתה בטוח שברצונך להמשיך?",
|
||||
"DialogShaderDeletionMessage": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}",
|
||||
"DialogShaderDeletionErrorMessage": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "ריוג'ינקס נתקלה בשגיאה",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "אנא הפסק את האמולציה או סגור את האמולטור לפני הפעלת משחק אחר.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "אזהרה - ריבוי תהליכי רקע",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "יש להפעיל מחדש את ריוג'ינקס לאחר שינוי אפשרות זו כדי שהיא תחול במלואה. בהתאם לפלטפורמה שלך, ייתכן שיהיה עליך להשבית ידנית את ריבוי ההליכים של ההתקן שלך בעת השימוש ב-ריוג'ינקס.",
|
||||
"DialogModManagerDeletionWarningMessage": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "אפשרויות",
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Apre la finestra di gestione aggiornamenti del gioco",
|
||||
"GameListContextMenuManageDlc": "Gestisci DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione dei DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Gestisci le impostazioni personalizzate",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Gestisci le impostazioni personalizzate per l'Applicazione selezionata",
|
||||
"GameListContextMenuCustomSettingsOpen": "Apri Directory Impostazioni Personalizzate",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Apri la directory che contiene le impostazioni personalizzate dell'Applicazione",
|
||||
"GameListContextMenuCacheManagement": "Gestione della cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco",
|
||||
@@ -195,11 +199,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Scala della risoluzione:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Personalizzata (Non raccomandata)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non consigliato)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Rapporto d'aspetto:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -230,8 +235,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Tutto",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Attiva log di debug",
|
||||
"SettingsTabInput": "Comandi",
|
||||
"SettingsTabInputEnableDockedMode": "Attiva modalità TV",
|
||||
"SettingsTabSystemEnableDockedMode": "Attiva modalità TV",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera",
|
||||
"SettingsButtonDelete": "Elimina",
|
||||
"SettingsButtonSave": "Salva",
|
||||
"SettingsButtonClose": "Chiudi",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -515,10 +521,11 @@
|
||||
"DialogProfileDeleteProfileTitle": "Eliminazione profilo",
|
||||
"DialogProfileDeleteProfileMessage": "Quest'azione è irreversibile, sei sicuro di voler continuare?",
|
||||
"DialogWarning": "Avviso",
|
||||
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogCustomSettingsDeleteMessage": "Stai per eliminare le impostazioni personalizzate per:\n\n{0}\n\nSei sicuro di voler procedere?",
|
||||
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler procedere?",
|
||||
"DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "Stai per eliminare i tutti i dati della cache PPTC da:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogPPTCNukeMessage": "Stai per eliminare tutti i dati PPTC da:\n\n{0}\n\nSei sicuro di voler procedere?",
|
||||
"DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler procedere?",
|
||||
"DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx ha riscontrato un errore",
|
||||
"DialogInvalidTitleIdErrorMessage": "Errore UI: Il gioco selezionato non ha un ID titolo valido",
|
||||
@@ -556,7 +563,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Ferma l'emulazione o chiudi l'emulatore prima di avviare un altro gioco.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Il file specificato non contiene un aggiornamento per il titolo selezionato!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Avviso - Backend Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx deve essere riavviato dopo aver cambiato questa opzione per applicarla completamente. A seconda della tua piattaforma, potrebbe essere necessario disabilitare manualmente il multithreading del driver quando usi quello di Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Stai per eliminare la mod: {0}\n\nConfermi di voler procedere?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Funzionalità",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "タイトルのアップデート管理ウインドウを開きます",
|
||||
"GameListContextMenuManageDlc": "DLCを管理",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC管理ウインドウを開きます",
|
||||
"GameListContextMenuManageCustomSettings": "カスタム設定ファイルを管理",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "選択したアプリケーションのカスタム設定を管理します",
|
||||
"GameListContextMenuCustomSettingsOpen": "カスタム設定ディレクトリを開く",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "アプリケーションのカスタム設定を含むディレクトリを開きます",
|
||||
"GameListContextMenuCacheManagement": "キャッシュ管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "解像度:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "カスタム (非推奨)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "ネイティブ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (非推奨)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "アスペクト比:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "すべて",
|
||||
"SettingsTabLoggingEnableDebugLogs": "デバッグログを有効にする",
|
||||
"SettingsTabInput": "入力",
|
||||
"SettingsTabInputEnableDockedMode": "ドッキングモード",
|
||||
"SettingsTabSystemEnableDockedMode": "ドッキングモード",
|
||||
"SettingsTabInputDirectKeyboardAccess": "キーボード直接アクセス",
|
||||
"SettingsButtonDelete": "削除",
|
||||
"SettingsButtonSave": "セーブ",
|
||||
"SettingsButtonClose": "閉じる",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "プロファイルを削除中",
|
||||
"DialogProfileDeleteProfileMessage": "このアクションは元に戻せません. 本当に続けてよろしいですか?",
|
||||
"DialogWarning": "警告",
|
||||
"DialogCustomSettingsDeleteMessage": "次のカスタム設定を削除しようとしています:\n\n{0}\n\n続行してもよろしいですか?",
|
||||
"DialogPPTCDeletionMessage": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?",
|
||||
"DialogPPTCDeletionErrorMessage": "PPTC キャッシュ破棄エラー {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "次のすべてのPPTCデータを削除しようとしています:\n\n{0}\n\n続行してもよろしいですか?",
|
||||
"DialogShaderDeletionMessage": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?",
|
||||
"DialogShaderDeletionErrorMessage": "シェーダーキャッシュ破棄エラー {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "エラーが発生しました",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "選択されたファイルはこのタイトル用のアップデートではありません!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "警告 - バックエンドスレッディング",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "このオプションの変更を完全に適用するには Ryujinx の再起動が必要です. プラットフォームによっては, Ryujinx のものを使用する前に手動でドライバ自身のマルチスレッディングを無効にする必要があるかもしれません.",
|
||||
"DialogModManagerDeletionWarningMessage": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "機能",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "타이틀 업데이트 관리 창 열기",
|
||||
"GameListContextMenuManageDlc": "DLC 관리",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC 관리 창 열기",
|
||||
"GameListContextMenuManageCustomSettings": "사용자 지정 설정 파일 관리",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "선택한 애플리케이션에 대한 사용자 지정 설정을 관리합니다",
|
||||
"GameListContextMenuCustomSettingsOpen": "사용자 지정 설정 디렉토리 열기",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "애플리케이션의 사용자 지정 설정이 포함된 디렉토리를 엽니다",
|
||||
"GameListContextMenuCacheManagement": "캐시 관리",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 시작에서 부팅 시 PPTC가 다시 빌드하도록 트리거",
|
||||
@@ -175,11 +179,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8배",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16배",
|
||||
"SettingsTabGraphicsResolutionScale": "해상도 배율 :",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "사용자 정의(권장하지 않음)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "원본(720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2배(1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3배(2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (권장하지 않음)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "종횡비 :",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -210,8 +215,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "모두",
|
||||
"SettingsTabLoggingEnableDebugLogs": "디버그 로그 활성화",
|
||||
"SettingsTabInput": "입력",
|
||||
"SettingsTabInputEnableDockedMode": "도킹 모드",
|
||||
"SettingsTabSystemEnableDockedMode": "도킹 모드",
|
||||
"SettingsTabInputDirectKeyboardAccess": "직접 키보드 접속",
|
||||
"SettingsButtonDelete": "삭제",
|
||||
"SettingsButtonSave": "저장",
|
||||
"SettingsButtonClose": "닫기",
|
||||
"SettingsButtonOk": "확인",
|
||||
@@ -490,9 +496,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "프로필 삭제",
|
||||
"DialogProfileDeleteProfileMessage": "이 작업은 되돌릴 수 없습니다. 계속하겠습니까?",
|
||||
"DialogWarning": "경고",
|
||||
"DialogCustomSettingsDeleteMessage": "다음에 대한 사용자 지정 설정을 삭제하려고 합니다:\n\n{0}\n\n계속 진행하시겠습니까?",
|
||||
"DialogPPTCDeletionMessage": "다음 부팅 시, PPTC 재구축을 대기열에 추가 :\n\n{0}\n\n계속하겠습니까?",
|
||||
"DialogPPTCDeletionErrorMessage": "{0}에서 PPTC 캐시 삭제 오류 : {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "다음에서 모든 PPTC 데이터를 삭제하려고 합니다:\n\n{0}\n\n계속 진행하시겠습니까?",
|
||||
"DialogShaderDeletionMessage": "다음에 대한 셰이더 캐시 삭제 :\n\n{0}\n\n계속하겠습니까?",
|
||||
"DialogShaderDeletionErrorMessage": "{0}에서 셰이더 캐시 제거 오류 : {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx에 오류 발생",
|
||||
@@ -531,7 +538,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "다른 게임을 시작하기 전에 에뮬레이션을 중지하거나 에뮬레이터를 닫으세요.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "지정된 파일에 선택한 제목에 대한 업데이트가 포함되어 있지 않습니다!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "경고 - 후단부 스레딩",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "변경 사항을 완전히 적용하려면 이 옵션을 변경한 후, Ryujinx를 다시 시작해야 합니다. 플랫폼에 따라 Ryujinx를 사용할 때 드라이버 자체의 멀티스레딩을 수동으로 비활성화해야 할 수도 있습니다.",
|
||||
"DialogModManagerDeletionWarningMessage": "해당 Mod를 삭제하려고 합니다: {0}\n\n정말로 삭제하시겠습니까?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "해당 타이틀에 대한 모든 Mod들을 삭제하려고 합니다.\n\n정말로 삭제하시겠습니까?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "기능",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania aktualizacjami danej aplikacji",
|
||||
"GameListContextMenuManageDlc": "Zarządzaj dodatkową zawartością (DLC)",
|
||||
"GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania dodatkową zawartością",
|
||||
"GameListContextMenuManageCustomSettings": "Zarządzaj Plikiem Ustawień Niestandardowych",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Zarządzaj ustawieniami niestandardowymi dla wybranej Aplikacji",
|
||||
"GameListContextMenuCustomSettingsOpen": "Otwórz Katalog Ustawień Niestandardowych",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Otwórz katalog zawierający ustawienia niestandardowe Aplikacji",
|
||||
"GameListContextMenuCacheManagement": "Zarządzanie Cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Skalowanie rozdzielczości:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Niestandardowa (Niezalecane)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Natywna (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (niezalecane)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Format obrazu:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystko",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Włącz dzienniki zdarzeń do debugowania",
|
||||
"SettingsTabInput": "Sterowanie",
|
||||
"SettingsTabInputEnableDockedMode": "Tryb zadokowany",
|
||||
"SettingsTabSystemEnableDockedMode": "Tryb zadokowany",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Bezpośredni dostęp do klawiatury",
|
||||
"SettingsButtonDelete": "Usuń",
|
||||
"SettingsButtonSave": "Zapisz",
|
||||
"SettingsButtonClose": "Zamknij",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Usuwanie Profilu",
|
||||
"DialogProfileDeleteProfileMessage": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?",
|
||||
"DialogWarning": "Uwaga",
|
||||
"DialogCustomSettingsDeleteMessage": "Zamierzasz usunąć ustawienia niestandardowe dla:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"DialogPPTCDeletionMessage": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"DialogPPTCDeletionErrorMessage": "Błąd czyszczenia cache PPTC w {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Zamierzasz usunąć wszystkie dane PPTC z:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"DialogShaderDeletionMessage": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?",
|
||||
"DialogShaderDeletionErrorMessage": "Błąd czyszczenia cache Shaderów w {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx napotkał błąd",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Ostrzeżenie — Wątki Backend",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Funkcje",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Abre a janela de gerenciamento de atualizações",
|
||||
"GameListContextMenuManageDlc": "Gerenciar DLCs",
|
||||
"GameListContextMenuManageDlcToolTip": "Abre a janela de gerenciamento de DLCs",
|
||||
"GameListContextMenuManageCustomSettings": "Gerenciar Arquivo de Configurações Personalizadas",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Gerenciar as configurações personalizadas para a Aplicação selecionada",
|
||||
"GameListContextMenuCustomSettingsOpen": "Abrir Diretório de Configurações Personalizadas",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Abrir o diretório que contém as configurações personalizadas da Aplicação",
|
||||
"GameListContextMenuCacheManagement": "Gerenciamento de cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo",
|
||||
@@ -175,11 +179,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Escala de resolução:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Customizada (não recomendado)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (não recomendado)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Proporção:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -210,8 +215,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Todos",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Habilitar logs de depuração",
|
||||
"SettingsTabInput": "Controle",
|
||||
"SettingsTabInputEnableDockedMode": "Habilitar modo TV",
|
||||
"SettingsTabSystemEnableDockedMode": "Habilitar modo TV",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Acesso direto ao teclado",
|
||||
"SettingsButtonDelete": "Excluir",
|
||||
"SettingsButtonSave": "Salvar",
|
||||
"SettingsButtonClose": "Fechar",
|
||||
"SettingsButtonOk": "OK",
|
||||
@@ -490,9 +496,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Apagando perfil",
|
||||
"DialogProfileDeleteProfileMessage": "Essa ação é irreversível, tem certeza que deseja continuar?",
|
||||
"DialogWarning": "Alerta",
|
||||
"DialogCustomSettingsDeleteMessage": "Você está prestes a excluir as configurações personalizadas para:\n\n{0}\n\nTem certeza de que deseja continuar?",
|
||||
"DialogPPTCDeletionMessage": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?",
|
||||
"DialogPPTCDeletionErrorMessage": "Erro apagando cache PPTC em {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Você está prestes a excluir todos os dados PPTC de:\n\n{0}\n\nTem certeza de que deseja continuar?",
|
||||
"DialogShaderDeletionMessage": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?",
|
||||
"DialogShaderDeletionErrorMessage": "Erro apagando o cache de Shader em {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx encontrou um erro",
|
||||
@@ -531,7 +538,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Recursos",
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлениями приложения",
|
||||
"GameListContextMenuManageDlc": "Управление DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Открывает окно управления DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Управление файлом пользовательских настроек",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Управление пользовательскими настройками для выбранного приложения",
|
||||
"GameListContextMenuCustomSettingsOpen": "Открыть каталог пользовательских настроек",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Открыть каталог, содержащий пользовательские настройки приложения",
|
||||
"GameListContextMenuCacheManagement": "Управление кэшем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.",
|
||||
@@ -194,11 +198,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Масштабирование:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Пользовательское (не рекомендуется)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Нативное (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (не рекомендуется)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Соотношение сторон:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -229,8 +234,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Всё",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Включить журнал отладки",
|
||||
"SettingsTabInput": "Управление",
|
||||
"SettingsTabInputEnableDockedMode": "Стационарный режим",
|
||||
"SettingsTabSystemEnableDockedMode": "Стационарный режим",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Прямой ввод клавиатуры",
|
||||
"SettingsButtonDelete": "Удалить",
|
||||
"SettingsButtonSave": "Сохранить",
|
||||
"SettingsButtonClose": "Закрыть",
|
||||
"SettingsButtonOk": "Ок",
|
||||
@@ -514,9 +520,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Удаление профиля",
|
||||
"DialogProfileDeleteProfileMessage": "Это действие необратимо. Вы уверены, что хотите продолжить?",
|
||||
"DialogWarning": "Внимание",
|
||||
"DialogCustomSettingsDeleteMessage": "Вы собираетесь удалить пользовательские настройки для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogPPTCDeletionMessage": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogPPTCDeletionErrorMessage": "Ошибка очистки кэша PPTC в {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Вы собираетесь удалить все данные PPTC из:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку",
|
||||
@@ -555,7 +562,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновлений для выбранного приложения",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Предупреждение: многопоточность в бэкенде",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Функции & Улучшения",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "เปิดหน้าต่างการจัดการการอัพเดตหัวข้อ",
|
||||
"GameListContextMenuManageDlc": "จัดการ DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "เปิดหน้าต่างจัดการ DLC",
|
||||
"GameListContextMenuManageCustomSettings": "จัดการไฟล์การตั้งค่าที่กำหนดเอง",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "จัดการการตั้งค่าที่กำหนดเองสำหรับแอปพลิเคชันที่เลือก",
|
||||
"GameListContextMenuCustomSettingsOpen": "เปิดไดเรกทอรีการตั้งค่าที่กำหนดเอง",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "เปิดไดเรกทอรีที่มีการตั้งค่าที่กำหนดเองของแอปพลิเคชัน",
|
||||
"GameListContextMenuCacheManagement": "จัดการ แคช",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "เพิ่มเข้าคิวงาน PPTC ที่สร้างใหม่",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "ทริกเกอร์ PPTC ให้สร้างใหม่ในเวลาบูตเมื่อเปิดตัวเกมครั้งถัดไป",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "อัตราส่วนความละเอียด:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "กำหนดเอง (ไม่แนะนำ)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "พื้นฐานของระบบ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (ไม่แนะนำ)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "อัตราส่วนภาพ:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "ทั้งหมด",
|
||||
"SettingsTabLoggingEnableDebugLogs": "เปิดใช้งาน ประวัติแก้ไขข้อบกพร่อง",
|
||||
"SettingsTabInput": "ป้อนข้อมูล",
|
||||
"SettingsTabInputEnableDockedMode": "ด็อกโหมด",
|
||||
"SettingsTabSystemEnableDockedMode": "ด็อกโหมด",
|
||||
"SettingsTabInputDirectKeyboardAccess": "เข้าถึงคีย์บอร์ดโดยตรง",
|
||||
"SettingsButtonDelete": "ลบ",
|
||||
"SettingsButtonSave": "บันทึก",
|
||||
"SettingsButtonClose": "ปิด",
|
||||
"SettingsButtonOk": "ตกลง",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "กำลังลบโปรไฟล์",
|
||||
"DialogProfileDeleteProfileMessage": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogWarning": "คำเตือน",
|
||||
"DialogCustomSettingsDeleteMessage": "คุณกำลังจะลบการตั้งค่าที่กำหนดเองสำหรับ:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"DialogPPTCDeletionMessage": "คุณกำลังจะจัดคิวการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogPPTCDeletionErrorMessage": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "คุณกำลังจะลบข้อมูล PPTC ทั้งหมดจาก:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"DialogShaderDeletionMessage": "คุณกำลังจะลบ เชเดอร์แคช:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogShaderDeletionErrorMessage": "เกิดข้อผิดพลาดในการล้าง เชเดอร์แคช {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "รียูจินซ์ พบข้อผิดพลาด",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น",
|
||||
"DialogUpdateAddUpdateErrorMessage": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "คำเตือน - การทำเธรดแบ็กเอนด์",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "รียูจินซ์ ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ รียูจินซ์ ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ",
|
||||
"DialogModManagerDeletionWarningMessage": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "คุณสมบัติ",
|
||||
|
||||
@@ -66,6 +66,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Oyun Güncelleme Yönetim Penceresini Açar",
|
||||
"GameListContextMenuManageDlc": "DLC'leri Yönet",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC yönetim penceresini açar",
|
||||
"GameListContextMenuManageCustomSettings": "Özel Ayarlar Dosyasını Yönet",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Seçilen Uygulama için özel ayarları yönetin",
|
||||
"GameListContextMenuCustomSettingsOpen": "Özel Ayarlar Dizinini Aç",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Uygulamanın özel ayarlarını içeren dizini açın",
|
||||
"GameListContextMenuCacheManagement": "Önbellek Yönetimi",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır",
|
||||
@@ -172,11 +176,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Çözünürlük Ölçeği:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Özel (Tavsiye Edilmez)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Yerel (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Tavsiye Edilmez)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "En-Boy Oranı:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -207,8 +212,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Hepsi",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Hata Ayıklama Loglarını Etkinleştir",
|
||||
"SettingsTabInput": "Giriş Yöntemi",
|
||||
"SettingsTabInputEnableDockedMode": "Docked Modu Etkinleştir",
|
||||
"SettingsTabSystemEnableDockedMode": "Docked Modu Etkinleştir",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Doğrudan Klavye Erişimi",
|
||||
"SettingsButtonDelete": "Sil",
|
||||
"SettingsButtonSave": "Kaydet",
|
||||
"SettingsButtonClose": "Kapat",
|
||||
"SettingsButtonOk": "Tamam",
|
||||
@@ -487,9 +493,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Profil Siliniyor",
|
||||
"DialogProfileDeleteProfileMessage": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?",
|
||||
"DialogWarning": "Uyarı",
|
||||
"DialogCustomSettingsDeleteMessage": "Şunun için özel ayarları silmek üzeresiniz:\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogPPTCDeletionMessage": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogPPTCDeletionErrorMessage": "Belirtilen PPTC cache temizlenirken hata {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Şuradan tüm PPTC verilerini silmek üzeresiniz:\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogShaderDeletionMessage": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
|
||||
"DialogShaderDeletionErrorMessage": "Belirtilen Shader cache temizlenirken hata {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx bir hata ile karşılaştı",
|
||||
@@ -528,7 +535,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Uyarı - Backend Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.",
|
||||
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Özellikler",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Відкриває вікно керування оновленням заголовка",
|
||||
"GameListContextMenuManageDlc": "Керування DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Відкриває вікно керування DLC",
|
||||
"GameListContextMenuManageCustomSettings": "Керувати файлом користувацьких налаштувань",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "Керувати користувацькими налаштуваннями для вибраного застосунку",
|
||||
"GameListContextMenuCustomSettingsOpen": "Відкрити каталог користувацьких налаштувань",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "Відкрити каталог, що містить користувацькі налаштування застосунку",
|
||||
"GameListContextMenuCacheManagement": "Керування кешем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми",
|
||||
@@ -175,11 +179,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Роздільна здатність:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Користувацька (не рекомендовано)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Стандартний (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Не рекомендується)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Співвідношення сторін:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -210,8 +215,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Все",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Увімкнути журнали налагодження",
|
||||
"SettingsTabInput": "Введення",
|
||||
"SettingsTabInputEnableDockedMode": "Режим док-станції",
|
||||
"SettingsTabSystemEnableDockedMode": "Режим док-станції",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Прямий доступ з клавіатури",
|
||||
"SettingsButtonDelete": "Видалити",
|
||||
"SettingsButtonSave": "Зберегти",
|
||||
"SettingsButtonClose": "Закрити",
|
||||
"SettingsButtonOk": "Гаразд",
|
||||
@@ -490,9 +496,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "Видалення профілю",
|
||||
"DialogProfileDeleteProfileMessage": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?",
|
||||
"DialogWarning": "Увага",
|
||||
"DialogCustomSettingsDeleteMessage": "Ви збираєтеся видалити користувацькі налаштування для:\n\n{0}\n\nВи впевнені, що хочете продовжити?",
|
||||
"DialogPPTCDeletionMessage": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
|
||||
"DialogPPTCDeletionErrorMessage": "Помилка очищення кешу PPTC на {0}: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "Ви збираєтеся видалити всі дані PPTC з:\n\n{0}\n\nВи впевнені, що хочете продовжити?",
|
||||
"DialogShaderDeletionMessage": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
|
||||
"DialogShaderDeletionErrorMessage": "Помилка очищення кешу шейдерів на {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "У Ryujinx сталася помилка",
|
||||
@@ -531,7 +538,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Зазначений файл не містить оновлення для вибраного заголовка!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Попередження - потокове керування сервером",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Особливості",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "打开游戏更新管理窗口",
|
||||
"GameListContextMenuManageDlc": "管理 DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "打开 DLC 管理窗口",
|
||||
"GameListContextMenuManageCustomSettings": "管理自定义设置文件",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "管理所选应用程序的自定义设置",
|
||||
"GameListContextMenuCustomSettingsOpen": "打开自定义设置目录",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "打开包含应用程序自定义设置的目录",
|
||||
"GameListContextMenuCacheManagement": "缓存管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件",
|
||||
@@ -175,11 +179,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "分辨率缩放:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "自定义(不推荐)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不推荐)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "宽高比:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -210,8 +215,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "全部",
|
||||
"SettingsTabLoggingEnableDebugLogs": "启用调试日志",
|
||||
"SettingsTabInput": "输入",
|
||||
"SettingsTabInputEnableDockedMode": "主机模式",
|
||||
"SettingsTabSystemEnableDockedMode": "主机模式",
|
||||
"SettingsTabInputDirectKeyboardAccess": "直通键盘控制",
|
||||
"SettingsButtonDelete": "删除",
|
||||
"SettingsButtonSave": "保存",
|
||||
"SettingsButtonClose": "关闭",
|
||||
"SettingsButtonOk": "确定",
|
||||
@@ -490,9 +496,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "删除配置文件",
|
||||
"DialogProfileDeleteProfileMessage": "删除后不可恢复,确认删除吗?",
|
||||
"DialogWarning": "警告",
|
||||
"DialogCustomSettingsDeleteMessage": "您即将删除以下项目的自定义设置:\n\n{0}\n\n您确定要继续吗?",
|
||||
"DialogPPTCDeletionMessage": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?",
|
||||
"DialogPPTCDeletionErrorMessage": "清除 {0} 的 PPTC 缓存文件时出错:{1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "您即将清除以下项目的所有 PPTC 数据:\n\n{0}\n\n您确定要继续吗?",
|
||||
"DialogShaderDeletionMessage": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?",
|
||||
"DialogShaderDeletionErrorMessage": "清除 {0} 的着色器缓存文件时出错:{1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx 模拟器发生错误",
|
||||
@@ -531,7 +538,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "请停止模拟或关闭模拟器,再启动另一个游戏。",
|
||||
"DialogUpdateAddUpdateErrorMessage": "选择的文件不是当前游戏的更新!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "警告 - 图形引擎多线程",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "更改此选项后,必须重启 Ryujinx 模拟器才能生效。\n\n当启用图形引擎多线程时,根据显卡不同,您可能需要手动禁用显卡驱动程序自身的多线程(线程优化)。",
|
||||
"DialogModManagerDeletionWarningMessage": "您即将删除 MOD:{0} \n\n确定吗?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "您即将删除该游戏的所有 MOD,\n\n确定吗?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "功能",
|
||||
|
||||
@@ -68,6 +68,10 @@
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "開啟遊戲更新管理視窗",
|
||||
"GameListContextMenuManageDlc": "管理 DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "開啟 DLC 管理視窗",
|
||||
"GameListContextMenuManageCustomSettings": "管理自訂設定檔案",
|
||||
"GameListContextMenuManageCustomSettingsToolTip": "管理所選應用程式的自訂設定",
|
||||
"GameListContextMenuCustomSettingsOpen": "開啟自訂設定目錄",
|
||||
"GameListContextMenuCustomSettingsOpenToolTip": "開啟包含應用程式自訂設定的目錄",
|
||||
"GameListContextMenuCacheManagement": "快取管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建",
|
||||
@@ -175,11 +179,12 @@
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8 倍",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16 倍",
|
||||
"SettingsTabGraphicsResolutionScale": "解析度比例:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "自訂 (不建議使用)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不建議使用)",
|
||||
"SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
|
||||
"SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
|
||||
"SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "顯示長寬比例:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
@@ -210,8 +215,9 @@
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "全部",
|
||||
"SettingsTabLoggingEnableDebugLogs": "啟用偵錯日誌",
|
||||
"SettingsTabInput": "輸入",
|
||||
"SettingsTabInputEnableDockedMode": "底座模式",
|
||||
"SettingsTabSystemEnableDockedMode": "底座模式",
|
||||
"SettingsTabInputDirectKeyboardAccess": "鍵盤直接存取",
|
||||
"SettingsButtonDelete": "刪除",
|
||||
"SettingsButtonSave": "儲存",
|
||||
"SettingsButtonClose": "關閉",
|
||||
"SettingsButtonOk": "確定",
|
||||
@@ -490,9 +496,10 @@
|
||||
"DialogProfileDeleteProfileTitle": "刪除設定檔",
|
||||
"DialogProfileDeleteProfileMessage": "此動作不可復原,您確定要繼續嗎?",
|
||||
"DialogWarning": "警告",
|
||||
"DialogCustomSettingsDeleteMessage": "您即將刪除以下項目的自訂設定:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogPPTCDeletionMessage": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogPPTCDeletionErrorMessage": "在 {0} 清除 PPTC 快取時出錯: {1}",
|
||||
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
|
||||
"DialogPPTCNukeMessage": "您即將清除以下項目的所有 PPTC 資料:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogShaderDeletionMessage": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?",
|
||||
"DialogShaderDeletionErrorMessage": "在 {0} 清除著色器快取時出錯: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx 遇到錯誤",
|
||||
@@ -531,7 +538,6 @@
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "請停止模擬或關閉模擬器,然後再啟動另一款遊戲。",
|
||||
"DialogUpdateAddUpdateErrorMessage": "指定檔案不包含所選遊戲的更新!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "警告 - 後端執行緒處理中",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "變更此選項後,必須重新啟動 Ryujinx 才能完全生效。使用 Ryujinx 的多執行緒功能時,可能需要手動停用驅動程式本身的多執行緒功能,這取決於您的平台。",
|
||||
"DialogModManagerDeletionWarningMessage": "您將刪除模組: {0}\n\n您確定要繼續嗎?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "您即將刪除此遊戲的所有模組。\n\n您確定要繼續嗎?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "功能",
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace Ryujinx.Headless
|
||||
HideCursorMode = configurationState.HideCursor;
|
||||
|
||||
if (NeedsOverride(nameof(DisablePTC)))
|
||||
DisablePTC = !configurationState.System.EnablePtc;
|
||||
DisablePTC = !configurationState.System.EnablePptc;
|
||||
|
||||
if (NeedsOverride(nameof(EnableInternetAccess)))
|
||||
EnableInternetAccess = configurationState.System.EnableInternetAccess;
|
||||
|
||||
@@ -175,4 +175,18 @@
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="UI\Views\Settings\CustomSettingsSystemView.axaml.cs">
|
||||
<DependentUpon>CustomSettingsSystemView.axaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Update="UI\Views\Settings\CustomSettingsGraphicsView.axaml.cs">
|
||||
<DependentUpon>CustomSettingsGraphicsView.axaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Update="UI\Windows\CustomSettingsWindow.axaml.cs">
|
||||
<DependentUpon>CustomSettingsWindow.axaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Update="UI\Views\Settings\CustomSettingsAudioView.axaml.cs">
|
||||
<DependentUpon>CustomSettingsAudioView.axaml</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -42,6 +42,10 @@
|
||||
Click="OpenDownloadableContentManager_Click"
|
||||
Header="{locale:Locale GameListContextMenuManageDlc}"
|
||||
ToolTip.Tip="{locale:Locale GameListContextMenuManageDlcToolTip}" />
|
||||
<MenuItem
|
||||
Click="OpenCustomSettingsManager_Click"
|
||||
Header="{locale:Locale GameListContextMenuManageCustomSettings}"
|
||||
ToolTip.Tip="{locale:Locale GameListContextMenuManageCustomSettingsToolTip}" />
|
||||
<MenuItem
|
||||
Click="OpenCheatManager_Click"
|
||||
Header="{locale:Locale GameListContextMenuManageCheat}"
|
||||
@@ -51,6 +55,10 @@
|
||||
Header="{locale:Locale GameListContextMenuManageMod}"
|
||||
ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" />
|
||||
<Separator />
|
||||
<MenuItem
|
||||
Click="OpenCustomSettings_Click"
|
||||
Header="{locale:Locale GameListContextMenuCustomSettingsOpen}"
|
||||
ToolTip.Tip="{locale:Locale GameListContextMenuCustomSettingsOpenToolTip}" />
|
||||
<MenuItem
|
||||
Click="OpenModsDirectory_Click"
|
||||
Header="{locale:Locale GameListContextMenuOpenModsDirectory}"
|
||||
|
||||
@@ -103,6 +103,23 @@ namespace Ryujinx.Ava.UI.Controls
|
||||
}
|
||||
}
|
||||
|
||||
public async void OpenCustomSettingsManager_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||
|
||||
if (viewModel?.SelectedApplication != null)
|
||||
{
|
||||
await new CustomSettingsWindow(
|
||||
viewModel.VirtualFileSystem,
|
||||
viewModel.SelectedApplication.IdString,
|
||||
viewModel.SelectedApplication.Name,
|
||||
viewModel.SelectedApplication.Icon,
|
||||
viewModel.SelectedApplication.Path).ShowDialog(viewModel.TopLevel as Window);
|
||||
|
||||
viewModel.RefreshView();
|
||||
}
|
||||
}
|
||||
|
||||
public async void OpenCheatManager_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||
@@ -157,6 +174,54 @@ namespace Ryujinx.Ava.UI.Controls
|
||||
}
|
||||
}
|
||||
|
||||
public async void ManageCustomSettings_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||
|
||||
if (viewModel?.SelectedApplication != null)
|
||||
{
|
||||
await new CustomSettingsWindow(
|
||||
viewModel.VirtualFileSystem,
|
||||
viewModel.SelectedApplication.IdString,
|
||||
viewModel.SelectedApplication.Name,
|
||||
viewModel.SelectedApplication.Icon,
|
||||
viewModel.SelectedApplication.Path).ShowDialog(viewModel.TopLevel as Window);
|
||||
}
|
||||
}
|
||||
|
||||
public async void DeleteCustomSettings_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||
return;
|
||||
|
||||
UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog(
|
||||
LocaleManager.Instance[LocaleKeys.DialogWarning],
|
||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogCustomSettingsDeleteMessage, viewModel.SelectedApplication.Name)
|
||||
);
|
||||
|
||||
if (result == UserResult.Yes)
|
||||
{
|
||||
CustomSettingsHelper.DeleteCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(viewModel.SelectedApplication.Id));
|
||||
}
|
||||
}
|
||||
|
||||
public void OpenCustomSettings_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||
|
||||
if (viewModel?.SelectedApplication != null)
|
||||
{
|
||||
string customConfigDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString);
|
||||
|
||||
if (!Directory.Exists(customConfigDir))
|
||||
{
|
||||
Directory.CreateDirectory(customConfigDir);
|
||||
}
|
||||
|
||||
OpenHelper.OpenFolder(customConfigDir);
|
||||
}
|
||||
}
|
||||
|
||||
public async void PurgePtcCache_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
|
||||
|
||||
@@ -0,0 +1,359 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Threading;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Audio.Backends.OpenAL;
|
||||
using Ryujinx.Audio.Backends.SDL3;
|
||||
using Ryujinx.Audio.Backends.SoundIo;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Graphics.Vulkan;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
using Ryujinx.UI.Common.Helper;
|
||||
using Ryujinx.UI.Common.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ryujinx.Ava.UI.ViewModels
|
||||
{
|
||||
public partial class CustomSettingsViewModel : BaseModel
|
||||
{
|
||||
[ObservableProperty]
|
||||
private bool _isVulkanAvailable = true;
|
||||
private readonly List<string> _gpuIds = [];
|
||||
|
||||
private int ComputePreferredGpuIndex(string PreferredGpu)
|
||||
{
|
||||
return _gpuIds.Contains(PreferredGpu) ? _gpuIds.IndexOf(PreferredGpu) : 0;
|
||||
}
|
||||
|
||||
private string ComputePreferredGpu(int PreferredGpuIndex)
|
||||
{
|
||||
return _gpuIds.ElementAtOrDefault(PreferredGpuIndex);
|
||||
}
|
||||
|
||||
private int ComputeResScaleIndex(float ResScale)
|
||||
{
|
||||
if (ResScale <= 0.5f)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (ResScale <= 0.75f)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (int)Math.Ceiling(ResScale) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
private float ComputeResScale(int ResScaleIndex)
|
||||
{
|
||||
switch (ResScaleIndex)
|
||||
{
|
||||
case 0:
|
||||
return 0.5f;
|
||||
case 1:
|
||||
return 0.75f;
|
||||
case 2:
|
||||
return 1.0f;
|
||||
case 3:
|
||||
return 2.0f;
|
||||
case 4:
|
||||
return 3.0f;
|
||||
case 5:
|
||||
return 4.0f;
|
||||
default:
|
||||
return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
private int ComputeMaxAnisotropyIndex(float MaxAnisotropy)
|
||||
{
|
||||
return MaxAnisotropy == -1.0f ? 0 : (int)(MathF.Log2(MaxAnisotropy));
|
||||
}
|
||||
|
||||
private float ComputeMaxAnisotropy(int MaxAnisotropyIndex)
|
||||
{
|
||||
switch (MaxAnisotropyIndex)
|
||||
{
|
||||
case 0:
|
||||
return -1.0f;
|
||||
case 1:
|
||||
return 2.0f;
|
||||
case 2:
|
||||
return 4.0f;
|
||||
case 3:
|
||||
return 8.0f;
|
||||
case 4:
|
||||
return 16.0f;
|
||||
default:
|
||||
return 2.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMacOS => OperatingSystem.IsMacOS();
|
||||
public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS();
|
||||
public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
|
||||
public ulong ApplicationIdBase { get; set; }
|
||||
public string ApplicationName { get; set; }
|
||||
public Bitmap GameIcon { get; set; }
|
||||
public ObservableCollection<ComboBoxItem> AvailableGpus { get; set; }
|
||||
public CustomSettingsModel CustomSettingsModel { get; set; }
|
||||
public event Action CloseWindow;
|
||||
|
||||
// System settings
|
||||
public bool EnableDockedMode { get; set; }
|
||||
public int SystemLanguage { get; set; }
|
||||
public int SystemRegion { get; set; }
|
||||
public int DramSize { get; set; }
|
||||
public bool EnableFsIntegrityChecks { get; set; }
|
||||
public bool IgnoreMissingServices { get; set; }
|
||||
|
||||
// CPU settings
|
||||
public bool EnablePptc { get; set; }
|
||||
public bool EnableLowPowerPptc { get; set; }
|
||||
public int MemoryManagerMode { get; set; }
|
||||
public bool UseHypervisor { get; set; }
|
||||
public long TurboMultiplier
|
||||
{
|
||||
get;
|
||||
set
|
||||
{
|
||||
if (field != value)
|
||||
{
|
||||
field = value;
|
||||
|
||||
OnPropertyChanged();
|
||||
OnPropertyChanged((nameof(TurboMultiplierPercentageText)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string TurboMultiplierPercentageText => $"{TurboMultiplier}%";
|
||||
|
||||
// Graphics settings
|
||||
public int VSyncMode { get; set; }
|
||||
public int GraphicsBackend { get; set; }
|
||||
public int PreferredGpuIndex { get; set; }
|
||||
public bool EnableShaderCache { get; set; }
|
||||
public bool EnableTextureRecompression { get; set; }
|
||||
public bool EnableMacroHLE { get; set; }
|
||||
public bool EnableColorSpacePassthrough { get; set; }
|
||||
public bool ColorSpacePassthroughAvailable => IsMacOS;
|
||||
public int ResScaleIndex { get; set; }
|
||||
public int MaxAnisotropyIndex { get; set; }
|
||||
public int BackendThreading { get; set; }
|
||||
|
||||
// Audio settings
|
||||
public bool IsOpenAlEnabled { get; set; }
|
||||
public bool IsSoundIoEnabled { get; set; }
|
||||
public bool IsSDL3Enabled { get; set; }
|
||||
public AudioBackend AudioBackend { get; set; }
|
||||
|
||||
public float Volume
|
||||
{
|
||||
get;
|
||||
set
|
||||
{
|
||||
field = value;
|
||||
|
||||
ConfigurationState.Instance.System.AudioVolume.Value = field / 100;
|
||||
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public CustomSettingsViewModel(string titleId, byte[] icon, string titleName)
|
||||
{
|
||||
AvailableGpus = [];
|
||||
ApplicationIdBase = ulong.Parse(titleId, NumberStyles.HexNumber);
|
||||
CustomSettingsModel = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase));
|
||||
|
||||
Task.Run(CheckSoundBackends);
|
||||
|
||||
if (icon is { Length: > 0 })
|
||||
{
|
||||
using MemoryStream ms = new(icon);
|
||||
GameIcon = new Bitmap(ms);
|
||||
}
|
||||
|
||||
if (Program.PreviewerDetached)
|
||||
{
|
||||
Task.Run(LoadAvailableGpus);
|
||||
LoadCurrentConfiguration();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CheckSoundBackends()
|
||||
{
|
||||
IsOpenAlEnabled = OpenALHardwareDeviceDriver.IsSupported;
|
||||
IsSoundIoEnabled = SoundIoHardwareDeviceDriver.IsSupported;
|
||||
IsSDL3Enabled = SDL3HardwareDeviceDriver.IsSupported;
|
||||
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
OnPropertyChanged(nameof(IsOpenAlEnabled));
|
||||
OnPropertyChanged(nameof(IsSoundIoEnabled));
|
||||
OnPropertyChanged(nameof(IsSDL3Enabled));
|
||||
});
|
||||
}
|
||||
|
||||
private async Task LoadAvailableGpus()
|
||||
{
|
||||
AvailableGpus.Clear();
|
||||
|
||||
var devices = VulkanRenderer.GetPhysicalDevices();
|
||||
|
||||
if (devices.Length == 0)
|
||||
{
|
||||
IsVulkanAvailable = false;
|
||||
GraphicsBackend = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var device in devices)
|
||||
{
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
_gpuIds.Add(device.Id);
|
||||
|
||||
AvailableGpus.Add(new ComboBoxItem { Content = $"{device.Name} {(device.IsDiscrete ? "(dGPU)" : "")}" });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// GPU configuration needs to be loaded during the async method or it will always return 0.
|
||||
PreferredGpuIndex = ComputePreferredGpuIndex(ConfigurationState.Instance.Graphics.PreferredGpu.Value);
|
||||
|
||||
Dispatcher.UIThread.Post(() => OnPropertyChanged(nameof(PreferredGpuIndex)));
|
||||
}
|
||||
public void LoadCurrentConfiguration()
|
||||
{
|
||||
ConfigurationState config = ConfigurationState.Instance;
|
||||
|
||||
if (!CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase)))
|
||||
{
|
||||
// Load all settings from global configuration
|
||||
EnableDockedMode = config.System.EnableDockedMode.Value;
|
||||
SystemLanguage = (int)config.System.Language.Value;
|
||||
SystemRegion = (int)config.System.Region.Value;
|
||||
VSyncMode = (int)config.Graphics.VSyncMode.Value;
|
||||
DramSize = (int)config.System.DramSize.Value;
|
||||
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks.Value;
|
||||
IgnoreMissingServices = config.System.IgnoreMissingServices.Value;
|
||||
EnablePptc = config.System.EnablePptc.Value;
|
||||
EnableLowPowerPptc = config.System.EnableLowPowerPptc.Value;
|
||||
MemoryManagerMode = (int)config.System.MemoryManagerMode.Value;
|
||||
UseHypervisor = config.System.UseHypervisor.Value;
|
||||
TurboMultiplier = config.System.TickScalar.Value;
|
||||
GraphicsBackend = (int)config.Graphics.GraphicsBackend.Value;
|
||||
PreferredGpuIndex = ComputePreferredGpuIndex(config.Graphics.PreferredGpu.Value);
|
||||
EnableShaderCache = config.Graphics.EnableShaderCache.Value;
|
||||
EnableTextureRecompression = config.Graphics.EnableTextureRecompression.Value;
|
||||
EnableMacroHLE = config.Graphics.EnableMacroHLE.Value;
|
||||
EnableColorSpacePassthrough = config.Graphics.EnableColorSpacePassthrough.Value;
|
||||
ResScaleIndex = ComputeResScaleIndex(config.Graphics.ResScale);
|
||||
MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(config.Graphics.MaxAnisotropy);
|
||||
BackendThreading = (int)config.Graphics.BackendThreading.Value;
|
||||
AudioBackend = config.System.AudioBackend.Value;
|
||||
Volume = config.System.AudioVolume * 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Load all settings from custom configuration
|
||||
EnableDockedMode = CustomSettingsModel.EnableDockedMode;
|
||||
SystemLanguage = CustomSettingsModel.SystemLanguage;
|
||||
SystemRegion = CustomSettingsModel.SystemRegion;
|
||||
VSyncMode = CustomSettingsModel.VSyncMode;
|
||||
DramSize = CustomSettingsModel.DramSize;
|
||||
EnableFsIntegrityChecks = CustomSettingsModel.EnableFsIntegrityChecks;
|
||||
IgnoreMissingServices = CustomSettingsModel.IgnoreMissingServices;
|
||||
EnablePptc = CustomSettingsModel.EnablePptc;
|
||||
EnableLowPowerPptc = CustomSettingsModel.EnableLowPowerPptc;
|
||||
MemoryManagerMode = CustomSettingsModel.MemoryManagerMode;
|
||||
UseHypervisor = CustomSettingsModel.UseHypervisor;
|
||||
TurboMultiplier = CustomSettingsModel.TickScalar;
|
||||
GraphicsBackend = CustomSettingsModel.GraphicsBackend;
|
||||
PreferredGpuIndex = ComputePreferredGpuIndex(CustomSettingsModel.PreferredGpu);
|
||||
EnableShaderCache = CustomSettingsModel.EnableShaderCache;
|
||||
EnableTextureRecompression = CustomSettingsModel.EnableTextureRecompression;
|
||||
EnableMacroHLE = CustomSettingsModel.EnableMacroHLE;
|
||||
EnableColorSpacePassthrough = CustomSettingsModel.EnableColorSpacePassthrough;
|
||||
ResScaleIndex = ComputeResScaleIndex(CustomSettingsModel.ResScale);
|
||||
MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(CustomSettingsModel.MaxAnisotropy);
|
||||
BackendThreading = CustomSettingsModel.BackendThreading;
|
||||
AudioBackend = CustomSettingsModel.AudioBackend;
|
||||
Volume = CustomSettingsModel.AudioVolume * 100;
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteSettings()
|
||||
{
|
||||
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase)))
|
||||
{
|
||||
CustomSettingsHelper.DeleteCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase));
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveSettings()
|
||||
{
|
||||
CustomSettingsModel.HasCustomSettings = true;
|
||||
CustomSettingsModel.EnableDockedMode = EnableDockedMode;
|
||||
CustomSettingsModel.SystemLanguage = SystemLanguage;
|
||||
CustomSettingsModel.SystemRegion = SystemRegion;
|
||||
CustomSettingsModel.VSyncMode = VSyncMode;
|
||||
CustomSettingsModel.DramSize = DramSize;
|
||||
CustomSettingsModel.EnableFsIntegrityChecks = EnableFsIntegrityChecks;
|
||||
CustomSettingsModel.IgnoreMissingServices = IgnoreMissingServices;
|
||||
CustomSettingsModel.EnablePptc = EnablePptc;
|
||||
CustomSettingsModel.EnableLowPowerPptc = EnableLowPowerPptc;
|
||||
CustomSettingsModel.MemoryManagerMode = MemoryManagerMode;
|
||||
CustomSettingsModel.UseHypervisor = UseHypervisor;
|
||||
CustomSettingsModel.TickScalar = TurboMultiplier;
|
||||
CustomSettingsModel.GraphicsBackend = GraphicsBackend;
|
||||
CustomSettingsModel.PreferredGpu = ComputePreferredGpu(PreferredGpuIndex);
|
||||
CustomSettingsModel.EnableShaderCache = EnableShaderCache;
|
||||
CustomSettingsModel.EnableTextureRecompression = EnableTextureRecompression;
|
||||
CustomSettingsModel.EnableMacroHLE = EnableMacroHLE;
|
||||
CustomSettingsModel.ResScale = ComputeResScale(ResScaleIndex);
|
||||
CustomSettingsModel.MaxAnisotropy = ComputeMaxAnisotropy(MaxAnisotropyIndex);
|
||||
CustomSettingsModel.BackendThreading = BackendThreading;
|
||||
CustomSettingsModel.AudioBackend = AudioBackend;
|
||||
CustomSettingsModel.AudioVolume = Volume / 100;
|
||||
CustomSettingsHelper.SaveCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase), CustomSettingsModel);
|
||||
}
|
||||
|
||||
public async void DeleteButton()
|
||||
{
|
||||
UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog(
|
||||
LocaleManager.Instance[LocaleKeys.DialogWarning],
|
||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogCustomSettingsDeleteMessage, ApplicationName)
|
||||
);
|
||||
|
||||
if (result == UserResult.Yes)
|
||||
{
|
||||
DeleteSettings();
|
||||
CloseWindow?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
public void CancelButton()
|
||||
{
|
||||
CloseWindow?.Invoke();
|
||||
}
|
||||
|
||||
public void SaveButton()
|
||||
{
|
||||
SaveSettings();
|
||||
CloseWindow?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ using Ryujinx.Graphics.Vulkan;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.HLE.HOS.Services.Time.TimeZone;
|
||||
using Ryujinx.HLE.HOS.SystemState;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
using Ryujinx.UI.Common.Configuration.System;
|
||||
using System;
|
||||
@@ -47,8 +48,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
private readonly Dictionary<string, string> _networkInterfaces;
|
||||
|
||||
private int _resolutionScale;
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isVulkanAvailable = true;
|
||||
|
||||
@@ -69,51 +68,79 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
private bool _enableGDBStub;
|
||||
|
||||
public int ResolutionScale
|
||||
private int ComputePreferredGpuIndex(string PreferredGpu)
|
||||
{
|
||||
get => _resolutionScale;
|
||||
set
|
||||
{
|
||||
_resolutionScale = value;
|
||||
return _gpuIds.Contains(PreferredGpu) ? _gpuIds.IndexOf(PreferredGpu) : 0;
|
||||
}
|
||||
|
||||
OnPropertyChanged(nameof(CustomResolutionScale));
|
||||
OnPropertyChanged(nameof(IsCustomResolutionScaleActive));
|
||||
private string ComputePreferredGpu(int PreferredGpuIndex)
|
||||
{
|
||||
return _gpuIds.ElementAtOrDefault((int)PreferredGpuIndex);
|
||||
}
|
||||
|
||||
private int ComputeResScaleIndex(float ResScale)
|
||||
{
|
||||
if (ResScale <= 0.5f)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if (ResScale <= 0.75f)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (int)Math.Ceiling(ResScale) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
public int GraphicsBackendMultithreadingIndex
|
||||
private float ComputeResScale(int ResScaleIndex)
|
||||
{
|
||||
get;
|
||||
set
|
||||
switch (ResScaleIndex)
|
||||
{
|
||||
field = value;
|
||||
|
||||
if (field != (int)ConfigurationState.Instance.Graphics.BackendThreading.Value)
|
||||
{
|
||||
Dispatcher.UIThread.InvokeAsync(() =>
|
||||
ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningMessage],
|
||||
"",
|
||||
"",
|
||||
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
||||
LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningTitle])
|
||||
);
|
||||
}
|
||||
|
||||
OnPropertyChanged();
|
||||
case 0:
|
||||
return 0.5f;
|
||||
case 1:
|
||||
return 0.75f;
|
||||
case 2:
|
||||
return 1.0f;
|
||||
case 3:
|
||||
return 2.0f;
|
||||
case 4:
|
||||
return 3.0f;
|
||||
case 5:
|
||||
return 4.0f;
|
||||
default:
|
||||
return 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public float CustomResolutionScale
|
||||
private int ComputeMaxAnisotropyIndex(float MaxAnisotropy)
|
||||
{
|
||||
get;
|
||||
set
|
||||
{
|
||||
field = value;
|
||||
return MaxAnisotropy == -1.0f ? 0 : (int)(MathF.Log2(MaxAnisotropy));
|
||||
}
|
||||
|
||||
OnPropertyChanged();
|
||||
private float ComputeMaxAnisotropy(int MaxAnisotropyIndex)
|
||||
{
|
||||
switch (MaxAnisotropyIndex)
|
||||
{
|
||||
case 0:
|
||||
return -1.0f;
|
||||
case 1:
|
||||
return 2.0f;
|
||||
case 2:
|
||||
return 4.0f;
|
||||
case 3:
|
||||
return 8.0f;
|
||||
case 4:
|
||||
return 16.0f;
|
||||
default:
|
||||
return 2.0f;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMacOS => OperatingSystem.IsMacOS();
|
||||
|
||||
public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS();
|
||||
|
||||
public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
|
||||
@@ -140,8 +167,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMacOS => OperatingSystem.IsMacOS();
|
||||
|
||||
public bool EnableDiscordIntegration { get; set; }
|
||||
public bool CheckUpdatesOnStart { get; set; }
|
||||
public bool ShowConfirmExit { get; set; }
|
||||
@@ -260,10 +285,9 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
public bool IsSoundIoEnabled { get; set; }
|
||||
public bool IsSDL3Enabled { get; set; }
|
||||
public bool IsAudioToolboxEnabled { get; set; }
|
||||
public bool IsCustomResolutionScaleActive => _resolutionScale == 4;
|
||||
public bool IsScalingFilterActive => _scalingFilter == (int)Ryujinx.Common.Configuration.ScalingFilter.Fsr;
|
||||
|
||||
public bool IsVulkanSelected => GraphicsBackendIndex == 0;
|
||||
public bool IsVulkanSelected => GraphicsBackend == 0;
|
||||
public bool UseHypervisor { get; set; }
|
||||
public bool DisableP2P { get; set; }
|
||||
|
||||
@@ -292,8 +316,10 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
public int Region { get; set; }
|
||||
public int FsGlobalAccessLogMode { get; set; }
|
||||
public int AudioBackend { get; set; }
|
||||
public int MaxAnisotropy { get; set; }
|
||||
public int ResScaleIndex { get; set; }
|
||||
public int MaxAnisotropyIndex { get; set; }
|
||||
public int AspectRatio { get; set; }
|
||||
public int BackendThreading { get; set; }
|
||||
public int AntiAliasingEffect { get; set; }
|
||||
public string ScalingFilterLevelText => ScalingFilterLevel.ToString("0");
|
||||
|
||||
@@ -312,7 +338,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
public int MemoryMode { get; set; }
|
||||
public int BaseStyleIndex { get; set; }
|
||||
|
||||
public int GraphicsBackendIndex
|
||||
public int GraphicsBackend
|
||||
{
|
||||
get;
|
||||
set
|
||||
@@ -484,7 +510,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
if (devices.Length == 0)
|
||||
{
|
||||
IsVulkanAvailable = false;
|
||||
GraphicsBackendIndex = 1;
|
||||
GraphicsBackend = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -500,8 +526,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
}
|
||||
|
||||
// GPU configuration needs to be loaded during the async method or it will always return 0.
|
||||
PreferredGpuIndex = _gpuIds.Contains(ConfigurationState.Instance.Graphics.PreferredGpu) ?
|
||||
_gpuIds.IndexOf(ConfigurationState.Instance.Graphics.PreferredGpu) : 0;
|
||||
PreferredGpuIndex = ComputePreferredGpuIndex(ConfigurationState.Instance.Graphics.PreferredGpu.Value);
|
||||
|
||||
Dispatcher.UIThread.Post(() => OnPropertyChanged(nameof(PreferredGpuIndex)));
|
||||
}
|
||||
@@ -618,24 +643,23 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
SkipUserProfiles = config.System.SkipUserProfilesManager;
|
||||
|
||||
// CPU
|
||||
EnablePptc = config.System.EnablePtc;
|
||||
EnableLowPowerPptc = config.System.EnableLowPowerPtc;
|
||||
EnablePptc = config.System.EnablePptc;
|
||||
EnableLowPowerPptc = config.System.EnableLowPowerPptc;
|
||||
MemoryMode = (int)config.System.MemoryManagerMode.Value;
|
||||
UseHypervisor = config.System.UseHypervisor;
|
||||
TurboMultiplier = config.System.TickScalar;
|
||||
|
||||
// Graphics
|
||||
GraphicsBackendIndex = (int)config.Graphics.GraphicsBackend.Value;
|
||||
GraphicsBackend = (int)config.Graphics.GraphicsBackend.Value;
|
||||
// Physical devices are queried asynchronously hence the preferred index config value is loaded in LoadAvailableGpus().
|
||||
EnableShaderCache = config.Graphics.EnableShaderCache;
|
||||
EnableTextureRecompression = config.Graphics.EnableTextureRecompression;
|
||||
EnableMacroHLE = config.Graphics.EnableMacroHLE;
|
||||
EnableColorSpacePassthrough = config.Graphics.EnableColorSpacePassthrough;
|
||||
ResolutionScale = config.Graphics.ResScale == -1 ? 4 : config.Graphics.ResScale - 1;
|
||||
CustomResolutionScale = config.Graphics.ResScaleCustom;
|
||||
MaxAnisotropy = config.Graphics.MaxAnisotropy == -1 ? 0 : (int)(MathF.Log2(config.Graphics.MaxAnisotropy));
|
||||
ResScaleIndex = ComputeResScaleIndex(config.Graphics.ResScale);
|
||||
MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(config.Graphics.MaxAnisotropy);
|
||||
AspectRatio = (int)config.Graphics.AspectRatio.Value;
|
||||
GraphicsBackendMultithreadingIndex = (int)config.Graphics.BackendThreading.Value;
|
||||
BackendThreading = (int)config.Graphics.BackendThreading.Value;
|
||||
ShaderDumpPath = config.Graphics.ShadersDumpPath;
|
||||
TextureDumpPath = config.Graphics.TexturesDumpPath.Value;
|
||||
TextureDumpFormatIndex = (int)config.Graphics.TexturesDumpFileFormat.Value;
|
||||
@@ -738,33 +762,31 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
config.System.SkipUserProfilesManager.Value = SkipUserProfiles;
|
||||
|
||||
// CPU
|
||||
config.System.EnablePtc.Value = EnablePptc;
|
||||
config.System.EnableLowPowerPtc.Value = EnableLowPowerPptc;
|
||||
config.System.EnablePptc.Value = EnablePptc;
|
||||
config.System.EnableLowPowerPptc.Value = EnableLowPowerPptc;
|
||||
config.System.MemoryManagerMode.Value = (MemoryManagerMode)MemoryMode;
|
||||
config.System.UseHypervisor.Value = UseHypervisor;
|
||||
config.System.TickScalar.Value = TurboMultiplier;
|
||||
|
||||
// Graphics
|
||||
config.Graphics.GraphicsBackend.Value = (GraphicsBackend)GraphicsBackendIndex;
|
||||
config.Graphics.GraphicsBackend.Value = (GraphicsBackend)GraphicsBackend;
|
||||
config.Graphics.PreferredGpu.Value = _gpuIds.ElementAtOrDefault(PreferredGpuIndex);
|
||||
config.Graphics.EnableShaderCache.Value = EnableShaderCache;
|
||||
config.Graphics.EnableTextureRecompression.Value = EnableTextureRecompression;
|
||||
config.Graphics.EnableMacroHLE.Value = EnableMacroHLE;
|
||||
config.Graphics.EnableColorSpacePassthrough.Value = EnableColorSpacePassthrough;
|
||||
config.Graphics.ResScale.Value = ResolutionScale == 4 ? -1 : ResolutionScale + 1;
|
||||
config.Graphics.ResScaleCustom.Value = CustomResolutionScale;
|
||||
config.Graphics.MaxAnisotropy.Value = MaxAnisotropy == 0 ? -1 : MathF.Pow(2, MaxAnisotropy);
|
||||
config.Graphics.ResScale.Value = ComputeResScale(ResScaleIndex);
|
||||
config.Graphics.MaxAnisotropy.Value = ComputeMaxAnisotropy(MaxAnisotropyIndex);
|
||||
config.Graphics.AspectRatio.Value = (AspectRatio)AspectRatio;
|
||||
config.Graphics.AntiAliasing.Value = (AntiAliasing)AntiAliasingEffect;
|
||||
config.Graphics.ScalingFilter.Value = (ScalingFilter)ScalingFilter;
|
||||
config.Graphics.ScalingFilterLevel.Value = ScalingFilterLevel;
|
||||
|
||||
if (ConfigurationState.Instance.Graphics.BackendThreading != (BackendThreading)GraphicsBackendMultithreadingIndex)
|
||||
if (ConfigurationState.Instance.Graphics.BackendThreading != (BackendThreading)BackendThreading)
|
||||
{
|
||||
DriverUtilities.ToggleOGLThreading(GraphicsBackendMultithreadingIndex == (int)BackendThreading.Off);
|
||||
DriverUtilities.ToggleOGLThreading(BackendThreading == (int)Ryujinx.Common.Configuration.BackendThreading.Off);
|
||||
}
|
||||
|
||||
config.Graphics.BackendThreading.Value = (BackendThreading)GraphicsBackendMultithreadingIndex;
|
||||
config.Graphics.BackendThreading.Value = (BackendThreading)BackendThreading;
|
||||
config.Graphics.ShadersDumpPath.Value = ShaderDumpPath;
|
||||
config.Graphics.TexturesDumpPath.Value = TextureDumpPath;
|
||||
config.Graphics.TexturesDumpFileFormat.Value = (TextureFileFormat)TextureDumpFormatIndex;
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
<UserControl
|
||||
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsAudioView"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
||||
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
mc:Ignorable="d"
|
||||
x:DataType="viewModels:CustomSettingsViewModel">
|
||||
<Design.DataContext>
|
||||
<viewModels:SettingsViewModel />
|
||||
</Design.DataContext>
|
||||
<ScrollViewer
|
||||
Name="AudioPage"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<Border Classes="settings">
|
||||
<StackPanel
|
||||
Margin="10"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical"
|
||||
Spacing="10">
|
||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabAudio}" />
|
||||
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemAudioBackend}"
|
||||
ToolTip.Tip="{locale:Locale AudioBackendTooltip}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding AudioBackend}"
|
||||
Width="350"
|
||||
HorizontalContentAlignment="Left">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemAudioBackendDummy}" />
|
||||
<ComboBoxItem
|
||||
IsEnabled="{Binding IsOpenAlEnabled}"
|
||||
Content="{locale:Locale SettingsTabSystemAudioBackendOpenAL}" />
|
||||
<ComboBoxItem
|
||||
IsEnabled="{Binding IsSoundIoEnabled}"
|
||||
Content="{locale:Locale SettingsTabSystemAudioBackendSoundIO}" />
|
||||
<ComboBoxItem
|
||||
IsEnabled="{Binding IsSDL3Enabled}"
|
||||
Content="{locale:Locale SettingsTabSystemAudioBackendSDL3}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemAudioVolume}"
|
||||
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
|
||||
Width="250" />
|
||||
<ui:FANumberBox Value="{Binding Volume}"
|
||||
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
|
||||
Width="350"
|
||||
SmallChange="1"
|
||||
LargeChange="10"
|
||||
SimpleNumberFormat="F0"
|
||||
SpinButtonPlacementMode="Inline"
|
||||
Minimum="0"
|
||||
Maximum="100" />
|
||||
</StackPanel>
|
||||
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
|
||||
<controls:SliderScroll Value="{Binding Volume}"
|
||||
Margin="250,0,0,0"
|
||||
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
|
||||
Minimum="0"
|
||||
Maximum="100"
|
||||
SmallChange="1"
|
||||
TickFrequency="1"
|
||||
IsSnapToTickEnabled="True"
|
||||
LargeChange="10"
|
||||
Width="350" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,12 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Settings
|
||||
{
|
||||
public partial class CustomSettingsAudioView : UserControl
|
||||
{
|
||||
public CustomSettingsAudioView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
<UserControl
|
||||
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsCPUView"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||
mc:Ignorable="d"
|
||||
x:DataType="viewModels:CustomSettingsViewModel">
|
||||
<Design.DataContext>
|
||||
<viewModels:SettingsViewModel />
|
||||
</Design.DataContext>
|
||||
<ScrollViewer
|
||||
Name="CpuPage"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<Border Classes="settings">
|
||||
<StackPanel
|
||||
Margin="10"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical"
|
||||
Spacing="10">
|
||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuCache}" />
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical">
|
||||
<CheckBox IsChecked="{Binding EnablePptc}">
|
||||
<TextBlock Text="{locale:Locale SettingsTabSystemEnablePptc}"
|
||||
ToolTip.Tip="{locale:Locale PptcToggleTooltip}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableLowPowerPptc}">
|
||||
<TextBlock Text="{locale:Locale SettingsTabSystemEnableLowPowerPptc}"
|
||||
ToolTip.Tip="{locale:Locale LowPowerPptcToggleTooltip}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<Separator Height="1" />
|
||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuMemory}" />
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemMemoryManagerMode}"
|
||||
ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding MemoryManagerMode}"
|
||||
ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
|
||||
HorizontalContentAlignment="Left"
|
||||
Width="350">
|
||||
<ComboBoxItem
|
||||
ToolTip.Tip="{locale:Locale MemoryManagerSoftwareTooltip}"
|
||||
Content="{locale:Locale SettingsTabSystemMemoryManagerModeSoftware}" />
|
||||
<ComboBoxItem
|
||||
ToolTip.Tip="{locale:Locale MemoryManagerHostTooltip}"
|
||||
Content="{locale:Locale SettingsTabSystemMemoryManagerModeHost}" />
|
||||
<ComboBoxItem
|
||||
ToolTip.Tip="{locale:Locale MemoryManagerUnsafeTooltip}"
|
||||
Content="{locale:Locale SettingsTabSystemMemoryManagerModeHostUnchecked}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<CheckBox IsChecked="{Binding UseHypervisor}"
|
||||
IsVisible="{Binding IsHypervisorAvailable}"
|
||||
ToolTip.Tip="{locale:Locale UseHypervisorTooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsTabSystemUseHypervisor}"
|
||||
ToolTip.Tip="{locale:Locale UseHypervisorTooltip}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<Separator Height="1" />
|
||||
<StackPanel
|
||||
Orientation="Vertical"
|
||||
Spacing="5">
|
||||
<TextBlock
|
||||
Classes="h1"
|
||||
Text="{locale:Locale SettingsTabSystemHacks}" />
|
||||
<TextBlock
|
||||
Foreground="{DynamicResource SecondaryTextColor}"
|
||||
TextDecorations="Underline"
|
||||
Text="{locale:Locale SettingsTabSystemHacksNote}" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical">
|
||||
<StackPanel Margin="0,0,0,10"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Background="Transparent"
|
||||
Text="{locale:Locale SettingsTabSystemTurboMultiplier}"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierToolTip}"
|
||||
Width="250" />
|
||||
<ui:FANumberBox ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierValueToolTip}"
|
||||
Value="{Binding TurboMultiplier}"
|
||||
Width="165"
|
||||
SmallChange="1.0"
|
||||
LargeChange="10"
|
||||
SimpleNumberFormat="F0"
|
||||
SpinButtonPlacementMode="Hidden"
|
||||
Minimum="50"
|
||||
Maximum="1000" />
|
||||
<Slider Value="{Binding TurboMultiplier}"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierValueToolTip}"
|
||||
MinWidth="175"
|
||||
Margin="10,-3,0,0"
|
||||
Height="32"
|
||||
Padding="0,-5"
|
||||
TickFrequency="1"
|
||||
IsSnapToTickEnabled="True"
|
||||
LargeChange="10"
|
||||
SmallChange="1"
|
||||
VerticalAlignment="Center"
|
||||
Minimum="50"
|
||||
Maximum="1000" />
|
||||
<TextBlock Margin="5,0"
|
||||
Width="40"
|
||||
Text="{Binding TurboMultiplierPercentageText}"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,12 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Settings
|
||||
{
|
||||
public partial class CustomSettingsCPUView : UserControl
|
||||
{
|
||||
public CustomSettingsCPUView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
<UserControl
|
||||
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsGraphicsView"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
||||
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
Design.Width="1000"
|
||||
mc:Ignorable="d"
|
||||
x:DataType="viewModels:CustomSettingsViewModel">
|
||||
<Design.DataContext>
|
||||
<viewModels:SettingsViewModel />
|
||||
</Design.DataContext>
|
||||
<ScrollViewer
|
||||
Name="GraphicsPage"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<Border Classes="settings">
|
||||
<StackPanel
|
||||
Margin="10"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical"
|
||||
Spacing="10">
|
||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsAPI}" />
|
||||
<StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsBackend}"
|
||||
Width="250" />
|
||||
<ComboBox Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
|
||||
SelectedIndex="{Binding GraphicsBackend}">
|
||||
<ComboBoxItem
|
||||
IsVisible="{Binding IsVulkanAvailable}"
|
||||
Content="Vulkan" />
|
||||
<ComboBoxItem
|
||||
IsEnabled="{Binding IsOpenGLAvailable}"
|
||||
Content="OpenGL" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
|
||||
Width="250" />
|
||||
<ComboBox Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
|
||||
SelectedIndex="{Binding PreferredGpuIndex}"
|
||||
ItemsSource="{Binding AvailableGpus}"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<Separator Height="1" />
|
||||
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsFeatures}" />
|
||||
<StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<CheckBox IsChecked="{Binding EnableShaderCache}"
|
||||
ToolTip.Tip="{locale:Locale ShaderCacheToggleTooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsTabGraphicsEnableShaderCache}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableTextureRecompression}"
|
||||
ToolTip.Tip="{locale:Locale SettingsEnableTextureRecompressionTooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsEnableTextureRecompression}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableMacroHLE}"
|
||||
ToolTip.Tip="{locale:Locale SettingsEnableMacroHLETooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsEnableMacroHLE}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableColorSpacePassthrough}"
|
||||
IsVisible="{Binding ColorSpacePassthroughAvailable}"
|
||||
ToolTip.Tip="{locale:Locale SettingsEnableColorSpacePassthroughTooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsEnableColorSpacePassthrough}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding ResScaleIndex}"
|
||||
Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale05x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale075x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale10x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale20x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale30x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale40x}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding MaxAnisotropyIndex}"
|
||||
Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsAnisotropicFilteringAuto}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering2x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering4x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering8x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering16x}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical"
|
||||
Spacing="10">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale GraphicsBackendThreadingTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsBackendMultithreading}"
|
||||
Width="250" />
|
||||
<ComboBox Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
|
||||
SelectedIndex="{Binding BackendThreading}">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale CommonAuto}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale CommonOff}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale CommonOn}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,12 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Settings
|
||||
{
|
||||
public partial class CustomSettingsGraphicsView : UserControl
|
||||
{
|
||||
public CustomSettingsGraphicsView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
<UserControl
|
||||
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsSystemView"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
|
||||
mc:Ignorable="d"
|
||||
x:DataType="viewModels:CustomSettingsViewModel">
|
||||
<UserControl.Resources>
|
||||
<helpers:TimeZoneConverter x:Key="TimeZone" />
|
||||
</UserControl.Resources>
|
||||
<Design.DataContext>
|
||||
<viewModels:SettingsViewModel />
|
||||
</Design.DataContext>
|
||||
<ScrollViewer
|
||||
Name="SystemPage"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<Border Classes="settings">
|
||||
<StackPanel
|
||||
Margin="10"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical"
|
||||
Spacing="10">
|
||||
<TextBlock
|
||||
Classes="h1"
|
||||
Text="{locale:Locale SettingsTabSystemCore}" />
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
Orientation="Vertical">
|
||||
<StackPanel
|
||||
Margin="0,0,0,10"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemSystemRegion}"
|
||||
Width="250" />
|
||||
<ComboBox
|
||||
SelectedIndex="{Binding SystemRegion}"
|
||||
ToolTip.Tip="{locale:Locale RegionTooltip}"
|
||||
HorizontalContentAlignment="Left"
|
||||
Width="350">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionUSA}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionEurope}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionAustralia}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionChina}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionKorea}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemRegionTaiwan}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="0,0,0,10"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemSystemLanguage}"
|
||||
ToolTip.Tip="{locale:Locale LanguageTooltip}"
|
||||
Width="250" />
|
||||
<ComboBox
|
||||
SelectedIndex="{Binding SystemLanguage}"
|
||||
ToolTip.Tip="{locale:Locale LanguageTooltip}"
|
||||
HorizontalContentAlignment="Left"
|
||||
Width="350">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageGerman}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageItalian}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageSpanish}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageChinese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageKorean}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageDutch}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguagePortuguese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageRussian}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
|
||||
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableDockedMode}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabSystemEnableDockedMode}"
|
||||
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}" />
|
||||
</CheckBox>
|
||||
<StackPanel Margin="0,10,0,10"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemVSyncMode}"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabSystemVSyncModeTooltip}"
|
||||
Width="250" />
|
||||
<ComboBox
|
||||
SelectedIndex="{Binding VSyncMode}"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabSystemVSyncModeTooltip}"
|
||||
HorizontalContentAlignment="Left"
|
||||
Width="350">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemVSyncModeSwitch}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemVSyncModeUnbounded}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<Separator Height="1" />
|
||||
<StackPanel
|
||||
Orientation="Vertical"
|
||||
Spacing="5">
|
||||
<TextBlock
|
||||
Classes="h1"
|
||||
Text="{locale:Locale SettingsTabSystemHacks}" />
|
||||
<TextBlock
|
||||
Foreground="{DynamicResource SecondaryTextColor}"
|
||||
Text="{locale:Locale SettingsTabSystemHacksNote}" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemDramSize}"
|
||||
Width="250" />
|
||||
<ComboBox
|
||||
SelectedIndex="{Binding DramSize}"
|
||||
ToolTip.Tip="{locale:Locale DRamTooltip}"
|
||||
HorizontalContentAlignment="Left"
|
||||
Width="350">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemDramSize4GiB}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemDramSize6GiB}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemDramSize8GiB}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemDramSize10GiB}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabSystemDramSize12GiB}" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="10,0,0,0"
|
||||
HorizontalAlignment="Stretch"
|
||||
Orientation="Vertical">
|
||||
<CheckBox
|
||||
IsChecked="{Binding IgnoreMissingServices}"
|
||||
ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
|
||||
<TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,12 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Settings
|
||||
{
|
||||
public partial class CustomSettingsSystemView : UserControl
|
||||
{
|
||||
public CustomSettingsSystemView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@
|
||||
<ComboBox Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
|
||||
SelectedIndex="{Binding GraphicsBackendIndex}">
|
||||
SelectedIndex="{Binding GraphicsBackend}">
|
||||
<ComboBoxItem
|
||||
IsVisible="{Binding IsVulkanAvailable}"
|
||||
Content="Vulkan" />
|
||||
@@ -45,7 +45,7 @@
|
||||
Content="OpenGL" />
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" IsVisible="{Binding IsVulkanSelected}">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center"
|
||||
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
|
||||
@@ -83,33 +83,23 @@
|
||||
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding ResolutionScale}"
|
||||
<ComboBox SelectedIndex="{Binding ResScaleIndex}"
|
||||
Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScaleNative}" />
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale05x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale2x}" />
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale075x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale3x}" />
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale10x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale4x}" />
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale20x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScaleCustom}" />
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale30x}" />
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale SettingsTabGraphicsResolutionScale40x}" />
|
||||
</ComboBox>
|
||||
<ui:FANumberBox
|
||||
Margin="10,0,0,0"
|
||||
ToolTip.Tip="{locale:Locale ResolutionScaleEntryTooltip}"
|
||||
MinWidth="150"
|
||||
SmallChange="0.1"
|
||||
LargeChange="1"
|
||||
SimpleNumberFormat="F2"
|
||||
SpinButtonPlacementMode="Inline"
|
||||
IsVisible="{Binding IsCustomResolutionScaleActive}"
|
||||
Maximum="10"
|
||||
Minimum="0.1"
|
||||
Value="{Binding CustomResolutionScale}" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
HorizontalAlignment="Stretch"
|
||||
@@ -186,7 +176,7 @@
|
||||
ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
|
||||
Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
|
||||
Width="250" />
|
||||
<ComboBox SelectedIndex="{Binding MaxAnisotropy}"
|
||||
<ComboBox SelectedIndex="{Binding MaxAnisotropyIndex}"
|
||||
Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
|
||||
@@ -241,7 +231,7 @@
|
||||
<ComboBox Width="350"
|
||||
HorizontalContentAlignment="Left"
|
||||
ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
|
||||
SelectedIndex="{Binding GraphicsBackendMultithreadingIndex}">
|
||||
SelectedIndex="{Binding BackendThreading}">
|
||||
<ComboBoxItem
|
||||
Content="{locale:Locale CommonAuto}" />
|
||||
<ComboBoxItem
|
||||
|
||||
@@ -34,13 +34,6 @@
|
||||
<StackPanel
|
||||
Orientation="Horizontal"
|
||||
Spacing="10">
|
||||
<CheckBox
|
||||
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}"
|
||||
MinWidth="0"
|
||||
IsChecked="{Binding EnableDockedMode}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabInputEnableDockedMode}" />
|
||||
</CheckBox>
|
||||
<CheckBox
|
||||
ToolTip.Tip="{locale:Locale DirectKeyboardTooltip}"
|
||||
IsChecked="{Binding EnableKeyboard}">
|
||||
@@ -59,4 +52,4 @@
|
||||
</Panel>
|
||||
</Border>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
</UserControl>
|
||||
|
||||
@@ -158,18 +158,21 @@
|
||||
Width="350"
|
||||
ToolTip.Tip="{locale:Locale TimeTooltip}" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<CheckBox IsChecked="{Binding MatchSystemTime}">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Text="{locale:Locale SettingsTabSystemSystemTimeMatch}"
|
||||
ToolTip.Tip="{locale:Locale MatchTimeTooltip}"
|
||||
Width="250"/>
|
||||
<CheckBox
|
||||
VerticalAlignment="Center"
|
||||
IsChecked="{Binding MatchSystemTime}"
|
||||
ToolTip.Tip="{locale:Locale MatchTimeTooltip}"/>
|
||||
</StackPanel>
|
||||
<Separator />
|
||||
ToolTip.Tip="{locale:Locale MatchTimeTooltip}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
|
||||
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
|
||||
</CheckBox>
|
||||
<CheckBox IsChecked="{Binding EnableDockedMode}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabSystemEnableDockedMode}"
|
||||
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}" />
|
||||
</CheckBox>
|
||||
<StackPanel Margin="0,10,0,10"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
@@ -227,11 +230,6 @@
|
||||
Width="40"
|
||||
Text="{Binding CustomVSyncIntervalPercentageText}"/>
|
||||
</StackPanel>
|
||||
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
|
||||
<TextBlock
|
||||
Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
|
||||
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<Separator Height="1" />
|
||||
<StackPanel
|
||||
|
||||
@@ -6,15 +6,19 @@ using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.HLE.HOS;
|
||||
using Ryujinx.UI.App.Common;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Windows
|
||||
{
|
||||
public partial class CheatWindow : StyleableWindow
|
||||
{
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int value, int size);
|
||||
|
||||
private readonly string _enabledCheatsPath;
|
||||
public bool NoCheatsFound { get; }
|
||||
|
||||
@@ -28,6 +32,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
DataContext = this;
|
||||
|
||||
InitializeComponent();
|
||||
ApplyDarkTitleBar();
|
||||
|
||||
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
|
||||
}
|
||||
@@ -46,6 +51,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
BuildId = ApplicationData.GetBuildId(virtualFileSystem, checkLevel, titlePath);
|
||||
|
||||
InitializeComponent();
|
||||
ApplyDarkTitleBar();
|
||||
|
||||
string modsBasePath = ModLoader.GetModsBasePath();
|
||||
string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, titleId);
|
||||
@@ -100,6 +106,50 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
|
||||
}
|
||||
|
||||
private void ApplyDarkTitleBar()
|
||||
{
|
||||
if (!OperatingSystem.IsWindows())
|
||||
return;
|
||||
|
||||
// Apply immediately if possible
|
||||
if (PlatformImpl != null)
|
||||
{
|
||||
ForceDarkTitleBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Wait until PlatformImpl is available
|
||||
this.PropertyChanged += (_, e) =>
|
||||
{
|
||||
if (e.Property.Name == nameof(PlatformImpl) && PlatformImpl != null)
|
||||
{
|
||||
ForceDarkTitleBar();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Backup: Try it even when the window is active
|
||||
this.Activated += (_, _) => ForceDarkTitleBar();
|
||||
}
|
||||
|
||||
private void ForceDarkTitleBar()
|
||||
{
|
||||
try
|
||||
{
|
||||
var handleField = PlatformImpl?.GetType().GetProperty("Handle")?.GetValue(PlatformImpl);
|
||||
if (handleField?.GetType().GetProperty("Handle")?.GetValue(handleField) is IntPtr hwnd && hwnd != IntPtr.Zero)
|
||||
{
|
||||
int dark = 1;
|
||||
DwmSetWindowAttribute(hwnd, 20, ref dark, sizeof(int)); // Modern Windows
|
||||
DwmSetWindowAttribute(hwnd, 19, ref dark, sizeof(int)); // Older Windows 10
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Silent fail
|
||||
}
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
if (NoCheatsFound)
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
<window:StyleableWindow
|
||||
x:Class="Ryujinx.Ava.UI.Windows.CustomSettingsWindow"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
xmlns:settings="clr-namespace:Ryujinx.Ava.UI.Views.Settings"
|
||||
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
|
||||
Width="1100"
|
||||
Height="927"
|
||||
MinWidth="800"
|
||||
MinHeight="480"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
x:DataType="viewModels:CustomSettingsViewModel"
|
||||
mc:Ignorable="d"
|
||||
Focusable="True">
|
||||
<Design.DataContext>
|
||||
<viewModels:CustomSettingsViewModel />
|
||||
</Design.DataContext>
|
||||
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="600"
|
||||
RowDefinitions="Auto,*,Auto">
|
||||
<ContentPresenter
|
||||
x:Name="ContentPresenter"
|
||||
Grid.Row="1"
|
||||
IsVisible="False"
|
||||
KeyboardNavigation.IsTabStop="False"/>
|
||||
<Grid Name="Pages" IsVisible="False" Grid.Row="2">
|
||||
<settings:CustomSettingsSystemView Name="SystemPage" />
|
||||
<settings:CustomSettingsCPUView Name="CpuPage" />
|
||||
<settings:CustomSettingsGraphicsView Name="GraphicsPage" />
|
||||
<settings:CustomSettingsAudioView Name="AudioPage" />
|
||||
</Grid>
|
||||
<ui:FANavigationView
|
||||
Grid.Row="1"
|
||||
IsSettingsVisible="False"
|
||||
Name="NavPanel"
|
||||
IsBackEnabled="False"
|
||||
PaneDisplayMode="Left"
|
||||
Margin="2,10,10,0"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalAlignment="Stretch"
|
||||
OpenPaneLength="200">
|
||||
<ui:FANavigationView.PaneHeader>
|
||||
<Border
|
||||
Margin="10"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
ClipToBounds="True"
|
||||
CornerRadius="4">
|
||||
<Grid RowDefinitions="Auto,Auto">
|
||||
<Grid Grid.Column="0">
|
||||
<Image
|
||||
Grid.Row="0"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Top"
|
||||
Source="{Binding GameIcon}"
|
||||
Width="140"
|
||||
Height="140">
|
||||
</Image>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Border>
|
||||
</ui:FANavigationView.PaneHeader>
|
||||
<ui:FANavigationView.MenuItems>
|
||||
<ui:FANavigationViewItem
|
||||
Content="{locale:Locale SettingsTabSystem}"
|
||||
Tag="SystemPage"
|
||||
IconSource="Settings" />
|
||||
<ui:FANavigationViewItem
|
||||
Content="{locale:Locale SettingsTabCpu}"
|
||||
Tag="CpuPage">
|
||||
<ui:FANavigationViewItem.IconSource>
|
||||
<ui:FAFontIconSource
|
||||
FontFamily="avares://Ryujinx/Assets/Fonts#Segoe Fluent Icons"
|
||||
Glyph="{helpers:GlyphValueConverter Chip}" />
|
||||
</ui:FANavigationViewItem.IconSource>
|
||||
</ui:FANavigationViewItem>
|
||||
<ui:FANavigationViewItem
|
||||
Content="{locale:Locale SettingsTabGraphics}"
|
||||
Tag="GraphicsPage"
|
||||
IconSource="Image" />
|
||||
<ui:FANavigationViewItem
|
||||
Content="{locale:Locale SettingsTabAudio}"
|
||||
IconSource="Audio"
|
||||
Tag="AudioPage" />
|
||||
</ui:FANavigationView.MenuItems>
|
||||
<ui:FANavigationView.Styles>
|
||||
<Style Selector="Grid#PlaceholderGrid">
|
||||
<Setter Property="Height" Value="160" />
|
||||
</Style>
|
||||
<Style Selector="ui|FANavigationViewItem ui|FASymbolIcon">
|
||||
<Setter Property="FlowDirection" Value="LeftToRight" />
|
||||
</Style>
|
||||
</ui:FANavigationView.Styles>
|
||||
</ui:FANavigationView>
|
||||
<ReversibleStackPanel
|
||||
Grid.Row="2"
|
||||
Margin="10"
|
||||
Spacing="10"
|
||||
Orientation="Horizontal"
|
||||
HorizontalAlignment="Right"
|
||||
ReverseOrder="{Binding IsMacOS}">
|
||||
<Button
|
||||
Content="{locale:Locale SettingsButtonDelete}"
|
||||
Command="{Binding DeleteButton}" />
|
||||
<Button
|
||||
Content="{locale:Locale SettingsButtonSave}"
|
||||
Command="{Binding SaveButton}" />
|
||||
<Button
|
||||
HotKey="Escape"
|
||||
Content="{locale:Locale SettingsButtonCancel}"
|
||||
Command="{Binding CancelButton}" />
|
||||
</ReversibleStackPanel>
|
||||
</Grid>
|
||||
</window:StyleableWindow>
|
||||
@@ -0,0 +1,109 @@
|
||||
using Avalonia.Controls;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Windows
|
||||
{
|
||||
public partial class CustomSettingsWindow : StyleableWindow
|
||||
{
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int value, int size);
|
||||
|
||||
internal readonly CustomSettingsViewModel ViewModel;
|
||||
|
||||
public CustomSettingsWindow(VirtualFileSystem virtualFileSystem, string titleId, string titleName, byte[] icon, string titlePath)
|
||||
{
|
||||
Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]} - {titleName} ";
|
||||
DataContext = ViewModel = new CustomSettingsViewModel(titleId,icon,titleName);
|
||||
ViewModel.CloseWindow += Close;
|
||||
InitializeComponent();
|
||||
ApplyDarkTitleBar();
|
||||
Load();
|
||||
}
|
||||
|
||||
private void ApplyDarkTitleBar()
|
||||
{
|
||||
if (!OperatingSystem.IsWindows())
|
||||
return;
|
||||
|
||||
// Apply immediately if possible
|
||||
if (PlatformImpl != null)
|
||||
{
|
||||
ForceDarkTitleBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Wait until PlatformImpl is available
|
||||
this.PropertyChanged += (_, e) =>
|
||||
{
|
||||
if (e.Property.Name == nameof(PlatformImpl) && PlatformImpl != null)
|
||||
{
|
||||
ForceDarkTitleBar();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Backup: Try it even when the window is active
|
||||
this.Activated += (_, _) => ForceDarkTitleBar();
|
||||
}
|
||||
|
||||
private void ForceDarkTitleBar()
|
||||
{
|
||||
try
|
||||
{
|
||||
var handleField = PlatformImpl?.GetType().GetProperty("Handle")?.GetValue(PlatformImpl);
|
||||
if (handleField?.GetType().GetProperty("Handle")?.GetValue(handleField) is IntPtr hwnd && hwnd != IntPtr.Zero)
|
||||
{
|
||||
int dark = 1;
|
||||
DwmSetWindowAttribute(hwnd, 20, ref dark, sizeof(int)); // Modern Windows
|
||||
DwmSetWindowAttribute(hwnd, 19, ref dark, sizeof(int)); // Older Windows 10
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Silent fail
|
||||
}
|
||||
}
|
||||
|
||||
private void Load()
|
||||
{
|
||||
Pages.Children.Clear();
|
||||
NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
|
||||
NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
|
||||
}
|
||||
|
||||
private void NavPanelOnSelectionChanged(object sender, FANavigationViewSelectionChangedEventArgs e)
|
||||
{
|
||||
if (e.SelectedItem is FANavigationViewItem navItem && navItem.Tag is not null)
|
||||
{
|
||||
switch (navItem.Tag.ToString())
|
||||
{
|
||||
case "SystemPage":
|
||||
NavPanel.Content = SystemPage;
|
||||
break;
|
||||
case "CpuPage":
|
||||
NavPanel.Content = CpuPage;
|
||||
break;
|
||||
case "GraphicsPage":
|
||||
NavPanel.Content = GraphicsPage;
|
||||
break;
|
||||
case "AudioPage":
|
||||
NavPanel.Content = AudioPage;
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnClosing(WindowClosingEventArgs e)
|
||||
{
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -570,7 +570,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
public static void UpdateGraphicsConfig()
|
||||
{
|
||||
#pragma warning disable IDE0055 // Disable formatting
|
||||
GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale == -1 ? ConfigurationState.Instance.Graphics.ResScaleCustom : ConfigurationState.Instance.Graphics.ResScale;
|
||||
GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale;
|
||||
GraphicsConfig.MaxAnisotropy = ConfigurationState.Instance.Graphics.MaxAnisotropy;
|
||||
GraphicsConfig.ShadersDumpPath = ConfigurationState.Instance.Graphics.ShadersDumpPath;
|
||||
GraphicsConfig.EnableShaderCache = ConfigurationState.Instance.Graphics.EnableShaderCache;
|
||||
|
||||
Reference in New Issue
Block a user