From 76e8f9ac87c0164f4f09600dcf8b6a5b4d062bf5 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Fri, 27 Aug 2021 21:08:30 +0100 Subject: [PATCH] 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 |= --- Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index ffe2d33ad..6c48fc0ea 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/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; } }