14 Portal::Graphics::RenderConfig resolve_config(
const Portal::Graphics::RenderConfig& config)
18 switch (config.topology) {
20 if (config.vertex_shader.empty())
22 if (config.fragment_shader.empty())
23 resolved_config.fragment_shader =
"point.frag.spv";
28 if (config.vertex_shader.empty())
29 resolved_config.vertex_shader =
"line.vert.spv";
31 if (config.fragment_shader.empty())
32 resolved_config.fragment_shader =
"line.frag.spv";
34#ifndef MAYAFLUX_PLATFORM_MACOS
35 if (config.geometry_shader.empty())
36 resolved_config.geometry_shader =
"line.geom.spv";
43 if (config.vertex_shader.empty())
44 resolved_config.vertex_shader =
"triangle.vert.spv";
45 if (config.fragment_shader.empty())
46 resolved_config.fragment_shader =
"triangle.frag.spv";
49 if (config.vertex_shader.empty())
50 resolved_config.vertex_shader =
"point.vert.spv";
51 if (config.fragment_shader.empty())
52 resolved_config.fragment_shader =
"point.frag.spv";
55 return resolved_config;
61 std::shared_ptr<Nodes::Network::NodeNetwork>
network,
62 const std::string& binding_name,
63 float over_allocate_factor)
65 calculate_buffer_size(
network, over_allocate_factor),
67 Kakshya::DataModality::VERTEX_POSITIONS_3D)
69 , m_binding_name(binding_name)
72 error<std::invalid_argument>(
75 std::source_location::current(),
76 "Cannot create NetworkGeometryBuffer with null NodeNetwork");
80 "Created NetworkGeometryBuffer '{}' for {} nodes ({} bytes estimated)",
88 auto self = std::dynamic_pointer_cast<NetworkGeometryBuffer>(shared_from_this());
90 m_processor = std::make_shared<NetworkGeometryProcessor>();
101 chain = std::make_shared<BufferProcessingChain>();
104 chain->set_preferred_token(token);
107 "Setup NetworkGeometryProcessor for '{}' with token {}",
113 auto resolved_config = resolve_config(config);
128 auto* operator_ptr =
m_network->get_operator();
132 return static_cast<uint32_t
>(graphics_op->get_vertex_count());
136 return static_cast<uint32_t
>(
m_network->get_node_count());
140 const std::shared_ptr<Nodes::Network::NodeNetwork>&
network,
141 float over_allocate_factor)
147 size_t node_count =
network->get_node_count();
148 if (node_count == 0) {
150 "NodeNetwork has zero nodes. Buffer will be created with minimum size.");
154 size_t base_size = 0;
156 if (
auto* operator_ptr =
network->get_operator()) {
158 size_t vertex_count = graphics_op->get_vertex_count();
159 auto layout = graphics_op->get_vertex_layout();
161 if (vertex_count > 0 && layout.stride_bytes > 0) {
162 base_size = vertex_count * layout.stride_bytes;
165 "Network geometry buffer sizing: {} vertices × {} bytes = {} bytes (operator: {})",
166 vertex_count, layout.stride_bytes, base_size, operator_ptr->get_type_name());
171 if (base_size == 0) {
173 base_size = node_count * vertex_size;
176 "Network geometry buffer fallback sizing: {} nodes × {} bytes = {} bytes",
177 node_count, vertex_size, base_size);
180 auto allocated_size =
static_cast<size_t>(
181 static_cast<float>(base_size) * over_allocate_factor);
183 if (over_allocate_factor > 1.0F) {
185 "Over-allocated by {}x: {} → {} bytes",
186 over_allocate_factor, base_size, allocated_size);
189 return allocated_size;
194 const auto resolved_config = resolve_config(config);
195 auto self = std::dynamic_pointer_cast<VKBuffer>(shared_from_this());
197 std::shared_ptr<RenderProcessor> render;
202 render->set_vertex_range(0, 0);
207 "Added chain render processor #{} to NetworkGeometryBuffer",
220 uint32_t vertex_offset,
221 uint32_t vertex_count,
222 const std::optional<Kakshya::VertexLayout>& layout)
230 const size_t ci = index - 1;
235 entry.vertex_offset = vertex_offset;
236 entry.vertex_count = vertex_count;
237 entry.render_processor->set_vertex_range(vertex_offset, vertex_count);
240 auto self = std::dynamic_pointer_cast<VKBuffer>(shared_from_this());
241 entry.render_processor->set_buffer_vertex_layout(self, *layout);
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
Core::GlobalNetworkConfig network
std::vector< ChainRenderEntry > m_chain_render_processors
NetworkGeometryBuffer(std::shared_ptr< Nodes::Network::NodeNetwork > network, const std::string &binding_name="network_geometry", float over_allocate_factor=2.0F)
Create geometry buffer from network.
std::shared_ptr< NetworkGeometryProcessor > m_processor
void add_chain_operator_rendering(const RenderConfig &config)
Add a RenderProcessor for a specific operator chain index.
uint32_t get_vertex_count() const
Get current vertex count (aggregated from all network nodes)
std::shared_ptr< Nodes::Network::NodeNetwork > m_network
void setup_rendering(const RenderConfig &config)
Setup rendering with RenderProcessor.
std::string m_binding_name
void update_chain_render_range(size_t index, uint32_t vertex_offset, uint32_t vertex_count, const std::optional< Kakshya::VertexLayout > &layout)
Update vertex range for a specific operator chain index.
std::shared_ptr< RenderProcessor > get_chain_render_processor(size_t index) const
Get RenderProcessor for a specific operator chain index.
static size_t calculate_buffer_size(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, float over_allocate_factor)
Calculate initial buffer size based on network node count.
void setup_processors(ProcessingToken token) override
Initialize the buffer and its processors.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Portal::Graphics::RenderConfig RenderConfig
vk::DeviceSize get_size_bytes() const
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
std::shared_ptr< RenderProcessor > m_render_processor
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Vulkan-backed buffer wrapper used in processing chains.
Operator that produces GPU-renderable geometry.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
BufferUsageHint
Semantic usage hint for buffer allocation and memory properties.
Vertex type for point primitives (POINT_LIST topology)
static VertexLayout for_lines(uint32_t stride=60)
Factory: layout for LineVertex (position, color, thickness, uv, normal, tangent)
std::string vertex_shader
Unified rendering configuration for graphics buffers.