Browse Source

Metal: bind index buffer with offset

Patrick Dawson 1 year ago
parent
commit
f381cee82f
2 changed files with 7 additions and 2 deletions
  1. 1 0
      drivers/metal/metal_objects.h
  2. 6 2
      drivers/metal/metal_objects.mm

+ 1 - 0
drivers/metal/metal_objects.h

@@ -227,6 +227,7 @@ public:
 		id<MTLRenderCommandEncoder> encoder = nil;
 		id<MTLRenderCommandEncoder> encoder = nil;
 		id<MTLBuffer> __unsafe_unretained index_buffer = nil; // Buffer is owned by RDD.
 		id<MTLBuffer> __unsafe_unretained index_buffer = nil; // Buffer is owned by RDD.
 		MTLIndexType index_type = MTLIndexTypeUInt16;
 		MTLIndexType index_type = MTLIndexTypeUInt16;
+		uint32_t index_offset = 0;
 		LocalVector<id<MTLBuffer> __unsafe_unretained> vertex_buffers;
 		LocalVector<id<MTLBuffer> __unsafe_unretained> vertex_buffers;
 		LocalVector<NSUInteger> vertex_offsets;
 		LocalVector<NSUInteger> vertex_offsets;
 		// clang-format off
 		// clang-format off

+ 6 - 2
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_buffer = rid::get(p_buffer);
 	render.index_type = p_format == RDD::IndexBufferFormat::INDEX_BUFFER_FORMAT_UINT16 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32;
 	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,
 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;
 	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
 	[enc drawIndexedPrimitives:render.pipeline->raster_state.render_primitive
 					indexCount:p_index_count
 					indexCount:p_index_count
 					 indexType:render.index_type
 					 indexType:render.index_type
 				   indexBuffer:render.index_buffer
 				   indexBuffer:render.index_buffer
-			 indexBufferOffset:p_vertex_offset
+			 indexBufferOffset:index_offset
 				 instanceCount:p_instance_count
 				 instanceCount:p_instance_count
-					baseVertex:p_first_index
+					baseVertex:p_vertex_offset
 				  baseInstance:p_first_instance];
 				  baseInstance:p_first_instance];
 }
 }