diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-08-30 23:38:13 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-08-30 23:38:13 +0200 |
commit | 61598c5c88d95b96811d386cb20d714c35f4c6d7 (patch) | |
tree | 274e6398cdfee1ea226085d347ae117c9e94a4e5 | |
parent | ace4529b161c7b57d987ff225c29e2ba00ccf514 (diff) | |
parent | f381cee82f7e5a75b11b30c5daf6dca19e5b7158 (diff) | |
download | redot-engine-61598c5c88d95b96811d386cb20d714c35f4c6d7.tar.gz |
Merge pull request #96349 from pkdawson/metal-idx-offset
Metal: Bind index buffer with offset
-rw-r--r-- | drivers/metal/metal_objects.h | 1 | ||||
-rw-r--r-- | drivers/metal/metal_objects.mm | 8 |
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]; } |