Simplify resolution scale updates (#5541)

This commit is contained in:
gdkchan 2023-08-14 13:57:39 -03:00 committed by GitHub
parent 33f544fd92
commit 550fd4a733
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 44 deletions

View file

@ -61,8 +61,6 @@ namespace Ryujinx.Graphics.Gpu.Image
private int _textureBufferIndex; private int _textureBufferIndex;
private readonly float[] _scales;
private bool _scaleChanged;
private int _lastFragmentTotal; private int _lastFragmentTotal;
/// <summary> /// <summary>
@ -72,14 +70,12 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <param name="channel">The GPU channel that the texture bindings manager belongs to</param> /// <param name="channel">The GPU channel that the texture bindings manager belongs to</param>
/// <param name="texturePoolCache">Texture pools cache used to get texture pools from</param> /// <param name="texturePoolCache">Texture pools cache used to get texture pools from</param>
/// <param name="samplerPoolCache">Sampler pools cache used to get sampler pools from</param> /// <param name="samplerPoolCache">Sampler pools cache used to get sampler pools from</param>
/// <param name="scales">Array where the scales for the currently bound textures are stored</param>
/// <param name="isCompute">True if the bindings manager is used for the compute engine</param> /// <param name="isCompute">True if the bindings manager is used for the compute engine</param>
public TextureBindingsManager( public TextureBindingsManager(
GpuContext context, GpuContext context,
GpuChannel channel, GpuChannel channel,
TexturePoolCache texturePoolCache, TexturePoolCache texturePoolCache,
SamplerPoolCache samplerPoolCache, SamplerPoolCache samplerPoolCache,
float[] scales,
bool isCompute) bool isCompute)
{ {
_context = context; _context = context;
@ -87,7 +83,6 @@ namespace Ryujinx.Graphics.Gpu.Image
_texturePoolCache = texturePoolCache; _texturePoolCache = texturePoolCache;
_samplerPoolCache = samplerPoolCache; _samplerPoolCache = samplerPoolCache;
_scales = scales;
_isCompute = isCompute; _isCompute = isCompute;
int stages = isCompute ? 1 : Constants.ShaderStages; int stages = isCompute ? 1 : Constants.ShaderStages;
@ -239,12 +234,7 @@ namespace Ryujinx.Graphics.Gpu.Image
} }
} }
if (result != _scales[index]) _context.SupportBufferUpdater.UpdateRenderScale(index, result);
{
_scaleChanged = true;
_scales[index] = result;
}
return changed; return changed;
} }
@ -290,11 +280,6 @@ namespace Ryujinx.Graphics.Gpu.Image
// - Vertex stage has bindings that require scale. // - Vertex stage has bindings that require scale.
// - Fragment stage binding count has been updated since last render scale update. // - Fragment stage binding count has been updated since last render scale update.
_scaleChanged = true;
}
if (_scaleChanged)
{
if (!_isCompute) if (!_isCompute)
{ {
total += fragmentTotal; // Add the fragment bindings to the total. total += fragmentTotal; // Add the fragment bindings to the total.
@ -302,9 +287,7 @@ namespace Ryujinx.Graphics.Gpu.Image
_lastFragmentTotal = fragmentTotal; _lastFragmentTotal = fragmentTotal;
_context.SupportBufferUpdater.UpdateRenderScale(_scales, total, fragmentTotal); _context.SupportBufferUpdater.UpdateRenderScaleFragmentCount(total, fragmentTotal);
_scaleChanged = false;
} }
} }

View file

@ -44,11 +44,8 @@ namespace Ryujinx.Graphics.Gpu.Image
TexturePoolCache texturePoolCache = new(context); TexturePoolCache texturePoolCache = new(context);
SamplerPoolCache samplerPoolCache = new(context); SamplerPoolCache samplerPoolCache = new(context);
float[] scales = new float[64]; _cpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, isCompute: true);
new Span<float>(scales).Fill(1f); _gpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, isCompute: false);
_cpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, scales, isCompute: true);
_gpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, scales, isCompute: false);
_texturePoolCache = texturePoolCache; _texturePoolCache = texturePoolCache;
_samplerPoolCache = samplerPoolCache; _samplerPoolCache = samplerPoolCache;

View file

@ -136,33 +136,30 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// <summary> /// <summary>
/// Updates the render scales for shader input textures or images. /// Updates the render scales for shader input textures or images.
/// </summary> /// </summary>
/// <param name="scales">Scale values</param> /// <param name="index">Index of the scale</param>
/// <param name="scale">Scale value</param>
public void UpdateRenderScale(int index, float scale)
{
if (_data.RenderScale[1 + index].X != scale)
{
_data.RenderScale[1 + index].X = scale;
DirtyRenderScale(1 + index, 1);
}
}
/// <summary>
/// Updates the render scales for shader input textures or images.
/// </summary>
/// <param name="totalCount">Total number of scales across all stages</param> /// <param name="totalCount">Total number of scales across all stages</param>
/// <param name="fragmentCount">Total number of scales on the fragment shader stage</param> /// <param name="fragmentCount">Total number of scales on the fragment shader stage</param>
public void UpdateRenderScale(ReadOnlySpan<float> scales, int totalCount, int fragmentCount) public void UpdateRenderScaleFragmentCount(int totalCount, int fragmentCount)
{ {
bool changed = false;
for (int index = 0; index < totalCount; index++)
{
if (_data.RenderScale[1 + index].X != scales[index])
{
_data.RenderScale[1 + index].X = scales[index];
changed = true;
}
}
// Only update fragment count if there are scales after it for the vertex stage. // Only update fragment count if there are scales after it for the vertex stage.
if (fragmentCount != totalCount && fragmentCount != _data.FragmentRenderScaleCount.X) if (fragmentCount != totalCount && fragmentCount != _data.FragmentRenderScaleCount.X)
{ {
_data.FragmentRenderScaleCount.X = fragmentCount; _data.FragmentRenderScaleCount.X = fragmentCount;
DirtyFragmentRenderScaleCount(); DirtyFragmentRenderScaleCount();
} }
if (changed)
{
DirtyRenderScale(0, 1 + totalCount);
}
} }
/// <summary> /// <summary>
@ -172,7 +169,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// <param name="isBgra">True if the format is BGRA< false otherwise</param> /// <param name="isBgra">True if the format is BGRA< false otherwise</param>
public void SetRenderTargetIsBgra(int index, bool isBgra) public void SetRenderTargetIsBgra(int index, bool isBgra)
{ {
bool isBgraChanged = (_data.FragmentIsBgra[index].X != 0) != isBgra; bool isBgraChanged = _data.FragmentIsBgra[index].X != 0 != isBgra;
if (isBgraChanged) if (isBgraChanged)
{ {

View file

@ -376,7 +376,7 @@ namespace Ryujinx.Graphics.Vulkan
var program = _program; var program = _program;
var bindingSegments = program.BindingSegments[setIndex]; var bindingSegments = program.BindingSegments[setIndex];
if (bindingSegments.Length == 0 && setIndex != PipelineBase.UniformSetIndex) if (bindingSegments.Length == 0)
{ {
return; return;
} }