MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ resize()

void MayaFlux::Buffers::VKBuffer::resize ( size_t  new_size,
bool  preserve_data = false 
)

Resize buffer and recreate GPU resources if needed.

Parameters
new_sizeNew size in bytes
preserve_dataIf true, copy existing data to new buffer

If buffer is already initialized (has GPU resources), this will:

  1. Create new GPU buffer with new size
  2. Optionally copy old data
  3. Destroy old GPU buffer
  4. Update buffer resources

If buffer is not initialized, just updates logical size.

Definition at line 110 of file VKBuffer.cpp.

111{
112 if (new_size == m_size_bytes)
113 return;
114
115 if (!is_initialized()) {
116 m_size_bytes = new_size;
118
120 "Cannot resize uninitialized VKBuffer");
121 return;
122 }
123
124 auto buffer_service = Registry::BackendRegistry::instance()
125 .get_service<Registry::Service::BufferService>();
126
127 if (!buffer_service) {
128 error<std::runtime_error>(
131 std::source_location::current(),
132 "Cannot resize buffer: BufferService not available");
133 }
134
135 std::vector<uint8_t> old_data;
136 if (preserve_data && is_host_visible() && m_resources.mapped_ptr) {
137 size_t copy_size = std::min(m_size_bytes, new_size);
138 old_data.resize(copy_size);
139 std::memcpy(old_data.data(), m_resources.mapped_ptr, copy_size);
140
142 "Preserved {} bytes of old buffer data", copy_size);
143 }
144
145 buffer_service->destroy_buffer(shared_from_this());
146
147 m_resources.buffer = vk::Buffer {};
148 m_resources.memory = vk::DeviceMemory {};
149 m_resources.mapped_ptr = nullptr;
150
151 m_size_bytes = new_size;
153
154 buffer_service->initialize_buffer(shared_from_this());
155
156 if (!is_initialized()) {
157 error<std::runtime_error>(
160 std::source_location::current(),
161 "Failed to recreate buffer after resize");
162 }
163
164 if (preserve_data && !old_data.empty() && is_host_visible() && m_resources.mapped_ptr) {
165 std::memcpy(m_resources.mapped_ptr, old_data.data(), old_data.size());
166 mark_dirty_range(0, old_data.size());
167
169 "Restored {} bytes to resized buffer", old_data.size());
170 }
171
172 // clear_pipeline_commands();
173
175 "VKBuffer resize complete: {} bytes", m_size_bytes);
176}
#define MF_INFO(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
void infer_dimensions_from_data(size_t byte_count)
Infer Kakshya::DataDimension entries from a given byte count.
Definition VKBuffer.cpp:288
VKBufferResources m_resources
Definition VKBuffer.hpp:512
void mark_dirty_range(size_t offset, size_t size)
Get device memory handle.
Definition VKBuffer.cpp:337
bool is_initialized() const
Check whether Vulkan handles are present (buffer registered)
Definition VKBuffer.hpp:246
bool is_host_visible() const
Whether this VKBuffer should be host-visible.
Definition VKBuffer.hpp:294
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Buffers
Buffers, Managers, processors and processing chains.

References MayaFlux::Buffers::VKBufferResources::buffer, MayaFlux::Journal::BufferManagement, MayaFlux::Journal::Buffers, MayaFlux::Registry::BackendRegistry::get_service(), infer_dimensions_from_data(), MayaFlux::Registry::BackendRegistry::instance(), is_host_visible(), is_initialized(), m_resources, m_size_bytes, MayaFlux::Buffers::VKBufferResources::mapped_ptr, mark_dirty_range(), MayaFlux::Buffers::VKBufferResources::memory, MF_DEBUG, MF_INFO, and MF_RT_ERROR.

+ Here is the call graph for this function: