MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
InstanceNetworkBuffer.cpp
Go to the documentation of this file.
2
6
8
9namespace MayaFlux::Buffers {
10
11// =============================================================================
12// Construction
13// =============================================================================
14
16 std::shared_ptr<Nodes::Network::InstanceNetwork> network,
17 float over_allocate_factor)
18 : VKBuffer(
19 estimate_vertex_bytes(network, over_allocate_factor),
20 Usage::VERTEX,
21 Kakshya::DataModality::VERTEX_POSITIONS_3D)
22 , m_network(std::move(network))
23{
24 if (!m_network) {
25 error<std::invalid_argument>(
27 std::source_location::current(),
28 "InstanceNetworkBuffer: null InstanceNetwork");
29 }
30
31 const auto& slots = m_network->slots();
33 = (!slots.empty() && slots[0].node)
34 ? slots[0].node->get_primitive_topology()
36
37 RenderConfig defaults;
38 defaults.topology = topo;
40 m_render_config = defaults;
41
43
45 "InstanceNetworkBuffer: {} slots, {} bytes estimated",
46 m_network->slot_count(), get_size_bytes());
47}
48
49// =============================================================================
50// setup_processors
51// =============================================================================
52
54{
55 m_ssbo_processor = std::make_shared<InstanceSSBOProcessor>(m_network);
56 m_ssbo_processor->set_processing_token(token);
58
59 auto chain = get_processing_chain();
60 if (!chain) {
61 chain = std::make_shared<BufferProcessingChain>();
63 }
64 chain->set_preferred_token(token);
65
67 "InstanceNetworkBuffer::setup_processors with token {}",
68 static_cast<int>(token));
69}
70
71// =============================================================================
72// setup_rendering
73// =============================================================================
74
76{
77 if (!config.vertex_shader.empty())
79 if (!config.fragment_shader.empty())
81
85
86 for (const auto& [name, tex] : config.additional_textures)
87 m_render_config.additional_textures.emplace_back(name, tex);
88
89 switch (m_render_config.topology) {
92 m_render_config.vertex_shader = "instance_point.vert.spv";
94 m_render_config.fragment_shader = "point.frag.spv";
95 break;
96
100 m_render_config.vertex_shader = "instance_line.vert.spv";
102 m_render_config.fragment_shader = "line.frag.spv";
103#ifndef MAYAFLUX_PLATFORM_MACOS
105 m_render_config.geometry_shader = "line.geom.spv";
106#else
108#endif
109 break;
110
111 default:
112 if (m_render_config.vertex_shader.empty())
113 m_render_config.vertex_shader = "instance.vert.spv";
115 m_render_config.fragment_shader = "triangle.frag.spv";
116 break;
117 }
118
120 sc.bindings["instanceTransforms"] = ShaderBinding(
122 vk::DescriptorType::eStorageBuffer);
123
124 uint32_t binding_idx = 0;
125 for (const auto& [name, _] : m_render_config.additional_textures)
126 sc.bindings[name] = ShaderBinding(0, 2 + binding_idx++, vk::DescriptorType::eCombinedImageSampler);
127
129
130 for (const auto& [name, tex] : m_render_config.additional_textures)
131 m_render_processor->bind_texture(name, tex);
132
133 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
134
136 "InstanceNetworkBuffer::setup_rendering: vert={} frag={}",
138}
139
140// =============================================================================
141// Private
142// =============================================================================
143
145 const std::shared_ptr<Nodes::Network::InstanceNetwork>& network,
146 float factor)
147{
148 constexpr size_t k_min = 64L * 1024;
149 if (!network || network->slot_count() == 0)
150 return k_min;
151
152 const auto& slots = network->slots();
153 if (!slots[0].node)
154 return k_min;
155
156 const size_t capacity = slots[0].node->get_vertex_buffer_size_bytes();
157 if (capacity == 0)
158 return k_min;
159
160 return static_cast<size_t>(static_cast<float>(capacity) * factor);
161}
162
163} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:39
static size_t estimate_vertex_bytes(const std::shared_ptr< Nodes::Network::InstanceNetwork > &network, float factor)
InstanceNetworkBuffer(std::shared_ptr< Nodes::Network::InstanceNetwork > network, float over_allocate_factor=1.5F)
std::shared_ptr< Nodes::Network::InstanceNetwork > m_network
void setup_rendering(const RenderConfig &config)
std::shared_ptr< InstanceSSBOProcessor > m_ssbo_processor
void setup_processors(ProcessingToken token) override
Setup processors with a processing token.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:263
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:247
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:278
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:268
void set_needs_depth_attachment(bool needs)
Mark this buffer as requiring depth testing when rendered.
Definition VKBuffer.hpp:567
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:336
std::shared_ptr< RenderProcessor > m_render_processor
Definition VKBuffer.hpp:620
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:597
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:76
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
BufferUsageHint
Semantic usage hint for buffer allocation and memory properties.
PrimitiveTopology
Vertex assembly primitive topology.
Describes how a VKBuffer binds to a shader descriptor.
std::shared_ptr< Core::Window > target_window
std::vector< std::pair< std::string, std::shared_ptr< Core::VKImage > > > additional_textures
For child-specific fields.
Unified rendering configuration for graphics buffers.