Zero vertex buffer (#17)

* cast src size to float

* implement zero buffers
This commit is contained in:
SamoZ256 2024-05-27 22:54:26 +02:00 committed by Isaac Marovitz
parent 35f68c1b31
commit e423f81155
2 changed files with 40 additions and 11 deletions

View file

@ -25,11 +25,22 @@ namespace Ryujinx.Graphics.Metal
public readonly ulong IndexBufferOffset => _currentState.IndexBufferOffset; public readonly ulong IndexBufferOffset => _currentState.IndexBufferOffset;
public readonly PrimitiveTopology Topology => _currentState.Topology; public readonly PrimitiveTopology Topology => _currentState.Topology;
public EncoderStateManager(MTLDevice device, Pipeline pipeline) // RGBA32F is the biggest format
private const int ZeroBufferSize = 4 * 4;
private readonly MTLBuffer _zeroBuffer;
public unsafe EncoderStateManager(MTLDevice device, Pipeline pipeline)
{ {
_pipeline = pipeline; _pipeline = pipeline;
_renderPipelineCache = new(device); _renderPipelineCache = new(device);
_depthStencilCache = new(device); _depthStencilCache = new(device);
// Zero buffer
byte[] zeros = new byte[ZeroBufferSize];
fixed (byte* ptr = zeros)
{
_zeroBuffer = device.NewBuffer((IntPtr)ptr, ZeroBufferSize, MTLResourceOptions.ResourceStorageModeShared);
}
} }
public void Dispose() public void Dispose()
@ -661,10 +672,17 @@ namespace Ryujinx.Graphics.Metal
var vertexDescriptor = new MTLVertexDescriptor(); var vertexDescriptor = new MTLVertexDescriptor();
uint indexMask = 0; uint indexMask = 0;
// TODO: Handle 'zero' buffers
for (int i = 0; i < attribDescriptors.Length; i++) for (int i = 0; i < attribDescriptors.Length; i++)
{ {
if (!attribDescriptors[i].IsZero) if (attribDescriptors[i].IsZero)
{
var attrib = vertexDescriptor.Attributes.Object((ulong)i);
attrib.Format = attribDescriptors[i].Format.Convert();
indexMask |= 1u << bufferDescriptors.Length;
attrib.BufferIndex = (ulong)bufferDescriptors.Length;
attrib.Offset = 0;
}
else
{ {
var attrib = vertexDescriptor.Attributes.Object((ulong)i); var attrib = vertexDescriptor.Attributes.Object((ulong)i);
attrib.Format = attribDescriptors[i].Format.Convert(); attrib.Format = attribDescriptors[i].Format.Convert();
@ -672,10 +690,6 @@ namespace Ryujinx.Graphics.Metal
attrib.BufferIndex = (ulong)attribDescriptors[i].BufferIndex; attrib.BufferIndex = (ulong)attribDescriptors[i].BufferIndex;
attrib.Offset = (ulong)attribDescriptors[i].Offset; attrib.Offset = (ulong)attribDescriptors[i].Offset;
} }
else
{
// Logger.Warning?.PrintMsg(LogClass.Gpu, "Unhandled IsZero buffer!");
}
} }
for (int i = 0; i < bufferDescriptors.Length; i++) for (int i = 0; i < bufferDescriptors.Length; i++)
@ -684,6 +698,13 @@ namespace Ryujinx.Graphics.Metal
layout.Stride = (indexMask & (1u << i)) != 0 ? (ulong)bufferDescriptors[i].Stride : 0; layout.Stride = (indexMask & (1u << i)) != 0 ? (ulong)bufferDescriptors[i].Stride : 0;
} }
// Zero buffer
if ((indexMask & (1u << bufferDescriptors.Length)) != 0)
{
var layout = vertexDescriptor.Layouts.Object((ulong)bufferDescriptors.Length);
layout.Stride = ZeroBufferSize;
}
return vertexDescriptor; return vertexDescriptor;
} }
@ -704,6 +725,14 @@ namespace Ryujinx.Graphics.Metal
} }
} }
// Zero buffer
buffers.Add(new BufferInfo
{
Handle = _zeroBuffer.NativePtr,
Offset = 0,
Index = bufferDescriptors.Length
});
SetBuffers(renderCommandEncoder, buffers); SetBuffers(renderCommandEncoder, buffers);
} }

View file

@ -74,10 +74,10 @@ namespace Ryujinx.Graphics.Metal
Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)]; Span<float> region = stackalloc float[RegionBufferSize / sizeof(float)];
region[0] = srcRegion.X1 / src.Width; region[0] = srcRegion.X1 / (float)src.Width;
region[1] = srcRegion.X2 / src.Width; region[1] = srcRegion.X2 / (float)src.Width;
region[2] = srcRegion.Y1 / src.Height; region[2] = srcRegion.Y1 / (float)src.Height;
region[3] = srcRegion.Y2 / src.Height; region[3] = srcRegion.Y2 / (float)src.Height;
if (dstRegion.X1 > dstRegion.X2) if (dstRegion.X1 > dstRegion.X2)
{ {