X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fbuffer_backend.cpp;h=aaf415703db8158e5cba7cacd4b6d93ee294f769;hp=9290b42aefe2fff301735eaabf0684f4f7b2f327;hb=c356a20547afae97b412da36e0b0a7d51e879401;hpb=8ab7589d65c4f8ca799f2a6886d128f4c36ff046 diff --git a/source/backends/vulkan/buffer_backend.cpp b/source/backends/vulkan/buffer_backend.cpp index 9290b42a..aaf41570 100644 --- a/source/backends/vulkan/buffer_backend.cpp +++ b/source/backends/vulkan/buffer_backend.cpp @@ -37,7 +37,7 @@ void VulkanBuffer::allocate() VkBufferCreateInfo buffer_info = { }; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - buffer_info.size = self.size; + buffer_info.size = self.get_total_size(); buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT|VK_BUFFER_USAGE_TRANSFER_DST_BIT|VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT| VK_BUFFER_USAGE_INDEX_BUFFER_BIT|VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; @@ -52,20 +52,15 @@ void VulkanBuffer::allocate() void VulkanBuffer::sub_data(size_t off, size_t sz, const void *d) { - device.get_synchronizer().write_buffer(handle, off, sz); - - 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); - }); - + Buffer::AsyncTransfer transfer(*static_cast(this), off, sz); const char *src = static_cast(d); - copy(src, src+sz, static_cast(staging)); + copy(src, src+sz, static_cast(transfer.get_address())); +} + +unsigned VulkanBuffer::get_multiplicity() const +{ + BufferUsage usage = static_cast(this)->usage; + return (usage==STREAMING ? device.get_n_frames_in_flight() : 1); } bool VulkanBuffer::can_map() const @@ -112,5 +107,43 @@ 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 = buffer.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); +} + } // namespace GL } // namespace Msp