I am extending the challenge on Chapter 13 (with the grass scene) to use GPU driven rendering as seen on Chapter 15.
The Skybox model is created using a MDLMesh and converted to a MTKMesh, but that is producing a mesh.submeshes.indexType of UInt16 while the imported models are using UInt32.
When calling cmd.draw_indexed_primitives in the Kernel it doesn’t have any way to pass the correct IndexType and it is just assuming a UInt32.
It is strange, because when the MTLIndirectRenderCommand on the CPU side does provide a way to pass the IndexType.
My solution was to create a new IndexBuffer with double the size and copy all indexes from the the original buffer into the new one with the values casted from UInt16 into UInt32.
Is there a better way to do it?
The Metal Shading Language function is:
device/constant uint instance_count,
This is from the Metal Shading Language specification: https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
I haven’t tried changing this, but it leads me to think that how you define
index_buffer is whether
uint is used.
struct Model contains
constant uint *indexBuffer;. I think that’s why it’s using
UInt32 on the GPU side.
You could duplicate the ICB.metal code to use a
ushort in the indexBuffer and check this out.
Oh, and welcome to the forums . Great first question!
Thank you @Caroline
To do a quick test I’ve changed the argument to:
drawArguments.indexStart + (constant ushort*)model.indexBuffer