[glTF] Load UINT8 indices into UINT16 buffer
Without extensions, Vulkan only supports UINT16 and UINT32 index buffers. However, glTF allows UINT8 index buffers. We can support scenes with UINT8 indices by repacking them into a UINT16 buffer instead. This comes at the cost of a larger GPU buffer.
This allows us to load more Khronos glTF-Sample-Assets like TextureCoordinateTest.
Fixes #453
Seems like the required extension is https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_8bit_storage.html Promoted to core in VK 1.2. BigWheels default is Vulkan1.2, so I'd say we should probably leave the buffer as-is, and request the extension?
Sg I'll look at adding UINT8 support to Geometry instead
Actually I'm looking at https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_index_type_uint8.html which I believe is required for VK_INDEX_TYPE_UINT8_KHR. That's what I think I need for UINT8 support in Geometry. I don't see that it's been promoted
Ahh right, index buffer, not storage buffer, sorry I missed that! Not promoted, but seems like it's widely supported (>70% on Sasha willems' DB) since it was a VK_EXT_index_type_int8 before.
I tried on three devices I have (1 software lavapipe, and 2 android) and they all support VK_EXT_index_type_uint8. According to https://vulkan.gpuinfo.org/listextensions.php support for the extension is at 62%. Would it make sense to support UINT8 through the extension, or perhaps fall back to repacking if it is not available?
I like the idea of supporting the extension with this as a fallback. I'll look into how to make that happen.
I've incorporated #515 and #486 into this PR so it should be ready for review
@apazylbe I made some non-trivial changes that I'd like you to review.
@apazylbe merge conflicts are solved