diff --git a/src/libANGLE/renderer/metal/mtl_command_buffer.h b/src/libANGLE/renderer/metal/mtl_command_buffer.h --- a/src/libANGLE/renderer/metal/mtl_command_buffer.h +++ b/src/libANGLE/renderer/metal/mtl_command_buffer.h @@ -560,7 +560,7 @@ class RenderCommandEncoder final : public CommandEncoder const BufferRef &indexBuffer, size_t bufferOffset, uint32_t instances, - uint32_t baseVertex, + int32_t baseVertex, uint32_t baseInstance); RenderCommandEncoder &setVisibilityResultMode(MTLVisibilityResultMode mode, size_t offset); diff --git a/src/libANGLE/renderer/metal/mtl_command_buffer.mm b/src/libANGLE/renderer/metal/mtl_command_buffer.mm --- a/src/libANGLE/renderer/metal/mtl_command_buffer.mm +++ b/src/libANGLE/renderer/metal/mtl_command_buffer.mm @@ -358,7 +358,9 @@ inline void DrawIndexedInstancedBaseVertexBaseInstanceCmd(id indexBuffer = stream->fetch>(); size_t bufferOffset = stream->fetch(); uint32_t instances = stream->fetch(); - uint32_t baseVertex = stream->fetch(); + // baseVertex is signed at the GL API (GLint) and at the Metal API + // (NSInteger). Preserve sign so negative values sign-extend to int64. + int32_t baseVertex = stream->fetch(); uint32_t baseInstance = stream->fetch(); [encoder drawIndexedPrimitives:primitiveType indexCount:indexCount @@ -2199,7 +2201,7 @@ RenderCommandEncoder &RenderCommandEncoder::drawIndexedInstancedBaseVertexBaseIn const BufferRef &indexBuffer, size_t bufferOffset, uint32_t instances, - uint32_t baseVertex, + int32_t baseVertex, uint32_t baseInstance) { ASSERT(mPipelineStateSet &&