MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeTextureBuffer.cpp
Go to the documentation of this file.
2
6
8
9namespace MayaFlux::Buffers {
10
12 std::shared_ptr<Nodes::GpuSync::TextureNode> node,
13 std::string binding_name)
14 : VKBuffer(
15 calculate_quad_vertex_size(),
16 Usage::VERTEX,
17 Kakshya::DataModality::VERTEX_POSITIONS_3D)
18 , m_texture_node(std::move(node))
19 , m_binding_name(std::move(binding_name))
20{
21 if (!m_texture_node) {
22 error<std::invalid_argument>(
25 std::source_location::current(),
26 "Cannot create NodeTextureBuffer with null TextureNode");
27 }
28
30 "Created NodeTextureBuffer '{}' for {}x{} texture ({} bytes)",
32 m_texture_node->get_width(),
33 m_texture_node->get_height(),
35}
36
38{
39 auto self = std::dynamic_pointer_cast<NodeTextureBuffer>(shared_from_this());
40
42
44 m_gpu_texture = loom.create_2d(
45 m_texture_node->get_width(),
46 m_texture_node->get_height(),
48 nullptr,
49 1);
50
51 if (!m_gpu_texture) {
52 error<std::runtime_error>(
55 std::source_location::current(),
56 "Failed to create GPU texture for NodeTextureBuffer '{}'",
58 }
59
60 m_texture_processor = std::make_shared<NodeTextureProcessor>();
61 m_texture_processor->set_processing_token(token);
62
63 m_texture_processor->bind_texture_node(
67
68 auto chain = get_processing_chain();
69 if (!chain) {
70 chain = std::make_shared<BufferProcessingChain>();
72 }
73 chain->set_preferred_token(token);
74
76
78 "NodeTextureBuffer '{}' ready: staging={} bytes, GPU texture={}x{}",
81 m_texture_node->get_width(),
82 m_texture_node->get_height());
83}
84
86{
87 if (!m_render_processor) {
88 ShaderConfig shader_config { config.vertex_shader };
89 shader_config.bindings[config.default_texture_binding] = ShaderBinding(
90 0, 0, vk::DescriptorType::eCombinedImageSampler);
91
92 uint32_t binding_index = 1;
93 for (const auto& [name, _] : config.additional_textures) {
94 shader_config.bindings[name] = ShaderBinding(
95 0, binding_index++, vk::DescriptorType::eCombinedImageSampler);
96 }
97
98 m_render_processor = std::make_shared<RenderProcessor>(shader_config);
99 }
100
101 m_render_processor->set_fragment_shader(config.fragment_shader);
102 m_render_processor->set_target_window(config.target_window);
103 m_render_processor->set_primitive_topology(config.topology);
104
106
107 for (const auto& [name, texture] : config.additional_textures) {
108 m_render_processor->bind_texture(name, texture);
109 }
110
111 get_processing_chain()->add_final_processor(m_render_processor, shared_from_this());
112
114 "NodeTextureBuffer '{}' rendering configured: shader={}, topology={}",
116 static_cast<int>(config.topology));
117}
118
120 const std::shared_ptr<Nodes::GpuSync::TextureNode>& node)
121{
122 if (!node) {
123 return 0;
124 }
125
126 size_t size = static_cast<size_t>(node->get_width())
127 * static_cast<size_t>(node->get_height())
128 * 4
129 * sizeof(float);
130
131 if (size == 0) {
133 "TextureNode has zero dimensions. Using minimum buffer size.");
134 return 4096;
135 }
136
137 return size;
138}
139
141{
142 struct QuadVertex {
143 glm::vec3 position;
144 glm::vec2 texcoord;
145 };
146
147 const std::vector<QuadVertex> quad = {
148 { { -1.0F, -1.0F, 0.0F }, { 0.0F, 1.0F } },
149 { { 1.0F, -1.0F, 0.0F }, { 1.0F, 1.0F } },
150 { { -1.0F, 1.0F, 0.0F }, { 0.0F, 0.0F } },
151 { { 1.0F, 1.0F, 0.0F }, { 1.0F, 0.0F } }
152 };
153
154 m_vertex_bytes.resize(quad.size() * sizeof(QuadVertex));
155 std::memcpy(m_vertex_bytes.data(), quad.data(), m_vertex_bytes.size());
156
157 // Set vertex layout
158 Kakshya::VertexLayout vertex_layout {
159 .vertex_count = 4,
160 .stride_bytes = sizeof(QuadVertex),
161 .attributes = {
162 { .component_modality = Kakshya::DataModality::VERTEX_POSITIONS_3D,
163 .offset_in_vertex = offsetof(QuadVertex, position),
164 .name = "position" },
165 { .component_modality = Kakshya::DataModality::TEXTURE_COORDS_2D,
166 .offset_in_vertex = offsetof(QuadVertex, texcoord),
167 .name = "texcoord" } }
168 };
169
170 set_vertex_layout(vertex_layout);
171
173 "NodeTextureBuffer: generated fullscreen quad");
174}
175
177{
178 struct QuadVertex {
179 glm::vec3 position;
180 glm::vec2 texcoord;
181 };
182 return 4 * sizeof(QuadVertex);
183}
184
185} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
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:364
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Definition VKBuffer.cpp:277
void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Set the buffer's default processor.
Definition VKBuffer.cpp:261
vk::DeviceSize get_size_bytes() const
Definition VKBuffer.hpp:235
void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Replace the buffer's processing chain.
Definition VKBuffer.cpp:282
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.
MAYAFLUX_API TextureLoom & get_texture_manager()
Get the global texture manager instance.
@ RGBA32F
Four channel 32-bit float.
std::vector< std::pair< std::string, std::shared_ptr< Core::VKImage > > > additional_textures
Describes how a VKBuffer binds to a shader descriptor.
uint32_t vertex_count
Total number of vertices in this buffer.
Complete description of vertex data layout in a buffer.