From 684438cd678dac0840a162a36e6c7bd120178205 Mon Sep 17 00:00:00 2001 From: caiowakamatsu Date: Mon, 30 Mar 2026 00:07:21 -0300 Subject: [PATCH] add indirect command buffer to registered meshes --- source/render/renderer.cpp | 24 ++++++++++++++++++++---- source/render/renderer.hpp | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/source/render/renderer.cpp b/source/render/renderer.cpp index 990560c..6bd84cc 100644 --- a/source/render/renderer.cpp +++ b/source/render/renderer.cpp @@ -103,18 +103,34 @@ std::uint32_t renderer::register_mesh(const game::mesh_node &mesh) { context.superframe_allocator, vuk::MemoryUsage::eCPUtoGPU, vuk::DomainFlagBits::eTransferOperation, std::span(mesh.indices)); + const auto indirect_draw = std::array({ + static_cast(mesh.indices.size()), // index count + 1, // instance count + 0, // first index + 0, // vertex offset (int32 technically) + 0, // first instance + }); + + auto [indirect_buffer, indirect_future] = vuk::create_buffer( + context.superframe_allocator, vuk::MemoryUsage::eCPUtoGPU, + vuk::DomainFlagBits::eTransferOperation, + std::span(indirect_draw)); + auto futures = std::vector(); futures.push_back(std::move(vertex_future)); futures.push_back(std::move(index_future)); + futures.push_back(std::move(indirect_future)); // TODO: Make async? vuk::wait_for_values_explicit(context.superframe_allocator, context.compiler, std::span(futures)); - registered_meshes.insert({id, loaded_mesh{ - .vertices = std::move(vertex_buffer), - .indices = std::move(index_buffer), - }}); + registered_meshes.insert( + {id, loaded_mesh{ + .vertices = std::move(vertex_buffer), + .indices = std::move(index_buffer), + .indirect_command = std::move(indirect_buffer), + }}); return id; } diff --git a/source/render/renderer.hpp b/source/render/renderer.hpp index f2cd2b6..53f093a 100644 --- a/source/render/renderer.hpp +++ b/source/render/renderer.hpp @@ -26,6 +26,7 @@ private: struct loaded_mesh { vuk::Unique vertices; vuk::Unique indices; + vuk::Unique indirect_command; }; std::unordered_map registered_meshes;