Fix counted indirect draws

Fixes Monster Hunter Rise and Apollo Justice
This commit is contained in:
Isaac Marovitz 2024-09-07 21:38:01 +02:00 committed by Isaac Marovitz
parent bb917a4aa4
commit 6fed9b51b5

View file

@ -521,6 +521,11 @@ namespace Ryujinx.Graphics.Metal
} }
public void DrawIndexedIndirect(BufferRange indirectBuffer) public void DrawIndexedIndirect(BufferRange indirectBuffer)
{
DrawIndexedIndirectOffset(indirectBuffer);
}
public void DrawIndexedIndirectOffset(BufferRange indirectBuffer, int offset = 0)
{ {
// TODO: Reindex unsupported topologies // TODO: Reindex unsupported topologies
if (TopologyUnsupported(_encoderStateManager.Topology)) if (TopologyUnsupported(_encoderStateManager.Topology))
@ -534,7 +539,7 @@ namespace Ryujinx.Graphics.Metal
var primitiveType = TopologyRemap(_encoderStateManager.Topology).Convert(); var primitiveType = TopologyRemap(_encoderStateManager.Topology).Convert();
(MTLBuffer indexBuffer, int offset, MTLIndexType type) = _encoderStateManager.IndexBuffer.GetIndexBuffer(_renderer, Cbs); (MTLBuffer indexBuffer, int indexOffset, MTLIndexType type) = _encoderStateManager.IndexBuffer.GetIndexBuffer(_renderer, Cbs);
if (indexBuffer.NativePtr != IntPtr.Zero && buffer.NativePtr != IntPtr.Zero) if (indexBuffer.NativePtr != IntPtr.Zero && buffer.NativePtr != IntPtr.Zero)
{ {
@ -544,20 +549,26 @@ namespace Ryujinx.Graphics.Metal
primitiveType, primitiveType,
type, type,
indexBuffer, indexBuffer,
(ulong)offset, (ulong)indexOffset,
buffer, buffer,
(ulong)indirectBuffer.Offset); (ulong)(indirectBuffer.Offset + offset));
} }
} }
public void DrawIndexedIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride) public void DrawIndexedIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride)
{ {
// TODO: Properly support count for (int i = 0; i < maxDrawCount; i++)
{
DrawIndexedIndirect(indirectBuffer); DrawIndexedIndirectOffset(indirectBuffer, stride * i);
}
} }
public void DrawIndirect(BufferRange indirectBuffer) public void DrawIndirect(BufferRange indirectBuffer)
{
DrawIndirectOffset(indirectBuffer);
}
public void DrawIndirectOffset(BufferRange indirectBuffer, int offset = 0)
{ {
if (TopologyUnsupported(_encoderStateManager.Topology)) if (TopologyUnsupported(_encoderStateManager.Topology))
{ {
@ -575,14 +586,15 @@ namespace Ryujinx.Graphics.Metal
renderCommandEncoder.DrawPrimitives( renderCommandEncoder.DrawPrimitives(
primitiveType, primitiveType,
buffer, buffer,
(ulong)indirectBuffer.Offset); (ulong)(indirectBuffer.Offset + offset));
} }
public void DrawIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride) public void DrawIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride)
{ {
// TODO: Properly support count for (int i = 0; i < maxDrawCount; i++)
{
DrawIndirect(indirectBuffer); DrawIndirectOffset(indirectBuffer, stride * i);
}
} }
public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion) public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion)