Simplify resolution scale updates (#5541)
This commit is contained in:
parent
33f544fd92
commit
550fd4a733
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user