aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs85
1 files changed, 25 insertions, 60 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
index c1e91c54..fb141db4 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs
@@ -9,57 +9,22 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// <summary>
/// Support buffer data updater.
/// </summary>
- class SupportBufferUpdater : IDisposable
+ class SupportBufferUpdater : BufferUpdater
{
private SupportBuffer _data;
- private BufferHandle _handle;
-
- private readonly IRenderer _renderer;
- private int _startOffset = -1;
- private int _endOffset = -1;
/// <summary>
/// Creates a new instance of the support buffer updater.
/// </summary>
/// <param name="renderer">Renderer that the support buffer will be used with</param>
- public SupportBufferUpdater(IRenderer renderer)
+ public SupportBufferUpdater(IRenderer renderer) : base(renderer)
{
- _renderer = renderer;
-
var defaultScale = new Vector4<float> { X = 1f, Y = 0f, Z = 0f, W = 0f };
_data.RenderScale.AsSpan().Fill(defaultScale);
DirtyRenderScale(0, SupportBuffer.RenderScaleMaxCount);
}
/// <summary>
- /// Mark a region of the support buffer as modified and needing to be sent to the GPU.
- /// </summary>
- /// <param name="startOffset">Start offset of the region in bytes</param>
- /// <param name="byteSize">Size of the region in bytes</param>
- private void MarkDirty(int startOffset, int byteSize)
- {
- int endOffset = startOffset + byteSize;
-
- if (_startOffset == -1)
- {
- _startOffset = startOffset;
- _endOffset = endOffset;
- }
- else
- {
- if (startOffset < _startOffset)
- {
- _startOffset = startOffset;
- }
-
- if (endOffset > _endOffset)
- {
- _endOffset = endOffset;
- }
- }
- }
-
- /// <summary>
/// Marks the fragment render scale count as being modified.
/// </summary>
private void DirtyFragmentRenderScaleCount()
@@ -220,40 +185,40 @@ namespace Ryujinx.Graphics.Gpu.Memory
}
/// <summary>
- /// Submits all pending buffer updates to the GPU.
+ /// Sets offset for the misaligned portion of a transform feedback buffer, and the buffer size, for transform feedback emulation.
/// </summary>
- public void Commit()
+ /// <param name="bufferIndex">Index of the transform feedback buffer</param>
+ /// <param name="offset">Misaligned offset of the buffer</param>
+ public void SetTfeOffset(int bufferIndex, int offset)
{
- if (_startOffset != -1)
- {
- if (_handle == BufferHandle.Null)
- {
- _handle = _renderer.CreateBuffer(SupportBuffer.RequiredSize, BufferAccess.Stream);
- _renderer.Pipeline.ClearBuffer(_handle, 0, SupportBuffer.RequiredSize, 0);
+ ref int currentOffset = ref GetElementRef(ref _data.TfeOffset, bufferIndex);
- var range = new BufferRange(_handle, 0, SupportBuffer.RequiredSize);
- _renderer.Pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, range) });
- }
-
- ReadOnlySpan<byte> data = MemoryMarshal.Cast<SupportBuffer, byte>(MemoryMarshal.CreateSpan(ref _data, 1));
-
- _renderer.SetBufferData(_handle, _startOffset, data[_startOffset.._endOffset]);
-
- _startOffset = -1;
- _endOffset = -1;
+ if (currentOffset != offset)
+ {
+ currentOffset = offset;
+ MarkDirty(SupportBuffer.TfeOffsetOffset + bufferIndex * sizeof(int), sizeof(int));
}
}
/// <summary>
- /// Destroys the support buffer.
+ /// Sets the vertex count used for transform feedback emulation with instanced draws.
/// </summary>
- public void Dispose()
+ /// <param name="vertexCount">Vertex count of the instanced draw</param>
+ public void SetTfeVertexCount(int vertexCount)
{
- if (_handle != BufferHandle.Null)
+ if (_data.TfeVertexCount.X != vertexCount)
{
- _renderer.DeleteBuffer(_handle);
- _handle = BufferHandle.Null;
+ _data.TfeVertexCount.X = vertexCount;
+ MarkDirty(SupportBuffer.TfeVertexCountOffset, sizeof(int));
}
}
+
+ /// <summary>
+ /// Submits all pending buffer updates to the GPU.
+ /// </summary>
+ public void Commit()
+ {
+ Commit(MemoryMarshal.Cast<SupportBuffer, byte>(MemoryMarshal.CreateSpan(ref _data, 1)), SupportBuffer.Binding);
+ }
}
}