+
+void Buffer::AsyncTransfer::allocate()
+{
+ if(buffer->can_map())
+ dest_addr = static_cast<char *>(buffer->map())+offset;
+ else
+ {
+ Buffer &buf = *buffer;
+ size_t off = offset;
+ size_t sz = size;
+
+ dest_addr = buf.device.get_transfer_queue().prepare_transfer(buffer, false, size,
+ [&buf, off, sz](){
+ buf.device.get_synchronizer().write_buffer(buf.handle, off, sz);
+ },
+ [&buf, off, sz](VkCommandBuffer cmd_buf, VkBuffer staging_buf, size_t src_off){
+ const VulkanFunctions &vk = buf.device.get_functions();
+
+ VkBufferCopy region = { };
+ region.srcOffset = src_off;
+ region.dstOffset = off;
+ region.size = sz;
+ vk.CmdCopyBuffer(cmd_buf, staging_buf, buf.handle, 1, ®ion);
+ });
+ }
+}
+
+void Buffer::AsyncTransfer::finalize()
+{
+ if(buffer->can_map())
+ {
+ buffer->unmap();
+ buffer->device.get_synchronizer().write_buffer(buffer->handle, offset, size, true);
+ }
+ else
+ buffer->device.get_transfer_queue().finalize_transfer(dest_addr);
+}
+