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(); )