X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fsynchronizer.cpp;h=93f48b847f9290cc456d06fe4d108bea1068bf2b;hp=3ec04026a09ae2e2617c3461e4a746544f0ab119;hb=HEAD;hpb=2c060874dcf5cee7ffa52e3d2caee505371fa1a8 diff --git a/source/backends/vulkan/synchronizer.cpp b/source/backends/vulkan/synchronizer.cpp index 3ec04026..28488fd0 100644 --- a/source/backends/vulkan/synchronizer.cpp +++ b/source/backends/vulkan/synchronizer.cpp @@ -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 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;