aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs33
1 files changed, 19 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
index 97a9eee4..7ac4e12e 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs
@@ -49,6 +49,7 @@ namespace Ryujinx.Graphics.Gpu.Image
private readonly float[] _scales;
private bool _scaleChanged;
+ private int _lastFragmentTotal;
/// <summary>
/// Constructs a new instance of the texture bindings manager.
@@ -288,26 +289,30 @@ namespace Ryujinx.Graphics.Gpu.Image
/// </summary>
private void CommitRenderScale()
{
- if (_scaleChanged)
- {
- int fragmentTotal = 0;
- int total;
+ // Stage 0 total: Compute or Vertex.
+ int total = _textureBindingsCount[0] + _imageBindingsCount[0];
- if (!_isCompute)
- {
- int fragmentIndex = (int)ShaderStage.Fragment - 1;
- fragmentTotal = _textureBindingsCount[fragmentIndex] + _imageBindingsCount[fragmentIndex];
+ int fragmentIndex = (int)ShaderStage.Fragment - 1;
+ int fragmentTotal = _isCompute ? 0 : (_textureBindingsCount[fragmentIndex] + _imageBindingsCount[fragmentIndex]);
- int vertexIndex = (int)ShaderStage.Vertex - 1;
- int vertexTotal = _textureBindingsCount[vertexIndex] + _imageBindingsCount[vertexIndex];
+ if (total != 0 && fragmentTotal != _lastFragmentTotal)
+ {
+ // Must update scales in the support buffer if:
+ // - Vertex stage has bindings.
+ // - Fragment stage binding count has been updated since last render scale update.
- total = fragmentTotal + vertexTotal;
- }
- else
+ _scaleChanged = true;
+ }
+
+ if (_scaleChanged)
+ {
+ if (!_isCompute)
{
- total = _textureBindingsCount[0] + _imageBindingsCount[0];
+ total += fragmentTotal; // Add the fragment bindings to the total.
}
+ _lastFragmentTotal = fragmentTotal;
+
_context.Renderer.Pipeline.UpdateRenderScale(_scales, total, fragmentTotal);
_scaleChanged = false;