diff options
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | 33 |
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; |