X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fbuffer_backend.cpp;h=bde76beaf8119b5985203b593117b0b799a2311b;hb=2a70fecfbbe8708be2bdaa75d222dd5a889a8ed3;hp=5439548f886fd1d81ba0ac16181f12c4a213f28f;hpb=6d2e2a0bb28496a8c25b441009bdd2a1a1e72d81;p=libs%2Fgl.git diff --git a/source/backends/vulkan/buffer_backend.cpp b/source/backends/vulkan/buffer_backend.cpp index 5439548f..bde76bea 100644 --- a/source/backends/vulkan/buffer_backend.cpp +++ b/source/backends/vulkan/buffer_backend.cpp @@ -52,24 +52,9 @@ void VulkanBuffer::allocate() void VulkanBuffer::sub_data(size_t off, size_t sz, const void *d) { - TransferQueue &tq = device.get_transfer_queue(); - void *staging = tq.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); - }); - + Buffer::AsyncTransfer transfer(*static_cast(this), off, sz); const char *src = static_cast(d); - copy(src, src+sz, static_cast(staging)); - tq.finalize_transfer(staging); + copy(src, src+sz, static_cast(transfer.get_address())); } unsigned VulkanBuffer::get_multiplicity() const @@ -85,14 +70,13 @@ bool VulkanBuffer::can_map() const void *VulkanBuffer::map() { - size_t size = static_cast(this)->size; - mapped_address = device.get_allocator().map(memory_id, 0, size); + mapped_address = device.get_allocator().map(memory_id); return mapped_address; } bool VulkanBuffer::unmap() { - device.get_allocator().unmap(mapped_address); + device.get_allocator().unmap(memory_id); mapped_address = 0; return true; } @@ -122,5 +106,41 @@ void VulkanBuffer::set_vulkan_object_name() const #endif } + +void Buffer::AsyncTransfer::allocate() +{ + if(buffer->can_map()) + dest_addr = static_cast(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](const VulkanCommandRecorder &vkCmd, VkBuffer staging_buf, size_t src_off){ + VkBufferCopy region = { }; + region.srcOffset = src_off; + region.dstOffset = off; + region.size = sz; + vkCmd.CopyBuffer(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); +} + } // namespace GL } // namespace Msp