17 const std::string& name,
18 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
19 const std::shared_ptr<VKBuffer>& vertex_buffer)
22 error<std::invalid_argument>(
25 std::source_location::current(),
26 "Cannot bind null network '{}'", name);
30 error<std::invalid_argument>(
33 std::source_location::current(),
34 "Cannot bind network '{}' to null vertex buffer", name);
37 std::shared_ptr<VKBuffer> staging =
nullptr;
38 if (!vertex_buffer->is_host_visible()) {
42 "Created staging buffer for device-local network geometry '{}' ({} bytes)",
43 name, vertex_buffer->get_size_bytes());
46 "No staging needed for host-visible network geometry '{}'", name);
51 .gpu_vertex_buffer = vertex_buffer,
52 .staging_buffer = staging
56 "Bound network '{}' ({} nodes, {} bytes buffer)",
57 name, network->get_node_count(), vertex_buffer->get_size_bytes());
64 "Attempted to unbind non-existent network '{}'", name);
67 "Unbound network '{}'", name);
78 std::vector<std::string> names;
81 names.push_back(name);
91std::optional<NetworkGeometryProcessor::NetworkBinding>
107 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
110 "NetworkGeometryProcessor requires VKBuffer, got different buffer type");
115 if (!binding.network || !binding.network->is_enabled()) {
117 "Network '{}' disabled, skipping upload", name);
122 if (gpu_data.vertex_data.empty()) {
123 if (binding.gpu_vertex_buffer->is_host_visible())
124 binding.gpu_vertex_buffer->clear();
128 if (gpu_data.vertex_data.empty() || gpu_data.vertex_count == 0) {
129 if (binding.gpu_vertex_buffer->is_host_visible()) {
130 binding.gpu_vertex_buffer->clear();
133 "Network '{}' has no vertices, cleared buffer", name);
137 size_t required_size = gpu_data.vertex_data.size();
138 size_t available_size = binding.gpu_vertex_buffer->get_size_bytes();
141 gpu_data.vertex_data.data(),
142 gpu_data.vertex_data.size(),
143 binding.gpu_vertex_buffer,
144 binding.staging_buffer);
146 auto layout = gpu_data.layout;
148 binding.gpu_vertex_buffer->set_vertex_layout(layout.value());
151 "Uploaded {} vertices from network '{}' ({} bytes)",
152 gpu_data.vertex_count, name, gpu_data.vertex_data.size());
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
ProcessingToken m_processing_token
std::unordered_map< std::string, NetworkBinding > m_bindings
void unbind_network(const std::string &name)
Remove a network binding.
NetworkGeometryProcessor()
bool has_binding(const std::string &name) const
Check if a binding exists.
std::optional< NetworkBinding > get_binding(const std::string &name) const
Get a specific binding.
size_t get_binding_count() const
Get number of active bindings.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
BufferProcessor interface - aggregates and uploads network geometry.
std::vector< std::string > get_binding_names() const
Get all binding names.
void bind_network(const std::string &name, const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const std::shared_ptr< VKBuffer > &vertex_buffer)
Bind a network to a GPU vertex buffer.
void initialize_buffer_service()
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.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
std::shared_ptr< VKBuffer > create_staging_buffer(size_t size)
Create staging buffer for transfers.
NetworkGpuData extract_network_gpu_data(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, std::string_view name)
Extract GPU geometry data from a NodeNetwork via its GraphicsOperator.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
std::shared_ptr< Nodes::Network::NodeNetwork > network
Structure representing a network geometry binding.