|
|
@@ -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;
|