]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/synchronizer.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / backends / vulkan / synchronizer.cpp
index 3ec04026a09ae2e2617c3461e4a746544f0ab119..28488fd0d28ad81188fe882b7e2c81ede29ebc59 100644 (file)
@@ -15,7 +15,7 @@ Synchronizer::Synchronizer(Device &d):
        device(d)
 { }
 
-void Synchronizer::write_buffer(VkBuffer buffer, size_t offset, size_t size)
+void Synchronizer::write_buffer(VkBuffer buffer, size_t offset, size_t size, bool mapped)
 {
        auto i = lower_bound_member(buffer_accesses, buffer, &BufferAccess::buffer);
        if(i==buffer_accesses.end() || i->buffer!=buffer)
@@ -33,6 +33,8 @@ void Synchronizer::write_buffer(VkBuffer buffer, size_t offset, size_t size)
                i->size = end-begin;
        }
 
+       if(mapped)
+               i->was_written = true;
        i->pending_write = true;
 }
 
@@ -119,10 +121,8 @@ void Synchronizer::reset()
                i.pending_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
 }
 
-void Synchronizer::barrier(VkCommandBuffer command_buffer)
+void Synchronizer::barrier(const VulkanCommandRecorder &vkCmd)
 {
-       const VulkanFunctions &vk = device.get_functions();
-
        if(buffer_accesses.empty() && image_accesses.empty())
                return;
 
@@ -131,7 +131,8 @@ void Synchronizer::barrier(VkCommandBuffer command_buffer)
 
        static constexpr VkPipelineStageFlags buffer_read_stages = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT|
                VK_PIPELINE_STAGE_VERTEX_SHADER_BIT|VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
-       static constexpr VkPipelineStageFlags buffer_write_stages = VK_PIPELINE_STAGE_TRANSFER_BIT;
+       static constexpr VkPipelineStageFlags buffer_write_stages = VK_PIPELINE_STAGE_TRANSFER_BIT|
+               VK_PIPELINE_STAGE_HOST_BIT;
 
        vector<VkBufferMemoryBarrier> buffer_barriers;
        buffer_barriers.reserve(buffer_accesses.size());
@@ -198,7 +199,7 @@ void Synchronizer::barrier(VkCommandBuffer command_buffer)
        if(!dst_stage)
                dst_stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
 
-       vk.CmdPipelineBarrier(command_buffer, src_stage, dst_stage, 0, 0, 0,
+       vkCmd.PipelineBarrier(src_stage, dst_stage, 0, 0, 0,
                buffer_barriers.size(), buffer_barriers.data(), image_barriers.size(), image_barriers.data());
 
        for(auto i=buffer_accesses.begin(); i!=buffer_accesses.end(); )
@@ -212,29 +213,28 @@ void Synchronizer::barrier(VkCommandBuffer command_buffer)
                }
        }
 
-       bool sparse_levels = false;
        for(auto i=image_accesses.begin(); i!=image_accesses.end(); )
        {
-               if(i->level==-2)
-               {
-                       sparse_levels = true;
-                       ++i;
-               }
-               else if(i->pending_layout==VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
+               if(i->level!=-1)
                {
-                       VkImage image = i->image;
-                       i = image_accesses.erase(i);
-                       if(i->image!=image)
+                       auto j = i;
+                       if(j->level==-2)
+                               ++j;
+
+                       bool remove_image = true;
+                       for(; (j!=image_accesses.end() && j->image==i->image); ++j)
+                               remove_image &= (j->pending_layout==VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+
+                       if(remove_image)
+                               i = image_accesses.erase(i, j);
+                       else
                        {
-                               if(sparse_levels)
-                               {
-                                       auto j = prev(i);
-                                       if(j->level==-2)
-                                               i = image_accesses.erase(j);
-                               }
-                               sparse_levels = false;
+                               for(; i!=j; ++i)
+                                       i->current_layout = i->pending_layout;
                        }
                }
+               else if(i->pending_layout==VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
+                       i = image_accesses.erase(i);
                else
                {
                        i->current_layout = i->pending_layout;