aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2022-01-27 17:17:13 +0000
committerGitHub <noreply@github.com>2022-01-27 14:17:13 -0300
commitfd6d3ec88fd7233190388ae6eefd9dc2488453a0 (patch)
treecafbac450c3cb08ff105ceea03f8835a576e62b4
parent0a0a95fd815ad5726783ba10d4d5d9910a0bab73 (diff)
Fix res scale parameters not being updated in vertex shader (#3046)1.1.10
This fixes an issue where the render scale array would not be updated when technically the scales on the flat array were the same, but the start index for the vertex scales was different.
-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;