From 62161b802a8efbf6820ba79f880c99e455ab3bf6 Mon Sep 17 00:00:00 2001 From: lucy96chen <47800040+lucy96chen@users.noreply.github.com> Date: Thu, 9 Dec 2021 15:15:16 -0800 Subject: Implement instanced and indirect draw calls (#2053) * Added implementations of drawInstanced, drawIndexedInstanced, drawIndirect, and drawIndexedIndirect to both render-d3d12 and render-vk * drawInstanced test WIP * Draw calls implemented, working on debugging test * Added new test and accompanying shader file * Fixes. * Fixes. Co-authored-by: Yong He Co-authored-by: Yong He --- tools/gfx/vulkan/render-vk.cpp | 87 +++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 23 deletions(-) (limited to 'tools/gfx/vulkan/render-vk.cpp') diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp index c48faeb7b..015f7e415 100644 --- a/tools/gfx/vulkan/render-vk.cpp +++ b/tools/gfx/vulkan/render-vk.cpp @@ -4093,12 +4093,19 @@ public: IBufferResource* countBuffer, uint64_t countOffset) override { - SLANG_UNUSED(maxDrawCount); - SLANG_UNUSED(argBuffer); - SLANG_UNUSED(argOffset); - SLANG_UNUSED(countBuffer); - SLANG_UNUSED(countOffset); - SLANG_UNIMPLEMENTED_X("drawIndirect"); + prepareDraw(); + auto& api = *m_api; + // Bind the vertex buffer + if (m_boundVertexBuffers.getCount() > 0 && m_boundVertexBuffers[0].m_buffer) + { + const BoundVertexBuffer& boundVertexBuffer = m_boundVertexBuffers[0]; + + VkBuffer vertexBuffers[] = { boundVertexBuffer.m_buffer->m_buffer.m_buffer }; + VkDeviceSize offsets[] = { VkDeviceSize(boundVertexBuffer.m_offset) }; + + api.vkCmdBindVertexBuffers(m_vkCommandBuffer, 0, 1, vertexBuffers, offsets); + } + api.vkCmdDrawIndirect(m_vkCommandBuffer, (VkBuffer)argBuffer, argOffset, maxDrawCount, sizeof(VkDrawIndirectCommand)); } virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedIndirect( @@ -4108,12 +4115,24 @@ public: IBufferResource* countBuffer, uint64_t countOffset) override { - SLANG_UNUSED(maxDrawCount); - SLANG_UNUSED(argBuffer); - SLANG_UNUSED(argOffset); - SLANG_UNUSED(countBuffer); - SLANG_UNUSED(countOffset); - SLANG_UNIMPLEMENTED_X("drawIndirect"); + prepareDraw(); + auto& api = *m_api; + api.vkCmdBindIndexBuffer( + m_vkCommandBuffer, + m_boundIndexBuffer.m_buffer->m_buffer.m_buffer, + m_boundIndexBuffer.m_offset, + m_boundIndexFormat); + // Bind the vertex buffer + if (m_boundVertexBuffers.getCount() > 0 && m_boundVertexBuffers[0].m_buffer) + { + const BoundVertexBuffer& boundVertexBuffer = m_boundVertexBuffers[0]; + + VkBuffer vertexBuffers[] = { boundVertexBuffer.m_buffer->m_buffer.m_buffer }; + VkDeviceSize offsets[] = { VkDeviceSize(boundVertexBuffer.m_offset) }; + + api.vkCmdBindVertexBuffers(m_vkCommandBuffer, 0, 1, vertexBuffers, offsets); + } + api.vkCmdDrawIndirect(m_vkCommandBuffer, (VkBuffer)argBuffer, argOffset, maxDrawCount, sizeof(VkDrawIndexedIndirectCommand)); } virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions( @@ -4133,11 +4152,20 @@ public: UInt startVertex, UInt startInstanceLocation) override { - SLANG_UNUSED(vertexCount); - SLANG_UNUSED(instanceCount); - SLANG_UNUSED(startVertex); - SLANG_UNUSED(startInstanceLocation); - SLANG_UNIMPLEMENTED_X("drawInstanced"); + prepareDraw(); + auto& api = *m_api; + // Bind the vertex buffer + if (m_boundVertexBuffers.getCount() > 0 && m_boundVertexBuffers[0].m_buffer) + { + const BoundVertexBuffer& boundVertexBuffer = m_boundVertexBuffers[0]; + + VkBuffer vertexBuffers[] = { boundVertexBuffer.m_buffer->m_buffer.m_buffer }; + VkDeviceSize offsets[] = { VkDeviceSize(boundVertexBuffer.m_offset) }; + + api.vkCmdBindVertexBuffers(m_vkCommandBuffer, 0, 1, vertexBuffers, offsets); + } + api.vkCmdDraw(m_vkCommandBuffer, static_cast(vertexCount), static_cast(instanceCount), + static_cast(startVertex), static_cast(startInstanceLocation)); } virtual SLANG_NO_THROW void SLANG_MCALL drawIndexedInstanced( @@ -4147,12 +4175,25 @@ public: int32_t baseVertexLocation, uint32_t startInstanceLocation) override { - SLANG_UNUSED(indexCount); - SLANG_UNUSED(instanceCount); - SLANG_UNUSED(startIndexLocation); - SLANG_UNUSED(baseVertexLocation); - SLANG_UNUSED(startInstanceLocation); - SLANG_UNIMPLEMENTED_X("drawIndexedInstanced"); + prepareDraw(); + auto& api = *m_api; + api.vkCmdBindIndexBuffer( + m_vkCommandBuffer, + m_boundIndexBuffer.m_buffer->m_buffer.m_buffer, + m_boundIndexBuffer.m_offset, + m_boundIndexFormat); + // Bind the vertex buffer + if (m_boundVertexBuffers.getCount() > 0 && m_boundVertexBuffers[0].m_buffer) + { + const BoundVertexBuffer& boundVertexBuffer = m_boundVertexBuffers[0]; + + VkBuffer vertexBuffers[] = { boundVertexBuffer.m_buffer->m_buffer.m_buffer }; + VkDeviceSize offsets[] = { VkDeviceSize(boundVertexBuffer.m_offset) }; + + api.vkCmdBindVertexBuffers(m_vkCommandBuffer, 0, 1, vertexBuffers, offsets); + } + api.vkCmdDraw(m_vkCommandBuffer, static_cast(indexCount), static_cast(instanceCount), + static_cast(baseVertexLocation), static_cast(startInstanceLocation)); } }; -- cgit v1.2.3