17 : m_size_bytes(size_bytes)
19 , m_modality(modality)
26 "VKBuffer created (uninitialized): {} bytes, modality: {}",
41 "Cannot clear uninitialized VKBuffer");
52 "clear() on device-local buffer requires ClearBufferProcessor");
60 "Cannot set_data on uninitialized VKBuffer. Register with BufferManager first.");
75 auto [ptr, bytes, format_hint] = accessor.
gpu_buffer();
78 error<std::runtime_error>(
81 std::source_location::current(),
82 "Data size {} exceeds buffer capacity {}",
92 "set_data() on device-local buffer requires BufferUploadProcessor in chain");
100 "Cannot get_data from uninitialized VKBuffer");
109 return { raw_bytes };
113 "get_data() on device-local buffer requires BufferDownloadProcessor");
127 "Cannot resize uninitialized VKBuffer");
134 if (!buffer_service) {
135 error<std::runtime_error>(
138 std::source_location::current(),
139 "Cannot resize buffer: BufferService not available");
142 std::vector<uint8_t> old_data;
145 old_data.resize(copy_size);
149 "Preserved {} bytes of old buffer data", copy_size);
152 buffer_service->destroy_buffer(shared_from_this());
161 buffer_service->initialize_buffer(shared_from_this());
164 error<std::runtime_error>(
167 std::source_location::current(),
168 "Failed to recreate buffer after resize");
176 "Restored {} bytes to resized buffer", old_data.size());
187 using namespace Kakshya;
190 case DataModality::VERTEX_POSITIONS_3D:
191 case DataModality::VERTEX_NORMALS_3D:
192 case DataModality::VERTEX_TANGENTS_3D:
193 case DataModality::VERTEX_COLORS_RGB:
194 return vk::Format::eR32G32B32Sfloat;
196 case DataModality::TEXTURE_COORDS_2D:
197 return vk::Format::eR32G32Sfloat;
199 case DataModality::VERTEX_COLORS_RGBA:
200 return vk::Format::eR32G32B32A32Sfloat;
202 case DataModality::AUDIO_1D:
203 case DataModality::AUDIO_MULTICHANNEL:
204 return vk::Format::eR64Sfloat;
206 case DataModality::IMAGE_2D:
207 case DataModality::IMAGE_COLOR:
208 case DataModality::TEXTURE_2D:
209 return vk::Format::eR8G8B8A8Unorm;
211 case DataModality::SPECTRAL_2D:
212 return vk::Format::eR32G32Sfloat;
215 return vk::Format::eUndefined;
227 vk::BufferUsageFlags flags = vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eTransferDst;
234 flags |= vk::BufferUsageFlagBits::eStorageBuffer;
237 flags |= vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eStorageBuffer;
240 flags |= vk::BufferUsageFlagBits::eIndexBuffer;
243 flags |= vk::BufferUsageFlagBits::eUniformBuffer;
253 return vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
255 return vk::MemoryPropertyFlagBits::eDeviceLocal;
271 processor->on_attach(shared_from_this());
297 using namespace Kakshya;
302 case DataModality::VERTEX_POSITIONS_3D: {
303 uint64_t count = byte_count /
sizeof(glm::vec3);
304 m_dimensions.push_back(DataDimension::vertex_positions(count));
308 case DataModality::VERTEX_NORMALS_3D: {
309 uint64_t count = byte_count /
sizeof(glm::vec3);
310 m_dimensions.push_back(DataDimension::vertex_normals(count));
314 case DataModality::TEXTURE_COORDS_2D: {
315 uint64_t count = byte_count /
sizeof(glm::vec2);
316 m_dimensions.push_back(DataDimension::texture_coords(count));
320 case DataModality::VERTEX_COLORS_RGB: {
321 uint64_t count = byte_count /
sizeof(glm::vec3);
322 m_dimensions.push_back(DataDimension::vertex_colors(count,
false));
326 case DataModality::VERTEX_COLORS_RGBA: {
327 uint64_t count = byte_count /
sizeof(glm::vec4);
328 m_dimensions.push_back(DataDimension::vertex_colors(count,
true));
332 case DataModality::AUDIO_1D: {
333 uint64_t samples = byte_count /
sizeof(double);
339 m_dimensions.emplace_back(
"data", byte_count, 1, DataDimension::Role::CUSTOM);
370 auto computed_layout = layout;
380 buffer->set_vertex_layout(layout.value());
387 if (buffer->is_host_visible()) {
389 buffer->set_data({ std::vector<uint8_t>(src_ptr, src_ptr +
m_size_bytes) });
392 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
397 if (buffer->is_host_visible()) {
400 std::dynamic_pointer_cast<VKBuffer>(shared_from_this()),
404 "Cloning device-local VKBuffer to another device-local VKBuffer requires external data transfer");
413 auto usage =
static_cast<Usage>(dest_desc);
414 return std::dynamic_pointer_cast<Buffers::Buffer>(
clone_to(usage));
#define MF_INFO(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
Advanced pipeline manager for multi-stage buffer transformations with backend optimization.
Registry::Service::ComputeService * m_compute_service
void initialize_compute_service()
void initialize_buffer_service()
Registry::Service::BufferService * m_buffer_service
void set_processing_chain(std::shared_ptr< Buffers::BufferProcessingChain > chain, bool force=false) override
Replace the buffer's processing chain.
std::vector< std::pair< size_t, size_t > > m_dirty_ranges
void infer_dimensions_from_data(size_t byte_count)
Infer Kakshya::DataDimension entries from a given byte count.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set vertex layout for this buffer.
std::vector< std::pair< size_t, size_t > > get_and_clear_invalid_ranges()
Retrieve and clear all invalid ranges.
void resize(size_t new_size, bool preserve_data=false)
Resize buffer and recreate GPU resources if needed.
void process_default() override
Run the buffer's default processor (if set and enabled)
std::vector< Kakshya::DataVariant > get_data()
Read buffer contents as Kakshya DataVariant.
std::shared_ptr< Buffers::BufferProcessor > get_default_processor() const override
Get the currently attached default processor.
@ UNIFORM
Uniform buffer (host-visible when requested)
@ COMPUTE
Storage buffer for compute shaders.
@ STAGING
Host-visible staging buffer (CPU-writable)
@ DEVICE
Device-local GPU-only buffer.
void set_default_processor(std::shared_ptr< Buffers::BufferProcessor > processor) override
Set the buffer's default processor.
std::optional< Kakshya::VertexLayout > m_vertex_layout
std::vector< Kakshya::DataDimension > m_dimensions
std::shared_ptr< Buffers::BufferProcessingChain > m_processing_chain
std::vector< std::pair< size_t, size_t > > get_and_clear_dirty_ranges()
Retrieve and clear all dirty ranges.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
std::vector< std::pair< size_t, size_t > > m_invalid_ranges
void clear() override
Clear buffer contents.
std::optional< Kakshya::VertexLayout > get_vertex_layout() const
Get vertex layout if set.
VKBufferResources m_resources
std::shared_ptr< Buffer > clone_to(uint8_t dest_desc) override
Creates a clone of this buffer for a specific channel or usage enum.
std::shared_ptr< Buffers::BufferProcessor > m_default_processor
void mark_dirty_range(size_t offset, size_t size)
Get device memory handle.
bool is_initialized() const
Check whether Vulkan handles are present (buffer registered)
vk::BufferUsageFlags get_usage_flags() const
Get appropriate VkBufferUsageFlags for creation based on Usage.
vk::MemoryPropertyFlags get_memory_properties() const
Get appropriate VkMemoryPropertyFlags for allocation based on Usage.
Kakshya::DataModality m_modality
void set_modality(Kakshya::DataModality modality)
Update the semantic modality and re-infer dimensions.
void set_data(const std::vector< Kakshya::DataVariant > &data)
Write data into the buffer.
vk::Format get_format() const
Convert modality to a recommended VkFormat.
bool is_host_visible() const
Whether this VKBuffer should be host-visible.
~VKBuffer() override
Virtual destructor.
void mark_invalid_range(size_t offset, size_t size)
Mark a range as invalid (needs download)
auto gpu_buffer() const
Get raw buffer info for GPU upload.
Type-erased accessor for NDData with semantic view construction.
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
void upload_device_local(const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging_buffer, const Kakshya::DataVariant &data)
Upload data to a device-local buffer using a staging buffer.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
void download_device_local(const std::shared_ptr< VKBuffer > &source, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging_buffer)
Download data from a device-local buffer using a staging buffer.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Buffers
Buffers, Managers, processors and processing chains.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
DataModality
Data modality types for cross-modal analysis.
std::string_view modality_to_string(DataModality modality)
Convert DataModality enum to string representation.
void compute_stride()
Helper: compute stride from attributes if not explicitly set.
Complete description of vertex data layout in a buffer.
Backend buffer management service interface.
Backend compute shader and pipeline service interface.