VK_Indirect: add a large IndirectCount draw before execute secondary

This commit is contained in:
Jake Turner
2026-07-17 06:16:19 +01:00
parent 97a11ae6a9
commit 74d1241a55
+30
View File
@@ -99,6 +99,17 @@ void main()
ssbo.data[20] = uvec4(3, 4, 3, 4); // draw verts 3..5
ssbo.data[21] = uvec4(3, 2, 6, 2); // draw verts 6..8
ssbo.data[22] = uvec4(3, 5, 9, 5); // draw verts 9..11
// write count parameters for large indirect count draw
uint i = 30;
ssbo.data[i++] = uvec4(20*3, 0, 0, 0);
// vkCmdDrawIndirectCountKHR()
for (uint j = 0; j < 20; ++j)
{
ssbo.data[i++] = uvec4(3, 4, 3, 4); // draw verts 3..5
ssbo.data[i++] = uvec4(3, 2, 6, 2); // draw verts 6..8
ssbo.data[i++] = uvec4(3, 5, 9, 5); // draw verts 9..11
}
}
}
@@ -534,6 +545,25 @@ void main()
vkCmdExecuteCommands(primary, 1, &dispatch_secondary);
// IndirectCount draw in primary buffer which a large count in buffer, before execute secondary
if(KHR_draw_indirect_count)
{
vkCmdBeginRenderPass(
primary,
vkh::RenderPassBeginInfo(mainWindow->rp, mainWindow->GetFB(), mainWindow->scissor),
VK_SUBPASS_CONTENTS_INLINE);
vkCmdBindPipeline(primary, VK_PIPELINE_BIND_POINT_GRAPHICS, drawpipe);
vkCmdSetViewport(primary, 0, 1, &mainWindow->viewport);
vkCmdSetScissor(primary, 0, 1, &mainWindow->scissor);
vkh::cmdBindVertexBuffers(primary, 0, {vb.buffer}, {0});
vkCmdBindIndexBuffer(primary, ib.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndirectCountKHR(primary, ssbo.buffer, 31 * sizeof(uvec4), ssbo.buffer,
30 * sizeof(uvec4) + 0 * sizeof(uint32_t), 128, sizeof(uvec4));
vkCmdEndRenderPass(primary);
}
vkCmdBeginRenderPass(
primary, vkh::RenderPassBeginInfo(mainWindow->rp, mainWindow->GetFB(), mainWindow->scissor),
VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);