diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-06-17 16:28:27 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-17 16:28:27 -0300 |
commit | f9a538bb0f02b4665f8cccbde0730e08da208024 (patch) | |
tree | bf2412f0ddd744302990c541d74c1ba6da8d3669 /src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs | |
parent | f92921a6d118aa9c6acdb3ecaa3cd61a19fe341e (diff) |
Ensure shader local and shared memory sizes are not zero (#5321)1.1.897
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs index c58e4828..3a46f6e4 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs @@ -8,6 +8,11 @@ namespace Ryujinx.Graphics.Shader.Translation { class ResourceManager { + // Those values are used if the shader as local or shared memory access, + // but for some reason the supplied size was 0. + private const int DefaultLocalMemorySize = 128; + private const int DefaultSharedMemorySize = 4096; + private static readonly string[] _stagePrefixes = new string[] { "cp", "vp", "tcp", "tep", "gp", "fp" }; private readonly IGpuAccessor _gpuAccessor; @@ -23,12 +28,12 @@ namespace Ryujinx.Graphics.Shader.Translation private readonly HashSet<int> _usedConstantBufferBindings; - public int LocalMemoryId { get; } - public int SharedMemoryId { get; } + public int LocalMemoryId { get; private set; } + public int SharedMemoryId { get; private set; } public ShaderProperties Properties => _properties; - public ResourceManager(ShaderStage stage, IGpuAccessor gpuAccessor, ShaderProperties properties, int localMemorySize) + public ResourceManager(ShaderStage stage, IGpuAccessor gpuAccessor, ShaderProperties properties) { _gpuAccessor = gpuAccessor; _properties = properties; @@ -48,21 +53,43 @@ namespace Ryujinx.Graphics.Shader.Translation LocalMemoryId = -1; SharedMemoryId = -1; + } - if (localMemorySize != 0) + public void SetCurrentLocalMemory(int size, bool isUsed) + { + if (isUsed) { - var lmem = new MemoryDefinition("local_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(localMemorySize, sizeof(uint))); + if (size <= 0) + { + size = DefaultLocalMemorySize; + } - LocalMemoryId = properties.AddLocalMemory(lmem); - } + var lmem = new MemoryDefinition("local_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); - int sharedMemorySize = stage == ShaderStage.Compute ? gpuAccessor.QueryComputeSharedMemorySize() : 0; + LocalMemoryId = Properties.AddLocalMemory(lmem); + } + else + { + LocalMemoryId = -1; + } + } - if (sharedMemorySize != 0) + public void SetCurrentSharedMemory(int size, bool isUsed) + { + if (isUsed) { - var smem = new MemoryDefinition("shared_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(sharedMemorySize, sizeof(uint))); + if (size <= 0) + { + size = DefaultSharedMemorySize; + } + + var smem = new MemoryDefinition("shared_memory", AggregateType.Array | AggregateType.U32, BitUtils.DivRoundUp(size, sizeof(uint))); - SharedMemoryId = properties.AddSharedMemory(smem); + SharedMemoryId = Properties.AddSharedMemory(smem); + } + else + { + SharedMemoryId = -1; } } |