MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeTextureBuffer.cpp
Go to the documentation of this file.
2
7
9
10namespace MayaFlux::Buffers {
11
13 std::shared_ptr<Nodes::GpuSync::TextureNode> node,
14 std::string binding_name)
15 : VKBuffer(
16 calculate_quad_vertex_size(),
17 Usage::VERTEX,
18 Kakshya::DataModality::VERTEX_POSITIONS_3D)
19 , m_texture_node(std::move(node))
20 , m_binding_name(std::move(binding_name))
21{
22 RenderConfig default_config;
23 default_config.vertex_shader = "texture.vert.spv";
24 default_config.fragment_shader = "texture.frag.spv";
25 default_config.default_texture_binding = "texSampler";
27 set_default_render_config(default_config);
28
29 if (!m_texture_node) {
30 error<std::invalid_argument>(
33 std::source_location::current(),
34 "Cannot create NodeTextureBuffer with null TextureNode");
35 }
36
38 "Created NodeTextureBuffer '{}' for {}x{} texture ({} bytes)",
40 m_texture_node->get_width(),
41 m_texture_node->get_height(),
43}
44
46{
47 auto self = std::dynamic_pointer_cast<NodeTextureBuffer>(shared_from_this());
48
50
52 m_gpu_texture = loom.create_2d(
53 m_texture_node->get_width(),
54 m_texture_node->get_height(),
56 nullptr,
57 1);
58
59 if (!m_gpu_texture) {
60 error<std::runtime_error>(
63 std::source_location::current(),
64 "Failed to create GPU texture for NodeTextureBuffer '{}'",
66 }
67
68 m_texture_processor = std::make_shared<NodeTextureProcessor>();
69 m_texture_processor->set_processing_token(token);
70
71 m_texture_processor->bind_texture_node(
75
76 auto chain = get_processing_chain();
77 if (!chain) {
78 chain = std::make_shared<BufferProcessingChain>();
80 }
81 chain->set_preferred_token(token);
82
84
86 "NodeTextureBuffer '{}' ready: staging={} bytes, GPU texture={}x{}",
89 m_texture_node->get_width(),
90 m_texture_node->get_height());
91}
92
94{
95 if (!user_config.vertex_shader.empty()) {
97 }
98 if (!user_config.fragment_shader.empty()) {
100 }
101 if (!user_config.default_texture_binding.empty()) {
103 }
106 "NodeTextureBuffer currently only supports TRIANGLE_STRIP topology. Ignoring provided topology.");
107 } else {
108 if (user_config.topology != m_render_config.topology) {
109 m_render_config.topology = user_config.topology;
110 }
111 }
113
114 if (!user_config.additional_textures.empty()) {
115 for (const auto& [name, texture] : user_config.additional_textures) {
116 m_render_config.additional_textures.emplace_back(name, texture);
117 }
118 }
119
120 if (!m_render_processor) {
122 shader_config.bindings[m_render_config.default_texture_binding] = ShaderBinding(
123 0, 0, vk::DescriptorType::eCombinedImageSampler);
124
125 uint32_t binding_index = 1;
126 for (const auto& [name, _] : m_render_config.additional_textures) {
127 shader_config.bindings[name] = ShaderBinding(
128 0, binding_index++, vk::DescriptorType::eCombinedImageSampler);
129 }
130
131 m_render_processor = std::make_shared<RenderProcessor>(shader_config);
132 }
133
135 m_render_processor->set_target_window(m_render_config.target_window, std::dynamic_pointer_cast<VKBuffer>(shared_from_this()));
136 m_render_processor->set_primitive_topology(m_render_config.topology);
137
139
140 for (const auto& [name, texture] : m_render_config.additional_textures) {
141 m_render_processor->bind_texture(name, texture);
142 }
143
144 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
145
147 "NodeTextureBuffer '{}' rendering configured: shader={}, topology={}",
149 static_cast<int>(m_render_config.topology));
150}
151
153 const std::shared_ptr<Nodes::GpuSync::TextureNode>& node)
154{
155 if (!node) {
156 return 0;
157 }
158
159 size_t size = static_cast<size_t>(node->get_width())
160 * static_cast<size_t>(node->get_height())
161 * 4
162 * sizeof(float);
163
164 if (size == 0) {
166 "TextureNode has zero dimensions. Using minimum buffer size.");
167 return 4096;
168 }
169
170 return size;
171}
172
174{
175 auto geo = Kinesis::generate_quad();
176 m_vertex_bytes.resize(geo.vertices.size() * sizeof(Nodes::TextureQuadVertex));
177 std::memcpy(m_vertex_bytes.data(), geo.vertices.data(), m_vertex_bytes.size());
178 set_vertex_layout(geo.layout);
179
181 "NodeTextureBuffer: generated fullscreen quad");
182}
183
188
189} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
NodeTextureBuffer(std::shared_ptr< Nodes::GpuSync::TextureNode > node, std::string binding_name="texture")
Create texture staging buffer from generative node.
std::shared_ptr< Nodes::GpuSync::TextureNode > m_texture_node
std::shared_ptr< Core::VKImage > get_gpu_texture() const
Get the GPU-resident texture (VKImage)
std::shared_ptr< Core::VKImage > m_gpu_texture
std::shared_ptr< RenderProcessor > m_render_processor
std::shared_ptr< NodeTextureProcessor > m_texture_processor
void setup_processors(ProcessingToken token) override
Initialize the buffer, create GPU texture, and setup processors.
static size_t calculate_buffer_size(const std::shared_ptr< Nodes::GpuSync::TextureNode > &node)
Calculate staging buffer size from node dimensions.
void setup_rendering(const RenderConfig &config)
Setup rendering with RenderProcessor.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set vertex layout for this buffer.
Definition VKBuffer.cpp:361
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:274
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:258
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:237
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:279
void set_default_render_config(const RenderConfig &config)
Called by derived classes to set their context-specific defaults.
Definition VKBuffer.hpp:502
Vulkan-backed buffer wrapper used in processing chains.
Definition VKBuffer.hpp:52
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
QuadGeometry generate_quad(glm::vec2 position, glm::vec2 scale, float rotation)
Generate a textured quad centred on the origin.
MAYAFLUX_API TextureLoom & get_texture_manager()
Get the global texture manager instance.
@ RGBA32F
Four channel 32-bit float.
Describes how a VKBuffer binds to a shader descriptor.
Vertex layout for textured quad geometry (position + UV).
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.