MayaFlux 1.0.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 142 of file VKBuffer.cpp.

143{
144 if (new_size == m_size_bytes)
145 return;
146
147 if (!is_initialized()) {
148 m_size_bytes = new_size;
150
152 "Cannot resize uninitialized VKBuffer");
153 return;
154 }
155
156 auto buffer_service = Registry::BackendRegistry::instance()
157 .get_service<Registry::Service::BufferService>();
158
159 if (!buffer_service) {
160 error<std::runtime_error>(
163 std::source_location::current(),
164 "Cannot resize buffer: BufferService not available");
165 }
166
167 std::vector<uint8_t> old_data;
168 if (preserve_data && is_host_visible() && m_resources.mapped_ptr) {
169 size_t copy_size = std::min(m_size_bytes, new_size);
170 old_data.resize(copy_size);
171 std::memcpy(old_data.data(), m_resources.mapped_ptr, copy_size);
172
174 "Preserved {} bytes of old buffer data", copy_size);
175 }
176
177 auto display_service = Registry::BackendRegistry::instance()
178 .get_service<Registry::Service::DisplayService>();
179
180 if (!display_service) {
181 error<std::runtime_error>(
184 std::source_location::current(),
185 "Cannot resize buffer: BufferService not available");
186 }
187
188 display_service->wait_idle();
189 buffer_service->destroy_buffer(shared_from_this());
190
191 m_resources.buffer = vk::Buffer {};
192 m_resources.memory = vk::DeviceMemory {};
193 m_resources.mapped_ptr = nullptr;
194
195 m_size_bytes = new_size;
197
198 buffer_service->initialize_buffer(shared_from_this());
199
200 if (!is_initialized()) {
201 error<std::runtime_error>(
204 std::source_location::current(),
205 "Failed to recreate buffer after resize");
206 }
207
208 if (preserve_data && !old_data.empty() && is_host_visible() && m_resources.mapped_ptr) {
209 std::memcpy(m_resources.mapped_ptr, old_data.data(), old_data.size());
210 mark_dirty_range(0, old_data.size());
211
213 "Restored {} bytes to resized buffer", old_data.size());
214 }
215
216 // clear_pipeline_commands();
217
219 "VKBuffer resize complete: {} bytes", m_size_bytes);
220}
#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:285
VKBufferResources m_resources
Definition VKBuffer.hpp:657
void mark_dirty_range(size_t offset, size_t size)
Get device memory handle.
Definition VKBuffer.cpp:429
bool is_initialized() const
Check whether Vulkan handles are present (buffer registered)
Definition VKBuffer.hpp:283
bool is_host_visible() const
Whether this VKBuffer should be host-visible.
Definition VKBuffer.hpp:373
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: