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 |=
This commit is contained in:
riperiperi 2021-08-27 21:08:30 +01:00 committed by GitHub
parent ee1038e542
commit 76e8f9ac87
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

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