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:
parent
ee1038e542
commit
76e8f9ac87
1 changed files with 9 additions and 3 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (result != _scales[index])
|
||||||
|
{
|
||||||
|
_scaleChanged = true;
|
||||||
|
|
||||||
_scales[index] = result;
|
_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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue