MayaFlux 0.4.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 146 of file VKBuffer.cpp.

147{
148 if (new_size == m_size_bytes)
149 return;
150
151 if (!is_initialized()) {
152 m_size_bytes = new_size;
154
156 "Cannot resize uninitialized VKBuffer");
157 return;
158 }
159
160 auto buffer_service = Registry::BackendRegistry::instance()
161 .get_service<Registry::Service::BufferService>();
162
163 if (!buffer_service) {
164 error<std::runtime_error>(
167 std::source_location::current(),
168 "Cannot resize buffer: BufferService not available");
169 }
170
171 std::vector<uint8_t> old_data;
172 if (preserve_data && is_host_visible() && m_resources.mapped_ptr) {
173 size_t copy_size = std::min(m_size_bytes, new_size);
174 old_data.resize(copy_size);
175 std::memcpy(old_data.data(), m_resources.mapped_ptr, copy_size);
176
178 "Preserved {} bytes of old buffer data", copy_size);
179 }
180
181 buffer_service->destroy_buffer(shared_from_this());
182
183 m_resources.buffer = vk::Buffer {};
184 m_resources.memory = vk::DeviceMemory {};
185 m_resources.mapped_ptr = nullptr;
186
187 m_size_bytes = new_size;
189
190 buffer_service->initialize_buffer(shared_from_this());
191
192 if (!is_initialized()) {
193 error<std::runtime_error>(
196 std::source_location::current(),
197 "Failed to recreate buffer after resize");
198 }
199
200 if (preserve_data && !old_data.empty() && is_host_visible() && m_resources.mapped_ptr) {
201 std::memcpy(m_resources.mapped_ptr, old_data.data(), old_data.size());
202 mark_dirty_range(0, old_data.size());
203
205 "Restored {} bytes to resized buffer", old_data.size());
206 }
207
208 // clear_pipeline_commands();
209
211 "VKBuffer resize complete: {} bytes", m_size_bytes);
212}
#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:300
VKBufferResources m_resources
Definition VKBuffer.hpp:621
void mark_dirty_range(size_t offset, size_t size)
Get device memory handle.
Definition VKBuffer.cpp:386
bool is_initialized() const
Check whether Vulkan handles are present (buffer registered)
Definition VKBuffer.hpp:282
bool is_host_visible() const
Whether this VKBuffer should be host-visible.
Definition VKBuffer.hpp:369
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: