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