MayaFlux 0.4.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
107 m_render_config.vertex_shader = "instance_line_fallback.vert.spv";
109#endif
110 break;
111
112 default:
113 if (m_render_config.vertex_shader.empty())
114 m_render_config.vertex_shader = "instance.vert.spv";
116 m_render_config.fragment_shader = "triangle.frag.spv";
117 break;
118 }
119
121 sc.bindings["instanceTransforms"] = ShaderBinding(
123 vk::DescriptorType::eStorageBuffer);
124
126
127 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
128
130 "InstanceNetworkBuffer::setup_rendering: vert={} frag={}",
132}
133
134// =============================================================================
135// Private
136// =============================================================================
137
139 const std::shared_ptr<Nodes::Network::InstanceNetwork>& network,
140 float factor)
141{
142 constexpr size_t k_min = 64L * 1024;
143 if (!network || network->slot_count() == 0)
144 return k_min;
145
146 const auto& slots = network->slots();
147 if (!slots[0].node)
148 return k_min;
149
150 const size_t capacity = slots[0].node->get_vertex_buffer_size_bytes();
151 if (capacity == 0)
152 return k_min;
153
154 return static_cast<size_t>(static_cast<float>(capacity) * factor);
155}
156
157} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:37
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:286
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:270
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:279
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:291
void set_needs_depth_attachment(bool needs)
Mark this buffer as requiring depth testing when rendered.
Definition VKBuffer.hpp:565
void apply_render_config(const RenderConfig &config, const ShaderConfig &shader_config)
Configure the internal m_render_processor from a RenderConfig.
Definition VKBuffer.cpp:359
std::shared_ptr< RenderProcessor > m_render_processor
Definition VKBuffer.hpp:618
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:595
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:67
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
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.