@@ -216,6 +216,58 @@ bool BufferResourceManager::UpdateStorageBuffer(
216216 return true ;
217217}
218218
219+ bool BufferResourceManager::UpdateStorageBufferRange (
220+ const std::string& name,
221+ const std::vector<std::uint8_t >& bytes,
222+ std::size_t offset_bytes)
223+ {
224+ if (bytes.empty ())
225+ {
226+ return false ;
227+ }
228+ auto it = storage_buffer_indices_.find (name);
229+ if (it == storage_buffer_indices_.end ())
230+ {
231+ return false ;
232+ }
233+ auto & resource = storage_buffers_[it->second ];
234+ if (!resource.buffer || resource.size == 0 )
235+ {
236+ return false ;
237+ }
238+ if (offset_bytes > static_cast <std::size_t >(resource.size ) ||
239+ bytes.size () >
240+ static_cast <std::size_t >(resource.size ) - offset_bytes)
241+ {
242+ (*logger_)->warn (
243+ " Storage buffer '{}' range update [{}..{}) exceeds resource size {}." ,
244+ name,
245+ offset_bytes,
246+ offset_bytes + bytes.size (),
247+ static_cast <std::size_t >(resource.size ));
248+ return false ;
249+ }
250+
251+ vk::UniqueDeviceMemory staging_memory;
252+ auto staging_buffer = memory_manager_->CreateBuffer (
253+ bytes.size (),
254+ vk::BufferUsageFlagBits::eTransferSrc,
255+ vk::MemoryPropertyFlagBits::eHostVisible |
256+ vk::MemoryPropertyFlagBits::eHostCoherent,
257+ staging_memory);
258+ void * mapped = device_.mapMemory (
259+ *staging_memory, 0 , bytes.size ());
260+ std::memcpy (mapped, bytes.data (), bytes.size ());
261+ device_.unmapMemory (*staging_memory);
262+ command_queue_->CopyBuffer (
263+ *staging_buffer,
264+ *resource.buffer ,
265+ static_cast <vk::DeviceSize>(bytes.size ()),
266+ 0 ,
267+ static_cast <vk::DeviceSize>(offset_bytes));
268+ return true ;
269+ }
270+
219271void BufferResourceManager::BuildUniformBuffers (
220272 std::size_t count,
221273 vk::DeviceSize size_bytes)
0 commit comments