Skip to content

Commit 92d14a4

Browse files
committed
add VK_KHR_maintenance5 support
1 parent 0f6c619 commit 92d14a4

19 files changed

+218
-18
lines changed

qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ Q_DECLARE_METATYPE(CombinedSamplerData);
4141

4242
namespace
4343
{
44+
45+
template <typename T>
46+
T RDCMIN(const T &a, const T &b)
47+
{
48+
return a < b ? a : b;
49+
}
50+
4451
QString getTextureRenderSamples(const TextureDescription *tex, const VKPipe::RenderPass &renderpass)
4552
{
4653
const uint32_t texSamples = tex ? tex->msSamp : 1;
@@ -2411,7 +2418,7 @@ void VulkanPipelineStateViewer::setState()
24112418
BufferDescription *buf = m_Ctx.GetBuffer(state.inputAssembly.indexBuffer.resourceId);
24122419

24132420
if(buf)
2414-
length = buf->length;
2421+
length = RDCMIN(buf->length, state.inputAssembly.indexBuffer.byteSize);
24152422

24162423
RDTreeWidgetItem *node = new RDTreeWidgetItem(
24172424
{tr("Index"), state.inputAssembly.indexBuffer.resourceId, tr("Index"), lit("-"),
@@ -3802,7 +3809,7 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe::
38023809
if(ib)
38033810
{
38043811
name = m_Ctx.GetResourceName(ia.indexBuffer.resourceId);
3805-
length = ib->length;
3812+
length = RDCMIN(ib->length, ia.indexBuffer.byteSize);
38063813
}
38073814

38083815
QString ifmt = lit("UNKNOWN");

renderdoc/api/replay/pipestate.inl

+1-1
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ BoundVBuffer PipeState::GetIBuffer() const
582582
ret.resourceId = m_Vulkan->inputAssembly.indexBuffer.resourceId;
583583
ret.byteOffset = m_Vulkan->inputAssembly.indexBuffer.byteOffset;
584584
ret.byteStride = m_Vulkan->inputAssembly.indexBuffer.byteStride;
585-
ret.byteSize = ~0ULL;
585+
ret.byteSize = m_Vulkan->inputAssembly.indexBuffer.byteSize;
586586
}
587587
}
588588

renderdoc/api/replay/vk_pipestate.h

+3
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,9 @@ struct IndexBuffer
411411
DOCUMENT("The byte offset from the start of the buffer to the beginning of the index data.");
412412
uint64_t byteOffset = 0;
413413

414+
DOCUMENT("The number of bytes in the index buffer.");
415+
uint64_t byteSize = 0;
416+
414417
DOCUMENT(R"(The number of bytes for each index in the index buffer. Typically 2 or 4 bytes but
415418
it can be 0 if no index buffer is bound.
416419
)");

renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,15 @@ ShaderDebugTrace *Debugger::BeginDebug(DebugAPIWrapper *api, const ShaderStage s
10091009
outputIDs.push_back(v.id);
10101010
liveGlobals.push_back(v.id);
10111011
pointerIDs.push_back(THREAD_POINTER(v.id, outputs));
1012+
1013+
// VK_KHR_maintenance5 requires that if PointSize is not written during shader execution, it should be 1.0f
1014+
// so we will initialize it to 1.0f here (if it is not enabled then leaving it as 1.0f is harmless)
1015+
if(decorations[v.id].flags & Decorations::HasBuiltIn &&
1016+
decorations[v.id].builtIn == BuiltIn::PointSize)
1017+
{
1018+
ShaderVariable &pointSize = active.outputs.back();
1019+
pointSize.value.f32v[0] = 1.0f;
1020+
}
10121021
}
10131022
}
10141023

renderdoc/driver/vulkan/extension_support.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ Maintainers can update this file by updating vk.xml in this folder and running `
171171
* `VK_KHR_maintenance2`
172172
* `VK_KHR_maintenance3`
173173
* `VK_KHR_maintenance4`
174+
* `VK_KHR_maintenance5`
174175
* `VK_KHR_multiview`
175176
* `VK_KHR_performance_query`
176177
* `VK_KHR_pipeline_executable_properties`
@@ -235,7 +236,6 @@ KHR extensions will definitely be implemented at some point, though KHR extensio
235236

236237
* `VK_KHR_cooperative_matrix`
237238
* `VK_KHR_dynamic_rendering_local_read`
238-
* `VK_KHR_maintenance5`
239239
* `VK_KHR_maintenance6`
240240
* `VK_KHR_map_memory2`
241241
* `VK_KHR_shader_expect_assume`

renderdoc/driver/vulkan/vk_common.h

+1
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ enum class VulkanChunk : uint32_t
978978
vkCmdDrawMeshTasksEXT,
979979
vkCmdDrawMeshTasksIndirectEXT,
980980
vkCmdDrawMeshTasksIndirectCountEXT,
981+
vkCmdBindIndexBuffer2KHR,
981982
Max,
982983
};
983984

renderdoc/driver/vulkan/vk_core.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -3989,6 +3989,10 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk)
39893989
return Serialise_vkCmdSetTessellationDomainOriginEXT(ser, VK_NULL_HANDLE,
39903990
VK_TESSELLATION_DOMAIN_ORIGIN_MAX_ENUM);
39913991

3992+
case VulkanChunk::vkCmdBindIndexBuffer2KHR:
3993+
return Serialise_vkCmdBindIndexBuffer2KHR(ser, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, 0,
3994+
VK_INDEX_TYPE_MAX_ENUM);
3995+
39923996
// chunks that are reserved but not yet serialised
39933997
case VulkanChunk::vkResetCommandPool:
39943998
case VulkanChunk::vkCreateDepthTargetView:

renderdoc/driver/vulkan/vk_core.h

+14
Original file line numberDiff line numberDiff line change
@@ -2812,4 +2812,18 @@ class WrappedVulkan : public IFrameCapturer
28122812
VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
28132813
VkBuffer countBuffer, VkDeviceSize countBufferOffset,
28142814
uint32_t maxDrawCount, uint32_t stride);
2815+
2816+
// VK_KHR_mainenance5
2817+
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer commandBuffer,
2818+
VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size,
2819+
VkIndexType indexType);
2820+
IMPLEMENT_FUNCTION_SERIALISED(void, vkGetDeviceImageSubresourceLayoutKHR, VkDevice device,
2821+
const VkDeviceImageSubresourceInfoKHR *pInfo,
2822+
VkSubresourceLayout2KHR *pLayout);
2823+
IMPLEMENT_FUNCTION_SERIALISED(void, vkGetImageSubresourceLayout2KHR, VkDevice device,
2824+
VkImage image, const VkImageSubresource2KHR *pSubresource,
2825+
VkSubresourceLayout2KHR *pLayout);
2826+
IMPLEMENT_FUNCTION_SERIALISED(void, vkGetRenderingAreaGranularityKHR, VkDevice device,
2827+
const VkRenderingAreaInfoKHR *pRenderingAreaInfo,
2828+
VkExtent2D *pGranularity);
28152829
};

renderdoc/driver/vulkan/vk_hookset_defs.h

+16-2
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,8 @@
554554
DeclExt(EXT_scalar_block_layout); \
555555
DeclExt(KHR_vertex_attribute_divisor); \
556556
DeclExt(KHR_line_rasterization); \
557-
DeclExt(KHR_calibrated_timestamps);
557+
DeclExt(KHR_calibrated_timestamps); \
558+
DeclExt(KHR_maintenance5);
558559

559560
// for simplicity and since the check itself is platform agnostic,
560561
// these aren't protected in platform defines
@@ -679,7 +680,8 @@
679680
CheckExt(EXT_scalar_block_layout, VK12); \
680681
CheckExt(KHR_vertex_attribute_divisor, VKXX); \
681682
CheckExt(KHR_line_rasterization, VKXX); \
682-
CheckExt(KHR_calibrated_timestamps, VKXX);
683+
CheckExt(KHR_calibrated_timestamps, VKXX); \
684+
CheckExt(KHR_maintenance5, VKXX);
683685

684686
#define HookInitVulkanInstanceExts_PhysDev() \
685687
HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \
@@ -982,6 +984,10 @@
982984
HookInitExtension(KHR_calibrated_timestamps, GetCalibratedTimestampsKHR); \
983985
HookInitExtension(KHR_line_rasterization, CmdSetLineStippleKHR); \
984986
HookInitExtensionEXTtoKHR(CmdSetLineStipple); \
987+
HookInitExtension(KHR_maintenance5, CmdBindIndexBuffer2KHR); \
988+
HookInitExtension(KHR_maintenance5, GetDeviceImageSubresourceLayoutKHR); \
989+
HookInitExtension(KHR_maintenance5, GetImageSubresourceLayout2KHR); \
990+
HookInitExtension(KHR_maintenance5, GetRenderingAreaGranularityKHR); \
985991
HookInitExtension_Device_Win32(); \
986992
HookInitExtension_Device_Linux(); \
987993
HookInitExtension_Device_GGP(); \
@@ -1790,6 +1796,14 @@
17901796
uint64_t *, pMaxDeviation); \
17911797
HookDefine3(void, vkCmdSetLineStippleKHR, VkCommandBuffer, commandBuffer, uint32_t, \
17921798
lineStippleFactor, uint16_t, lineStipplePattern); \
1799+
HookDefine5(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer, commandBuffer, VkBuffer, buffer, \
1800+
VkDeviceSize, offset, VkDeviceSize, size, VkIndexType, indexType); \
1801+
HookDefine3(void, vkGetDeviceImageSubresourceLayoutKHR, VkDevice, device, \
1802+
const VkDeviceImageSubresourceInfoKHR *, pInfo, VkSubresourceLayout2KHR *, pLayout); \
1803+
HookDefine4(void, vkGetImageSubresourceLayout2KHR, VkDevice, device, VkImage, image, \
1804+
const VkImageSubresource2KHR *, pSubresource, VkSubresourceLayout2KHR *, pLayout); \
1805+
HookDefine3(void, vkGetRenderingAreaGranularityKHR, VkDevice, device, \
1806+
const VkRenderingAreaInfoKHR *, pRenderingAreaInfo, VkExtent2D *, pGranularity); \
17931807
HookDefine_Win32(); \
17941808
HookDefine_Linux(); \
17951809
HookDefine_GGP(); \

renderdoc/driver/vulkan/vk_layer.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,16 @@ VK_LAYER_RENDERDOC_CaptureEnumerateInstanceExtensionProperties(
413413
VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
414414
VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName)
415415
{
416+
if(device == VK_NULL_HANDLE || pName == NULL)
417+
return NULL;
418+
419+
PFN_vkGetDeviceProcAddr gpa = GetDeviceDispatchTable(Unwrap(device))->GetDeviceProcAddr;
420+
421+
// if GPA returns NULL, that means that the standard prohibits non-NULL values for this pName
422+
// or that the return value is undefined
423+
if(!gpa || !gpa(Unwrap(device), pName))
424+
return NULL;
425+
416426
if(!strcmp("vkGetDeviceProcAddr", pName))
417427
return (PFN_vkVoidFunction)&VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr;
418428
if(!strcmp("vkCreateDevice", pName))
@@ -422,9 +432,6 @@ VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName)
422432

423433
HookInitVulkanDevice();
424434

425-
if(device == VK_NULL_HANDLE)
426-
return NULL;
427-
428435
InstanceDeviceInfo *instDevInfo = GetRecord(device)->instDevInfo;
429436

430437
DeclExts();

renderdoc/driver/vulkan/vk_overlay.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,19 @@ void VulkanDebugManager::PatchLineStripIndexBuffer(const ActionDescription *acti
364364

365365
if(action->flags & ActionFlags::Indexed)
366366
{
367-
GetBufferData(rs.ibuffer.buf,
368-
rs.ibuffer.offs + uint64_t(action->indexOffset) * rs.ibuffer.bytewidth,
369-
uint64_t(action->numIndices) * rs.ibuffer.bytewidth, indices);
367+
uint64_t offset = uint64_t(action->indexOffset) * rs.ibuffer.bytewidth;
368+
uint64_t data_len = uint64_t(action->numIndices) * rs.ibuffer.bytewidth;
369+
370+
uint64_t len = RDCMIN(data_len, rs.ibuffer.size - offset);
371+
372+
GetBufferData(rs.ibuffer.buf, rs.ibuffer.offs + offset, len, indices);
373+
374+
if(len < data_len)
375+
{
376+
// fill the rest with 0s
377+
indices.resize(static_cast<size_t>(data_len));
378+
memset(indices.data() + len, 0, static_cast<size_t>(data_len - len));
379+
}
370380

371381
if(rs.ibuffer.bytewidth == 4)
372382
idx32 = (uint32_t *)indices.data();

renderdoc/driver/vulkan/vk_postvs.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -4331,8 +4331,13 @@ void VulkanReplay::FetchVSOut(uint32_t eventId, VulkanRenderState &state)
43314331

43324332
// fetch ibuffer
43334333
if(state.ibuffer.buf != ResourceId())
4334-
GetBufferData(state.ibuffer.buf, state.ibuffer.offs + action->indexOffset * idxsize,
4335-
uint64_t(action->numIndices) * idxsize, idxdata);
4334+
{
4335+
uint64_t offset = uint64_t(action->indexOffset) * idxsize;
4336+
uint64_t data_len = uint64_t(action->numIndices) * idxsize;
4337+
4338+
uint64_t len = RDCMIN(data_len, state.ibuffer.size - offset);
4339+
GetBufferData(state.ibuffer.buf, state.ibuffer.offs + offset, len, idxdata);
4340+
}
43364341

43374342
// figure out what the maximum index could be, so we can clamp our index buffer to something
43384343
// sane

renderdoc/driver/vulkan/vk_replay.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId)
11851185
ret.inputAssembly.indexBuffer.resourceId = rm->GetOriginalID(state.ibuffer.buf);
11861186
ret.inputAssembly.indexBuffer.byteOffset = state.ibuffer.offs;
11871187
ret.inputAssembly.indexBuffer.byteStride = state.ibuffer.bytewidth;
1188+
ret.inputAssembly.indexBuffer.byteSize = state.ibuffer.size;
11881189
ret.inputAssembly.primitiveRestartEnable = state.primRestartEnable != VK_FALSE;
11891190
ret.inputAssembly.topology =
11901191
MakePrimitiveTopology(state.primitiveTopology, state.patchControlPoints);

renderdoc/driver/vulkan/vk_state.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -606,9 +606,17 @@ void VulkanRenderState::BindPipeline(WrappedVulkan *vk, VkCommandBuffer cmd,
606606
else if(ibuffer.bytewidth == 1)
607607
type = VK_INDEX_TYPE_UINT8_KHR;
608608

609-
ObjDisp(cmd)->CmdBindIndexBuffer(
610-
Unwrap(cmd), Unwrap(vk->GetResourceManager()->GetCurrentHandle<VkBuffer>(ibuffer.buf)),
611-
ibuffer.offs, type);
609+
VkBuffer idxBufferUnwrapped =
610+
Unwrap(vk->GetResourceManager()->GetCurrentHandle<VkBuffer>(ibuffer.buf));
611+
if(ibuffer.size == VK_WHOLE_SIZE)
612+
{
613+
ObjDisp(cmd)->CmdBindIndexBuffer(Unwrap(cmd), idxBufferUnwrapped, ibuffer.offs, type);
614+
}
615+
else
616+
{
617+
ObjDisp(cmd)->CmdBindIndexBuffer2KHR(Unwrap(cmd), idxBufferUnwrapped, ibuffer.offs,
618+
ibuffer.size, type);
619+
}
612620
}
613621

614622
if(vk->DynamicVertexInput() && dynamicStates[VkDynamicVertexInputEXT])

renderdoc/driver/vulkan/vk_state.h

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ struct VulkanRenderState
150150
{
151151
ResourceId buf;
152152
VkDeviceSize offs = 0;
153+
VkDeviceSize size = VK_WHOLE_SIZE;
153154
int bytewidth = 0;
154155
} ibuffer;
155156

renderdoc/driver/vulkan/vk_stringise.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
template <>
2929
rdcstr DoStringise(const VulkanChunk &el)
3030
{
31-
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1201, "Chunks changed without updating names");
31+
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1202, "Chunks changed without updating names");
3232

3333
BEGIN_ENUM_STRINGISE(VulkanChunk)
3434
{
@@ -233,6 +233,7 @@ rdcstr DoStringise(const VulkanChunk &el)
233233
STRINGISE_ENUM_CLASS(vkCmdDrawMeshTasksEXT)
234234
STRINGISE_ENUM_CLASS(vkCmdDrawMeshTasksIndirectEXT)
235235
STRINGISE_ENUM_CLASS(vkCmdDrawMeshTasksIndirectCountEXT)
236+
STRINGISE_ENUM_CLASS(vkCmdBindIndexBuffer2KHR)
236237
STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk");
237238
}
238239
END_ENUM_STRINGISE()

renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp

+92
Original file line numberDiff line numberDiff line change
@@ -3893,6 +3893,94 @@ void WrappedVulkan::vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer
38933893
}
38943894
}
38953895

3896+
template <typename SerialiserType>
3897+
bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer2KHR(SerialiserType &ser,
3898+
VkCommandBuffer commandBuffer,
3899+
VkBuffer buffer, VkDeviceSize offset,
3900+
VkDeviceSize size, VkIndexType indexType)
3901+
{
3902+
SERIALISE_ELEMENT(commandBuffer);
3903+
SERIALISE_ELEMENT(buffer).Important();
3904+
SERIALISE_ELEMENT(offset).OffsetOrSize();
3905+
SERIALISE_ELEMENT(size).OffsetOrSize();
3906+
SERIALISE_ELEMENT(indexType).Important();
3907+
3908+
Serialise_DebugMessages(ser);
3909+
3910+
SERIALISE_CHECK_READ_ERRORS();
3911+
3912+
if(IsReplayingAndReading())
3913+
{
3914+
m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer));
3915+
3916+
if(IsActiveReplaying(m_State))
3917+
{
3918+
if(InRerecordRange(m_LastCmdBufferID))
3919+
{
3920+
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
3921+
ObjDisp(commandBuffer)
3922+
->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType);
3923+
3924+
{
3925+
VulkanRenderState &renderstate = GetCmdRenderState();
3926+
renderstate.ibuffer.buf = GetResID(buffer);
3927+
renderstate.ibuffer.offs = offset;
3928+
renderstate.ibuffer.size = size;
3929+
3930+
if(indexType == VK_INDEX_TYPE_UINT32)
3931+
renderstate.ibuffer.bytewidth = 4;
3932+
else if(indexType == VK_INDEX_TYPE_UINT8_KHR)
3933+
renderstate.ibuffer.bytewidth = 1;
3934+
else
3935+
renderstate.ibuffer.bytewidth = 2;
3936+
}
3937+
}
3938+
}
3939+
else
3940+
{
3941+
// track while reading, as we need to bind current topology & index byte width in AddAction
3942+
if(indexType == VK_INDEX_TYPE_UINT32)
3943+
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 4;
3944+
else if(indexType == VK_INDEX_TYPE_UINT8_KHR)
3945+
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 1;
3946+
else
3947+
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.bytewidth = 2;
3948+
3949+
// track while reading, as we need to track resource usage
3950+
m_BakedCmdBufferInfo[m_LastCmdBufferID].state.ibuffer.buf = GetResID(buffer);
3951+
3952+
ObjDisp(commandBuffer)
3953+
->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType);
3954+
}
3955+
}
3956+
3957+
return true;
3958+
}
3959+
3960+
void WrappedVulkan::vkCmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3961+
VkDeviceSize offset, VkDeviceSize size,
3962+
VkIndexType indexType)
3963+
{
3964+
SCOPED_DBG_SINK();
3965+
3966+
SERIALISE_TIME_CALL(
3967+
ObjDisp(commandBuffer)
3968+
->CmdBindIndexBuffer2KHR(Unwrap(commandBuffer), Unwrap(buffer), offset, size, indexType));
3969+
3970+
if(IsCaptureMode(m_State))
3971+
{
3972+
VkResourceRecord *record = GetRecord(commandBuffer);
3973+
3974+
CACHE_THREAD_SERIALISER();
3975+
3976+
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdBindIndexBuffer2KHR);
3977+
Serialise_vkCmdBindIndexBuffer2KHR(ser, commandBuffer, buffer, offset, size, indexType);
3978+
3979+
record->AddChunk(scope.Get(&record->cmdInfo->alloc));
3980+
record->MarkBufferFrameReferenced(GetRecord(buffer), 0, VK_WHOLE_SIZE, eFrameRef_Read);
3981+
}
3982+
}
3983+
38963984
template <typename SerialiserType>
38973985
bool WrappedVulkan::Serialise_vkCmdPushConstants(SerialiserType &ser, VkCommandBuffer commandBuffer,
38983986
VkPipelineLayout layout,
@@ -7733,3 +7821,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBeginRendering, VkCommandBuffer comma
77337821
const VkRenderingInfo *pRenderingInfo);
77347822

77357823
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdEndRendering, VkCommandBuffer commandBuffer);
7824+
7825+
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindIndexBuffer2KHR, VkCommandBuffer commandBuffer,
7826+
VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size,
7827+
VkIndexType indexType);

0 commit comments

Comments
 (0)