summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Dawson <pat@dw.is>2024-08-30 22:17:41 +0200
committerPatrick Dawson <pat@dw.is>2024-08-30 22:37:51 +0200
commitf381cee82f7e5a75b11b30c5daf6dca19e5b7158 (patch)
tree114112a686446a38d676710ea073040613811fd6
parenta5830f6eb9fe25fbb7e58a723dbea8509aec8a85 (diff)
downloadredot-engine-f381cee82f7e5a75b11b30c5daf6dca19e5b7158.tar.gz
Metal: bind index buffer with offset
-rw-r--r--drivers/metal/metal_objects.h1
-rw-r--r--drivers/metal/metal_objects.mm8
2 files changed, 7 insertions, 2 deletions
diff --git a/drivers/metal/metal_objects.h b/drivers/metal/metal_objects.h
index f0a3e85f88..97f33bb1e8 100644
--- a/drivers/metal/metal_objects.h
+++ b/drivers/metal/metal_objects.h
@@ -227,6 +227,7 @@ public:
id<MTLRenderCommandEncoder> encoder = nil;
id<MTLBuffer> __unsafe_unretained index_buffer = nil; // Buffer is owned by RDD.
MTLIndexType index_type = MTLIndexTypeUInt16;
+ uint32_t index_offset = 0;
LocalVector<id<MTLBuffer> __unsafe_unretained> vertex_buffers;
LocalVector<NSUInteger> vertex_offsets;
// clang-format off
diff --git a/drivers/metal/metal_objects.mm b/drivers/metal/metal_objects.mm
index c66b683e23..abdcccf00c 100644
--- a/drivers/metal/metal_objects.mm
+++ b/drivers/metal/metal_objects.mm
@@ -717,6 +717,7 @@ void MDCommandBuffer::render_bind_index_buffer(RDD::BufferID p_buffer, RDD::Inde
render.index_buffer = rid::get(p_buffer);
render.index_type = p_format == RDD::IndexBufferFormat::INDEX_BUFFER_FORMAT_UINT16 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32;
+ render.index_offset = p_offset;
}
void MDCommandBuffer::render_draw_indexed(uint32_t p_index_count,
@@ -729,13 +730,16 @@ void MDCommandBuffer::render_draw_indexed(uint32_t p_index_count,
id<MTLRenderCommandEncoder> enc = render.encoder;
+ uint32_t index_offset = render.index_offset;
+ index_offset += p_first_index * (render.index_type == MTLIndexTypeUInt16 ? sizeof(uint16_t) : sizeof(uint32_t));
+
[enc drawIndexedPrimitives:render.pipeline->raster_state.render_primitive
indexCount:p_index_count
indexType:render.index_type
indexBuffer:render.index_buffer
- indexBufferOffset:p_vertex_offset
+ indexBufferOffset:index_offset
instanceCount:p_instance_count
- baseVertex:p_first_index
+ baseVertex:p_vertex_offset
baseInstance:p_first_instance];
}