MayaFlux 1.0.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
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
86
87 for (const auto& [name, tex] : config.additional_textures)
88 m_render_config.additional_textures.emplace_back(name, tex);
89
90#ifdef MAYAFLUX_PLATFORM_MACOS
94 }
95#endif
96
99 m_render_config.vertex_shader = "instance_milled.vert.spv";
101 m_render_config.fragment_shader = "milled_shape.frag.spv";
103 } else {
104 switch (m_render_config.topology) {
106 if (m_render_config.vertex_shader.empty())
107 m_render_config.vertex_shader = "instance_point.vert.spv";
109 m_render_config.fragment_shader = "point.frag.spv";
110 break;
111
114 if (m_render_config.vertex_shader.empty())
115 m_render_config.vertex_shader = "instance_line.vert.spv";
117 m_render_config.fragment_shader = "line.frag.spv";
119 m_render_config.geometry_shader = "line.geom.spv";
120 break;
121
122 default:
123 if (m_render_config.vertex_shader.empty())
124 m_render_config.vertex_shader = "instance.vert.spv";
126 m_render_config.fragment_shader = "triangle.frag.spv";
127 break;
128 }
129 }
130
132 sc.bindings["instanceTransforms"] = ShaderBinding(
134 vk::DescriptorType::eStorageBuffer);
135
136 uint32_t binding_idx = 0;
137 for (const auto& [name, _] : m_render_config.additional_textures)
138 sc.bindings[name] = ShaderBinding(0, 2 + binding_idx++, vk::DescriptorType::eCombinedImageSampler);
139
141
142 for (const auto& [name, tex] : m_render_config.additional_textures)
143 m_render_processor->bind_texture(name, tex);
144
145 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
146
148 "InstanceNetworkBuffer::setup_rendering: vert={} frag={}",
150}
151
152// =============================================================================
153// Private
154// =============================================================================
155
157 const std::shared_ptr<Nodes::Network::InstanceNetwork>& network,
158 float factor)
159{
160 constexpr size_t k_min = 64L * 1024;
161 if (!network || network->slot_count() == 0)
162 return k_min;
163
164 const auto& slots = network->slots();
165 if (!slots[0].node)
166 return k_min;
167
168 const size_t capacity = slots[0].node->get_vertex_buffer_size_bytes();
169 if (capacity == 0)
170 return k_min;
171
172 return static_cast<size_t>(static_cast<float>(capacity) * factor);
173}
174
175} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:43
BufferProcessingChain * chain
std::string name
Definition VKDevice.cpp:123
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:271
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:255
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:280
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:276
void set_needs_depth_attachment(bool needs)
Mark this buffer as requiring depth testing when rendered.
Definition VKBuffer.hpp:591
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:344
std::shared_ptr< RenderProcessor > m_render_processor
Definition VKBuffer.hpp:654
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:631
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
bool triangulate
Reduce supplied spans to triangles before drawing them.
Unified rendering configuration for graphics buffers.