diff --git a/util/test/demos/vk/vk_indirect.cpp b/util/test/demos/vk/vk_indirect.cpp index 41748dc0d..9d6e277da 100644 --- a/util/test/demos/vk/vk_indirect.cpp +++ b/util/test/demos/vk/vk_indirect.cpp @@ -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);