void VulkanBuffer::sub_data(size_t off, size_t sz, const void *d)
{
- void *staging = device.get_transfer_queue().prepare_transfer(sz, [this, off, sz](VkCommandBuffer cmd_buf, VkBuffer staging_buf, size_t src_off){
- const VulkanFunctions &vk = device.get_functions();
-
- VkBufferCopy region = { };
- region.srcOffset = src_off;
- region.dstOffset = off;
- region.size = sz;
- vk.CmdCopyBuffer(cmd_buf, staging_buf, handle, 1, ®ion);
-
- VkBufferMemoryBarrier barrier = { };
- barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
- barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
- barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.buffer = handle_cast<::VkBuffer>(handle);
- barrier.offset = off;
- barrier.size = sz;
-
- vk.CmdPipelineBarrier(cmd_buf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
- 0, 0, 0, 1, &barrier, 0, 0);
- });
+ void *staging = device.get_transfer_queue().prepare_transfer(this, false, sz,
+ [this, off, sz](){
+ device.get_synchronizer().write_buffer(handle, off, sz);
+ },
+ [this, off, sz](VkCommandBuffer cmd_buf, VkBuffer staging_buf, size_t src_off){
+ const VulkanFunctions &vk = device.get_functions();
+
+ VkBufferCopy region = { };
+ region.srcOffset = src_off;
+ region.dstOffset = off;
+ region.size = sz;
+ vk.CmdCopyBuffer(cmd_buf, staging_buf, handle, 1, ®ion);
+ });
const char *src = static_cast<const char *>(d);
copy(src, src+sz, static_cast<char *>(staging));