Bläddra i källkod

Only reupload the texture scale array if it changes. (#2595)

* Only reupload the texture scale array if it changes.

Before, this would be called all the time if any shader needed a scale value. The cost of doing this has increased with threaded-gal, as the scale array is copied to a span pool, and it's was called on pretty much every draw sometimes.

This improves GPU performance in games, scaled or not. Most affected game seems to be Xenoblade Chronicles: Definitive Edition.

* Just use = instead of |=
riperiperi 4 år sedan
förälder
incheckning
76e8f9ac87
1 ändrade filer med 9 tillägg och 3 borttagningar
  1. 9 3
      Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs

+ 9 - 3
Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs

@@ -177,8 +177,6 @@ namespace Ryujinx.Graphics.Gpu.Image
 
             if ((binding.Flags & TextureUsageFlags.NeedsScaleValue) != 0 && texture != null)
             {
-                _scaleChanged |= true;
-
                 switch (stage)
                 {
                     case ShaderStage.Fragment:
@@ -218,7 +216,13 @@ namespace Ryujinx.Graphics.Gpu.Image
                 }
             }
 
-            _scales[index] = result;
+            if (result != _scales[index])
+            {
+                _scaleChanged = true;
+
+                _scales[index] = result;
+            }
+
             return changed;
         }
 
@@ -232,6 +236,8 @@ namespace Ryujinx.Graphics.Gpu.Image
             if (_scaleChanged)
             {
                 _context.Renderer.Pipeline.UpdateRenderScale(stage, _scales, _textureBindings[stageIndex]?.Length ?? 0, _imageBindings[stageIndex]?.Length ?? 0);
+
+                _scaleChanged = false;
             }
         }