Cleanup Pipeline

This commit is contained in:
Isaac Marovitz 2024-06-21 00:21:06 +01:00
parent 2a78f5c502
commit 68b6f40ca5
No known key found for this signature in database
GPG key ID: 97250B2B09A132E1
5 changed files with 40 additions and 50 deletions

View file

@ -360,7 +360,7 @@ namespace Ryujinx.Graphics.Metal
{
_currentState.IndexType = MTLIndexType.UInt16;
_currentState.IndexBufferOffset = (ulong)buffer.Offset;
_currentState.IndexBuffer = _bufferManager.GetBufferI8ToI16(_pipeline.CurrentCommandBuffer, buffer.Handle, buffer.Offset, buffer.Size);
_currentState.IndexBuffer = _bufferManager.GetBufferI8ToI16(_pipeline.Cbs, buffer.Handle, buffer.Offset, buffer.Size);
}
else
{
@ -1036,12 +1036,12 @@ namespace Ryujinx.Graphics.Metal
if (range.HasValue)
{
offset = range.Value.Offset;
mtlBuffer = autoBuffer.Get(_pipeline.CurrentCommandBuffer, offset, range.Value.Size, range.Value.Write).Value;
mtlBuffer = autoBuffer.Get(_pipeline.Cbs, offset, range.Value.Size, range.Value.Write).Value;
}
else
{
mtlBuffer = autoBuffer.Get(_pipeline.CurrentCommandBuffer).Value;
mtlBuffer = autoBuffer.Get(_pipeline.Cbs).Value;
}
renderCommandEncoder.SetVertexBuffer(mtlBuffer, (ulong)offset, (ulong)index);
@ -1072,12 +1072,12 @@ namespace Ryujinx.Graphics.Metal
if (range.HasValue)
{
offset = range.Value.Offset;
mtlBuffer = autoBuffer.Get(_pipeline.CurrentCommandBuffer, offset, range.Value.Size, range.Value.Write).Value;
mtlBuffer = autoBuffer.Get(_pipeline.Cbs, offset, range.Value.Size, range.Value.Write).Value;
}
else
{
mtlBuffer = autoBuffer.Get(_pipeline.CurrentCommandBuffer).Value;
mtlBuffer = autoBuffer.Get(_pipeline.Cbs).Value;
}
computeCommandEncoder.SetBuffer(mtlBuffer, (ulong)offset, (ulong)index);

View file

@ -268,7 +268,7 @@ namespace Ryujinx.Graphics.Metal
// TODO: Flush
using var buffer = _renderer.BufferManager.ReserveOrCreate(_pipeline.CurrentCommandBuffer, ClearColorBufferSize);
using var buffer = _renderer.BufferManager.ReserveOrCreate(_pipeline.Cbs, ClearColorBufferSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, clearColor);
_pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]);

View file

@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Metal
CommandBufferPool = new CommandBufferPool(_device, _queue);
_window = new Window(this, layer);
_pipeline = new Pipeline(_device, this, _queue);
_pipeline = new Pipeline(_device, this);
BufferManager = new BufferManager(_device, this, _pipeline);
_pipeline.InitEncoderStateManager(BufferManager);
@ -222,7 +222,7 @@ namespace Ryujinx.Graphics.Metal
public void SetBufferData(BufferHandle buffer, int offset, ReadOnlySpan<byte> data)
{
BufferManager.SetData(buffer, offset, data, _pipeline.CurrentCommandBuffer, _pipeline.EndRenderPassDelegate);
BufferManager.SetData(buffer, offset, data, _pipeline.Cbs, _pipeline.EndRenderPassDelegate);
}
public void UpdateCounters()

View file

@ -21,30 +21,20 @@ namespace Ryujinx.Graphics.Metal
public class Pipeline : IPipeline, IDisposable
{
private readonly MTLDevice _device;
private readonly MTLCommandQueue _commandQueue;
private readonly MetalRenderer _renderer;
private CommandBufferScoped Cbs;
private CommandBufferScoped? PreloadCbs;
public MTLCommandBuffer CommandBuffer;
public readonly Action EndRenderPassDelegate;
public CommandBufferScoped CurrentCommandBuffer => Cbs;
private MTLCommandEncoder? _currentEncoder;
public MTLCommandEncoder? CurrentEncoder => _currentEncoder;
private EncoderType _currentEncoderType = EncoderType.None;
public EncoderType CurrentEncoderType => _currentEncoderType;
private EncoderStateManager _encoderStateManager;
public Pipeline(MTLDevice device, MetalRenderer renderer, MTLCommandQueue commandQueue)
public readonly Action EndRenderPassDelegate;
public MTLCommandBuffer CommandBuffer;
internal CommandBufferScoped Cbs { get; private set; }
internal MTLCommandEncoder? CurrentEncoder { get; private set; }
internal EncoderType CurrentEncoderType { get; private set; } = EncoderType.None;
public Pipeline(MTLDevice device, MetalRenderer renderer)
{
_device = device;
_renderer = renderer;
_commandQueue = commandQueue;
EndRenderPassDelegate = EndCurrentPass;
@ -79,13 +69,13 @@ namespace Ryujinx.Graphics.Metal
public MTLRenderCommandEncoder GetOrCreateRenderEncoder(bool forDraw = false)
{
MTLRenderCommandEncoder renderCommandEncoder;
if (_currentEncoder == null || _currentEncoderType != EncoderType.Render)
if (CurrentEncoder == null || CurrentEncoderType != EncoderType.Render)
{
renderCommandEncoder = BeginRenderPass();
}
else
{
renderCommandEncoder = new MTLRenderCommandEncoder(_currentEncoder.Value);
renderCommandEncoder = new MTLRenderCommandEncoder(CurrentEncoder.Value);
}
if (forDraw)
@ -98,11 +88,11 @@ namespace Ryujinx.Graphics.Metal
public MTLBlitCommandEncoder GetOrCreateBlitEncoder()
{
if (_currentEncoder != null)
if (CurrentEncoder != null)
{
if (_currentEncoderType == EncoderType.Blit)
if (CurrentEncoderType == EncoderType.Blit)
{
return new MTLBlitCommandEncoder(_currentEncoder.Value);
return new MTLBlitCommandEncoder(CurrentEncoder.Value);
}
}
@ -112,13 +102,13 @@ namespace Ryujinx.Graphics.Metal
public MTLComputeCommandEncoder GetOrCreateComputeEncoder()
{
MTLComputeCommandEncoder computeCommandEncoder;
if (_currentEncoder == null || _currentEncoderType != EncoderType.Compute)
if (CurrentEncoder == null || CurrentEncoderType != EncoderType.Compute)
{
computeCommandEncoder = BeginComputePass();
}
else
{
computeCommandEncoder = new MTLComputeCommandEncoder(_currentEncoder.Value);
computeCommandEncoder = new MTLComputeCommandEncoder(CurrentEncoder.Value);
}
_encoderStateManager.RebindComputeState(computeCommandEncoder);
@ -128,27 +118,27 @@ namespace Ryujinx.Graphics.Metal
public void EndCurrentPass()
{
if (_currentEncoder != null)
if (CurrentEncoder != null)
{
switch (_currentEncoderType)
switch (CurrentEncoderType)
{
case EncoderType.Blit:
new MTLBlitCommandEncoder(_currentEncoder.Value).EndEncoding();
_currentEncoder = null;
new MTLBlitCommandEncoder(CurrentEncoder.Value).EndEncoding();
CurrentEncoder = null;
break;
case EncoderType.Compute:
new MTLComputeCommandEncoder(_currentEncoder.Value).EndEncoding();
_currentEncoder = null;
new MTLComputeCommandEncoder(CurrentEncoder.Value).EndEncoding();
CurrentEncoder = null;
break;
case EncoderType.Render:
new MTLRenderCommandEncoder(_currentEncoder.Value).EndEncoding();
_currentEncoder = null;
new MTLRenderCommandEncoder(CurrentEncoder.Value).EndEncoding();
CurrentEncoder = null;
break;
default:
throw new ArgumentOutOfRangeException();
}
_currentEncoderType = EncoderType.None;
CurrentEncoderType = EncoderType.None;
}
}
@ -158,8 +148,8 @@ namespace Ryujinx.Graphics.Metal
var renderCommandEncoder = _encoderStateManager.CreateRenderCommandEncoder();
_currentEncoder = renderCommandEncoder;
_currentEncoderType = EncoderType.Render;
CurrentEncoder = renderCommandEncoder;
CurrentEncoderType = EncoderType.Render;
return renderCommandEncoder;
}
@ -171,8 +161,8 @@ namespace Ryujinx.Graphics.Metal
var descriptor = new MTLBlitPassDescriptor();
var blitCommandEncoder = Cbs.CommandBuffer.BlitCommandEncoder(descriptor);
_currentEncoder = blitCommandEncoder;
_currentEncoderType = EncoderType.Blit;
CurrentEncoder = blitCommandEncoder;
CurrentEncoderType = EncoderType.Blit;
return blitCommandEncoder;
}
@ -182,8 +172,8 @@ namespace Ryujinx.Graphics.Metal
var computeCommandEncoder = _encoderStateManager.CreateComputeCommandEncoder();
_currentEncoder = computeCommandEncoder;
_currentEncoderType = EncoderType.Compute;
CurrentEncoder = computeCommandEncoder;
CurrentEncoderType = EncoderType.Compute;
return computeCommandEncoder;
}
@ -232,7 +222,7 @@ namespace Ryujinx.Graphics.Metal
public void Barrier()
{
switch (_currentEncoderType)
switch (CurrentEncoderType)
{
case EncoderType.Render:
{

View file

@ -162,7 +162,7 @@ namespace Ryujinx.Graphics.Metal
public void CopyTo(BufferRange range, int layer, int level, int stride)
{
var blitCommandEncoder = _pipeline.GetOrCreateBlitEncoder();
var cbs = _pipeline.CurrentCommandBuffer;
var cbs = _pipeline.Cbs;
int outSize = Info.GetMipSize(level);