Use buffer manager for color blit

This commit is contained in:
Isaac Marovitz 2024-06-20 14:14:05 +01:00 committed by Isaac Marovitz
parent 6ebe5bb406
commit 410287aba2

View file

@ -79,10 +79,15 @@ namespace Ryujinx.Graphics.Metal
Extents2D dstRegion, Extents2D dstRegion,
bool linearFilter) bool linearFilter)
{ {
// Save current state
_pipeline.SaveAndResetState();
const int RegionBufferSize = 16; const int RegionBufferSize = 16;
var sampler = linearFilter ? _samplerLinear : _samplerNearest; var sampler = linearFilter ? _samplerLinear : _samplerNearest;
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, sampler);
Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)]; Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)];
region[0] = srcRegion.X1 / (float)src.Width; region[0] = srcRegion.X1 / (float)src.Width;
@ -100,9 +105,9 @@ namespace Ryujinx.Graphics.Metal
(region[2], region[3]) = (region[3], region[2]); (region[2], region[3]) = (region[3], region[2]);
} }
// using var buffer = _renderer.BufferManager.ReserveOrCreate(cbs, RegionBufferSize); using var buffer = _renderer.BufferManager.ReserveOrCreate(cbs, RegionBufferSize);
// buffer.Holder.SetDataUnchecked<float>(buffer.Offset, region); buffer.Holder.SetDataUnchecked<float>(buffer.Offset, region);
// _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]);
var rect = new Rectangle<float>( var rect = new Rectangle<float>(
MathF.Min(dstRegion.X1, dstRegion.X2), MathF.Min(dstRegion.X1, dstRegion.X2),
@ -121,25 +126,18 @@ namespace Ryujinx.Graphics.Metal
0f, 0f,
1f); 1f);
_pipeline.SetProgram(_programColorBlit);
int dstWidth = dst.Width; int dstWidth = dst.Width;
int dstHeight = dst.Height; int dstHeight = dst.Height;
// Save current state
_pipeline.SaveAndResetState();
_pipeline.SetProgram(_programColorBlit);
_pipeline.SetViewports(viewports);
_pipeline.SetScissors(stackalloc Rectangle<int>[] { new Rectangle<int>(0, 0, dstWidth, dstHeight) });
_pipeline.SetRenderTargets([dst], null); _pipeline.SetRenderTargets([dst], null);
_pipeline.SetScissors(stackalloc Rectangle<int>[] { new Rectangle<int>(0, 0, dstWidth, dstHeight) });
_pipeline.SetClearLoadAction(true); _pipeline.SetClearLoadAction(true);
_pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, sampler);
_pipeline.SetViewports(viewports);
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
fixed (float* ptr = region)
{
_pipeline.GetOrCreateRenderEncoder(true).SetVertexBytes((IntPtr)ptr, RegionBufferSize, 0);
}
_pipeline.Draw(4, 1, 0, 0); _pipeline.Draw(4, 1, 0, 0);
// Restore previous state // Restore previous state