13 std::shared_ptr<Nodes::Network::InstanceNetwork>
network)
26 "InstanceSSBOProcessor attached to empty network");
30 auto vk_buf = std::dynamic_pointer_cast<VKBuffer>(buffer);
33 "InstanceSSBOProcessor: attached buffer is not a VKBuffer");
39 const size_t slot_count =
m_network->slot_count();
43 const size_t ssbo_bytes = slot_count *
sizeof(glm::mat4);
55 "InstanceSSBOProcessor: {} slots, {} bytes template, {} bytes SSBO",
56 slot_count, vk_buf->get_size_bytes(), ssbo_bytes);
68 auto vk_buf = std::dynamic_pointer_cast<VKBuffer>(buffer);
69 if (!vk_buf ||
m_network->slot_count() == 0)
74 if (slots[0].node && slots[0].node->needs_gpu_update())
92 if (slots.empty() || !slots[0].node)
95 const auto span = slots[0].node->get_vertex_data();
101 if (!vertex_buf->has_vertex_layout()) {
102 if (
auto layout = slots[0].node->get_vertex_layout()) {
103 layout->vertex_count =
static_cast<uint32_t
>(span.size_bytes() / layout->stride_bytes);
104 vertex_buf->set_vertex_layout(*layout);
114 for (
const auto& slot : slots)
123 if (
auto rp = vertex_buf->get_render_processor())
124 rp->set_instance_count(
static_cast<uint32_t
>(slots.size()));
132 auto& bindings = vertex_buf->get_engine_context().ssbo_bindings;
137 info.
type = vk::DescriptorType::eStorageBuffer;
142 auto it = std::ranges::find_if(bindings, [](
const auto&
b) {
145 if (it != bindings.end()) {
148 bindings.push_back(info);
154 return std::ranges::any_of(
m_network->slots(), [](
const auto& s) { return s.dirty; });
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
Core::GlobalNetworkConfig network
bool any_slot_dirty() const
std::shared_ptr< VKBuffer > m_vertex_staging
void push_ssbo_binding(const std::shared_ptr< VKBuffer > &vertex_buf)
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
std::shared_ptr< Nodes::Network::InstanceNetwork > m_network
static constexpr uint32_t k_transform_ssbo_binding
std::vector< glm::mat4 > m_transform_scratch
void upload_transforms(const std::shared_ptr< VKBuffer > &vertex_buf)
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void upload_template(const std::shared_ptr< VKBuffer > &vertex_buf)
std::shared_ptr< VKBuffer > m_transform_ssbo
InstanceSSBOProcessor(std::shared_ptr< Nodes::Network::InstanceNetwork > network)
std::shared_ptr< VKBuffer > m_transform_staging
void ensure_initialized(const std::shared_ptr< VKBuffer > &buffer)
@ COMPUTE
Storage buffer for compute shaders (device-local)
void upload_resizing(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging, float growth_factor)
Upload size bytes to target, growing both buffers first if needed.
std::shared_ptr< VKBuffer > create_staging_buffer(size_t size)
Create staging buffer for transfers.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
@ UNKNOWN
Unknown or undefined modality.
vk::DescriptorBufferInfo buffer_info