MayaFlux 0.2.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 113 of file VKBuffer.cpp.

114{
115 if (new_size == m_size_bytes)
116 return;
117
118 if (!is_initialized()) {
119 m_size_bytes = new_size;
121
123 "Cannot resize uninitialized VKBuffer");
124 return;
125 }
126
127 auto buffer_service = Registry::BackendRegistry::instance()
128 .get_service<Registry::Service::BufferService>();
129
130 if (!buffer_service) {
131 error<std::runtime_error>(
134 std::source_location::current(),
135 "Cannot resize buffer: BufferService not available");
136 }
137
138 std::vector<uint8_t> old_data;
139 if (preserve_data && is_host_visible() && m_resources.mapped_ptr) {
140 size_t copy_size = std::min(m_size_bytes, new_size);
141 old_data.resize(copy_size);
142 std::memcpy(old_data.data(), m_resources.mapped_ptr, copy_size);
143
145 "Preserved {} bytes of old buffer data", copy_size);
146 }
147
148 buffer_service->destroy_buffer(shared_from_this());
149
150 m_resources.buffer = vk::Buffer {};
151 m_resources.memory = vk::DeviceMemory {};
152 m_resources.mapped_ptr = nullptr;
153
154 m_size_bytes = new_size;
156
157 buffer_service->initialize_buffer(shared_from_this());
158
159 if (!is_initialized()) {
160 error<std::runtime_error>(
163 std::source_location::current(),
164 "Failed to recreate buffer after resize");
165 }
166
167 if (preserve_data && !old_data.empty() && is_host_visible() && m_resources.mapped_ptr) {
168 std::memcpy(m_resources.mapped_ptr, old_data.data(), old_data.size());
169 mark_dirty_range(0, old_data.size());
170
172 "Restored {} bytes to resized buffer", old_data.size());
173 }
174
175 // clear_pipeline_commands();
176
178 "VKBuffer resize complete: {} bytes", m_size_bytes);
179}
#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:291
VKBufferResources m_resources
Definition VKBuffer.hpp:447
void mark_dirty_range(size_t offset, size_t size)
Get device memory handle.
Definition VKBuffer.cpp:340
bool is_initialized() const
Check whether Vulkan handles are present (buffer registered)
Definition VKBuffer.hpp:244
bool is_host_visible() const
Whether this VKBuffer should be host-visible.
Definition VKBuffer.hpp:292
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.

Referenced by MayaFlux::Buffers::TextureBuffer::TextureBuffer().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: