diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
index d206aad0b8..0001243d40 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs
@@ -17,8 +17,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
private readonly ResourceCounts _resourceCounts;
private readonly int _stageIndex;
- private readonly int[] _constantBufferBindings;
-
///
/// Creates a new GPU accessor.
///
@@ -28,12 +26,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
_context = context;
_resourceCounts = resourceCounts;
_stageIndex = stageIndex;
-
- if (context.Capabilities.Api != TargetApi.Vulkan)
- {
- _constantBufferBindings = new int[Constants.TotalGpUniformBuffers];
- _constantBufferBindings.AsSpan().Fill(-1);
- }
}
public int QueryBindingConstantBuffer(int index)
@@ -45,15 +37,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
}
else
{
- int binding = _constantBufferBindings[index];
-
- if (binding < 0)
- {
- binding = _resourceCounts.UniformBuffersCount++;
- _constantBufferBindings[index] = binding;
- }
-
- return binding;
+ return _resourceCounts.UniformBuffersCount++;
}
}
diff --git a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
index b31790d342..a2cfbe227a 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs
@@ -17,6 +17,8 @@ namespace Ryujinx.Graphics.Shader.Translation
private readonly HashSet _usedConstantBufferBindings;
+ public ShaderProperties Properties => _properties;
+
public ResourceManager(ShaderStage stage, IGpuAccessor gpuAccessor, ShaderProperties properties)
{
_gpuAccessor = gpuAccessor;
@@ -98,19 +100,6 @@ namespace Ryujinx.Graphics.Shader.Translation
_properties.AddConstantBuffer(binding, new BufferDefinition(BufferLayout.Std140, 0, binding, name, type));
}
- public void InheritFrom(ResourceManager other)
- {
- for (int i = 0; i < other._cbSlotToBindingMap.Length; i++)
- {
- int binding = other._cbSlotToBindingMap[i];
-
- if (binding >= 0)
- {
- _cbSlotToBindingMap[i] = binding;
- }
- }
- }
-
public static string GetShaderStagePrefix(ShaderStage stage)
{
uint index = (uint)stage;
diff --git a/src/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs b/src/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
index 73525cb27c..40a32e2dc0 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
@@ -39,9 +39,9 @@ namespace Ryujinx.Graphics.Shader.Translation
public TranslationOptions Options { get; }
- public ShaderProperties Properties { get; }
+ public ShaderProperties Properties => ResourceManager.Properties;
- public ResourceManager ResourceManager { get; }
+ public ResourceManager ResourceManager { get; set; }
public bool TransformFeedbackEnabled { get; }
@@ -159,8 +159,7 @@ namespace Ryujinx.Graphics.Shader.Translation
_sbSlots = new Dictionary();
_sbSlotsReverse = new Dictionary();
- Properties = new ShaderProperties();
- ResourceManager = new ResourceManager(stage, gpuAccessor, Properties);
+ ResourceManager = new ResourceManager(stage, gpuAccessor, new ShaderProperties());
}
public ShaderConfig(
@@ -429,8 +428,6 @@ namespace Ryujinx.Graphics.Shader.Translation
public void InheritFrom(ShaderConfig other)
{
- ResourceManager.InheritFrom(other.ResourceManager);
-
ClipDistancesWritten |= other.ClipDistancesWritten;
UsedFeatures |= other.UsedFeatures;
diff --git a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
index 4b4cc8d9ff..9647b13f17 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
@@ -155,6 +155,9 @@ namespace Ryujinx.Graphics.Shader.Translation
{
other._config.MergeOutputUserAttributes(_config.UsedOutputAttributes, Enumerable.Empty());
+ // We need to share the resource manager since both shaders accesses the same constant buffers.
+ other._config.ResourceManager = _config.ResourceManager;
+
FunctionCode[] otherCode = EmitShader(other._program, other._config, initializeOutputs: true, out int aStart);
code = Combine(otherCode, code, aStart);