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)
i->size = end-begin;
}
+ if(mapped)
+ i->was_written = true;
i->pending_write = true;
}
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;
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());
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(); )
}
}
- 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;