From 330133ba101591c065e041ae6d5a67bf2cc1c0cd Mon Sep 17 00:00:00 2001 From: harrand Date: Mon, 20 Feb 2023 01:13:17 +0000 Subject: [PATCH] * Vulkan WIP - Draw Indirect Count --- demo/gl/tz_gpu_driven_demo.cpp | 1 + src/tz/gl/api/renderer.hpp | 2 ++ src/tz/gl/impl/vulkan/detail/command.cpp | 12 ++++++++++++ src/tz/gl/impl/vulkan/detail/command.hpp | 20 +++++++++++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/demo/gl/tz_gpu_driven_demo.cpp b/demo/gl/tz_gpu_driven_demo.cpp index f706cb38cd..1c91921fcf 100644 --- a/demo/gl/tz_gpu_driven_demo.cpp +++ b/demo/gl/tz_gpu_driven_demo.cpp @@ -25,6 +25,7 @@ int main() tz::gl::renderer_info rinfo; rinfo.debug_name("Triangle renderer"); tz::gl::resource_handle dbufh_ref = rinfo.ref_resource(ch, dbufh); + rinfo.set_options({tz::gl::renderer_option::draw_indirect_count}); rinfo.state().graphics.draw_buffer = dbufh_ref; rinfo.shader().set_shader(tz::gl::shader_stage::vertex, ImportedShaderSource(tz_gpu_driven_demo_render, vertex)); rinfo.shader().set_shader(tz::gl::shader_stage::fragment, ImportedShaderSource(tz_gpu_driven_demo_render, fragment)); diff --git a/src/tz/gl/api/renderer.hpp b/src/tz/gl/api/renderer.hpp index d76d697444..9bb0d508c7 100644 --- a/src/tz/gl/api/renderer.hpp +++ b/src/tz/gl/api/renderer.hpp @@ -42,6 +42,8 @@ namespace tz::gl no_clear_output, /// - When a renderer is invoked, the output image is not presented to the screen. If the output is an image_output, this has no effect. no_present, + /// - The renderer's `state().graphics.draw_buffer` is assumed to contain a uint32 representing the draw count at the very start of the buffer, and the draw commands appear after that count in memory. + draw_indirect_count, // Final debug ui renderer. Do not use. _internal_final_dbgui_renderer, // Internal renderer. Has no effect aside from hiding it from the dbgui. diff --git a/src/tz/gl/impl/vulkan/detail/command.cpp b/src/tz/gl/impl/vulkan/detail/command.cpp index f4485a684f..425002d4ea 100644 --- a/src/tz/gl/impl/vulkan/detail/command.cpp +++ b/src/tz/gl/impl/vulkan/detail/command.cpp @@ -142,12 +142,24 @@ namespace tz::gl::vk2 vkCmdDrawIndirect(this->get_command_buffer().native(), command.draw_indirect_buffer->native(), command.offset, command.draw_count, command.stride); } + void CommandBufferRecording::draw_indirect_count(VulkanCommand::DrawIndirectCount command) + { + this->register_command(command); + vkCmdDrawIndirectCount(this->get_command_buffer().native(), command.draw_indirect_buffer->native(), command.offset, command.draw_indirect_buffer->native(), 0, command.max_draw_count, command.stride); + } + void CommandBufferRecording::draw_indexed_indirect(VulkanCommand::DrawIndexedIndirect command) { this->register_command(command); vkCmdDrawIndexedIndirect(this->get_command_buffer().native(), command.draw_indirect_buffer->native(), command.offset, command.draw_count, command.stride); } + void CommandBufferRecording::draw_indexed_indirect_count(VulkanCommand::DrawIndexedIndirectCount command) + { + this->register_command(command); + vkCmdDrawIndexedIndirectCount(this->get_command_buffer().native(), command.draw_indirect_buffer->native(), command.offset, command.draw_indirect_buffer->native(), 0, command.max_draw_count, command.stride); + } + void CommandBufferRecording::bind_index_buffer(VulkanCommand::BindIndexBuffer command) { this->register_command(command); diff --git a/src/tz/gl/impl/vulkan/detail/command.hpp b/src/tz/gl/impl/vulkan/detail/command.hpp index 1375ae1a53..f159842799 100644 --- a/src/tz/gl/impl/vulkan/detail/command.hpp +++ b/src/tz/gl/impl/vulkan/detail/command.hpp @@ -61,6 +61,14 @@ namespace tz::gl::vk2 VkDeviceSize offset = 0; }; + struct DrawIndirectCount + { + const Buffer* draw_indirect_buffer; + std::uint32_t max_draw_count; + std::uint32_t stride; + VkDeviceSize offset = sizeof(std::uint32_t); + }; + /** * Record an indexed indirect draw. * See @ref COmmandBufferRecording::draw_indexed_indirect for usage. @@ -73,6 +81,14 @@ namespace tz::gl::vk2 VkDeviceSize offset = 0; }; + struct DrawIndexedIndirectCount + { + const Buffer* draw_indirect_buffer; + std::uint32_t max_draw_count; + std::uint32_t stride; + VkDeviceSize offset = sizeof(std::uint32_t); + }; + /** * Bind an index buffer. * See @ref CommandBufferRecording::bind_index_buffer for usage. @@ -230,7 +246,7 @@ namespace tz::gl::vk2 struct DebugEndLabel{}; /// variant type which has alternatives for every single possible recordable command type. - using variant = std::variant; + using variant = std::variant; }; enum class CommandPoolFlag @@ -317,11 +333,13 @@ namespace tz::gl::vk2 * See @ref VulkanCommand::DrawIndirect for details. */ void draw_indirect(VulkanCommand::DrawIndirect draw); + void draw_indirect_count(VulkanCommand::DrawIndirectCount draw); /** * Perform some indirect, indexed draws. * See @ref VulkanCommand::DrawIndexedIndirect for details. */ void draw_indexed_indirect(VulkanCommand::DrawIndexedIndirect draw); + void draw_indexed_indirect_count(VulkanCommand::DrawIndexedIndirectCount draw); void bind_index_buffer(VulkanCommand::BindIndexBuffer bind); /** * Bind a list of @ref DescriptorSet.