aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-06-17 16:28:27 -0300
committerGitHub <noreply@github.com>2023-06-17 16:28:27 -0300
commitf9a538bb0f02b4665f8cccbde0730e08da208024 (patch)
treebf2412f0ddd744302990c541d74c1ba6da8d3669 /src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
parentf92921a6d118aa9c6acdb3ecaa3cd61a19fe341e (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.cs49
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;
}
}