Skip to content

Commit

Permalink
More synchronization fixes (#68)
Browse files Browse the repository at this point in the history
- Fix write-after-write for animation-transforms in basic rasterization-path
- Fix a read-after-write in gpu-cull
- Fix write-after-write  in mesh_compute module
  • Loading branch information
crocdialer authored Sep 14, 2024
1 parent 7f5b388 commit d1b69cf
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 6 deletions.
2 changes: 0 additions & 2 deletions src/Buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ void barrier(VkCommandBuffer command_buffer, const VkBuffer *buffers, uint32_t n
{
if(buffers && num_buffers)
{

std::vector<VkBufferMemoryBarrier2> barriers;

for(uint32_t i = 0; i < num_buffers; ++i)
Expand All @@ -29,7 +28,6 @@ void barrier(VkCommandBuffer command_buffer, const VkBuffer *buffers, uint32_t n
barriers.push_back(barrier);
}
}

VkDependencyInfo dependency_info = {};
dependency_info.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
dependency_info.bufferMemoryBarrierCount = barriers.size();
Expand Down
6 changes: 6 additions & 0 deletions src/PBRDeferred.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,12 @@ void PBRDeferred::update_animation_transforms(frame_context_t &frame_context)
}

frame_context.cmd_pre_render.begin(0);

// barriers
VkBuffer buffers[] = {frame_context.bone_buffer->handle(), frame_context.morph_param_buffer->handle()};
vierkant::barrier(frame_context.cmd_pre_render.handle(), buffers, 2,VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT);
vierkant::staging_copy_context_t staging_context = {};
staging_context.staging_buffer = frame_context.staging_anim;
staging_context.command_buffer = frame_context.cmd_pre_render.handle();
Expand Down
10 changes: 7 additions & 3 deletions src/gpu_culling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,12 +280,16 @@ draw_cull_result_t gpu_cull(const vierkant::gpu_cull_context_ptr &context, const
vierkant::barrier(context->cull_cmd_buffer.handle(), draw_buffers.data(), draw_buffers.size(),
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, src_stage, src_access);

context->draw_cull_result_buffer->barrier(context->cull_cmd_buffer.handle(), VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
VK_ACCESS_2_SHADER_WRITE_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_READ_BIT);
VkBuffer count_buffers[] = {params.draws_counts_out_pre->handle(), params.draws_counts_out_post->handle()};
vierkant::barrier(context->cull_cmd_buffer.handle(), count_buffers, 2, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT,
VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT);

context->draw_cull_result_buffer_host->barrier(context->cull_cmd_buffer.handle(), src_stage, src_access, dst_stage,
dst_access);
// copy result into host-visible buffer
context->draw_cull_result_buffer->barrier(context->cull_cmd_buffer.handle(), src_stage, src_access,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
context->draw_cull_result_buffer->copy_to(context->draw_cull_result_buffer_host, context->cull_cmd_buffer.handle());

if(params.query_pool)
Expand Down
17 changes: 16 additions & 1 deletion src/mesh_compute.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ mesh_compute_context_handle create_mesh_compute_context(const vierkant::DevicePt
VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);

ret->cmd_buffer = vierkant::CommandBuffer(device, ret->command_pool.get());
vierkant::CommandBuffer::create_info_t cmd_buf_info = {};
cmd_buf_info.device = device;
cmd_buf_info.command_pool = ret->command_pool.get();
cmd_buf_info.name = "mesh_compute_context_t::cmd_buffer";
ret->cmd_buffer = vierkant::CommandBuffer(cmd_buf_info);

vierkant::Buffer::create_info_t internal_buffer_info = {};
internal_buffer_info.device = device;
Expand All @@ -60,8 +64,13 @@ mesh_compute_context_handle create_mesh_compute_context(const vierkant::DevicePt
VK_BUFFER_USAGE_TRANSFER_DST_BIT;
internal_buffer_info.mem_usage = VMA_MEMORY_USAGE_GPU_ONLY;

internal_buffer_info.name = "mesh_compute_context_t::skin_param_buffer";
ret->skin_param_buffer = vierkant::Buffer::create(internal_buffer_info);

internal_buffer_info.name = "mesh_compute_context_t::bone_buffer";
ret->bone_buffer = vierkant::Buffer::create(internal_buffer_info);

internal_buffer_info.name = "mesh_compute_context_t::morph_param_buffer";
ret->morph_param_buffer = vierkant::Buffer::create(internal_buffer_info);

vierkant::Buffer::create_info_t result_buffer_info = {};
Expand Down Expand Up @@ -256,6 +265,12 @@ mesh_compute_result_t mesh_compute(const mesh_compute_context_handle &context, c
params.query_index_start);
}

// barriers
VkBuffer buffers[] = {context->bone_buffer->handle(), context->skin_param_buffer->handle(),
context->morph_param_buffer->handle()};
vierkant::barrier(context->cmd_buffer.handle(), buffers, 3, VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);

// staging copies of bones + params
vierkant::staging_copy_context_t staging_context = {};
staging_context.command_buffer = context->cmd_buffer.handle();
Expand Down

0 comments on commit d1b69cf

Please sign in to comment.