]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/buffer_backend.cpp
Multiplex streaming buffer contents on Vulkan
[libs/gl.git] / source / backends / vulkan / buffer_backend.cpp
index 29dd15ef363fa26fe36794e3d1a877bc821cb996..5439548f886fd1d81ba0ac16181f12c4a213f28f 100644 (file)
@@ -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,30 @@ void VulkanBuffer::allocate()
 
 void VulkanBuffer::sub_data(size_t off, size_t sz, const void *d)
 {
-       device.get_synchronizer().access(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, &region);
-       });
+       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, &region);
+               });
 
        const char *src = static_cast<const char *>(d);
        copy(src, src+sz, static_cast<char *>(staging));
+       tq.finalize_transfer(staging);
+}
+
+unsigned VulkanBuffer::get_multiplicity() const
+{
+       BufferUsage usage = static_cast<const Buffer *>(this)->usage;
+       return (usage==STREAMING ? device.get_n_frames_in_flight() : 1);
 }
 
 bool VulkanBuffer::can_map() const