[vulkan] Fix a pile of synchronization issues

Recent changes to the validation layers got more aggressive in their
checks and found a bunch of incorrect barriers (and some missing ones).
This commit is contained in:
Bill Currie 2024-03-26 15:53:49 +09:00
parent e0d9410469
commit 61e6332473
6 changed files with 63 additions and 13 deletions

View file

@ -211,9 +211,12 @@ const qfv_bufferbarrier_t bufferBarriers[] = {
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
.barrier = {
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 0,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_UNIFORM_READ_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT
| VK_ACCESS_SHADER_READ_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
},
},
[qfv_BB_TransferWrite_to_ShaderRW] = {

View file

@ -180,6 +180,8 @@ QFV_RunRenderPassCmd (VkCommandBuffer cmd, vulkan_ctx_t *ctx,
.cmd = QFV_GetCmdBuffer (ctx, true),
.data = data,
};
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER, taskctx.cmd,
va (ctx->va_ctx, "renderpass:%s", rp->label.name));
run_subpass (sp, &taskctx);
dfunc->vkCmdExecuteCommands (cmd, 1, &taskctx.cmd);
QFV_duCmdEndLabel (device, cmd);

View file

@ -14,6 +14,16 @@ properties = {
slice = "[0.8, 0.7, 0.2, 1]";
lines = "[0.8, 0.7, 0.4, 1]";
};
swapchain_dependency = {
src = {
stage = color_attachment_output;
access = 0;
};
dst = {
stage = color_attachment_output;
access = color_attachment_write|color_attachment_read;
};
};
color_dependency = {
src = {
stage = color_attachment_output;
@ -2035,6 +2045,20 @@ renderpasses = {
};
};
};
$external = {
dependencies = {
compose = {
src = {
stage = color_attachment_output;
access = color_attachment_write;
};
dst = {
stage = fragment_shader;
access = shader_read;
};
}
};
};
};
output = output;
};
@ -2117,6 +2141,9 @@ renderpasses = {
subpasses = {
compose = {
color = "[ 0, 0.5, 0.5, 1]";
dependencies = {
$external = $swapchain_dependency;
};
attachments = {
color = {
output = {
@ -2219,7 +2246,7 @@ renderpasses = {
color = "[ 0.5, 0.5, 0.5, 1]";
attachments = {
depth = {
shadow = transfer_src_optimal;
shadow = depth_stencil_attachment_optimal;
};
};
@ -2294,6 +2321,20 @@ renderpasses = {
};
};
};
$external = {
dependencies = {
shadow = {
src = {
stage = late_fragment_tests;
access = depth_stencil_attachment_write;
};
dst = {
stage = transfer;
access = transfer_read;
};
}
};
};
};
};
shadow2 = {

View file

@ -585,6 +585,8 @@ transition_shadow_targets (lightingframe_t *lframe, vulkan_ctx_t *ctx)
}
auto cmd = QFV_GetCmdBuffer (ctx, false);
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER, cmd,
"lighting:cmd:transition_shadow_targets");
dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
@ -813,7 +815,7 @@ lighting_update_lights (const exprval_t **params, exprval_t *result,
}
QFV_PacketScatterBuffer (packet, lframe->id_buffer,
1, &lid_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_IndexRead]);
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
auto lradii = (float *) packet_data;
qfv_scatter_t lradius_scatter = {
@ -828,7 +830,7 @@ lighting_update_lights (const exprval_t **params, exprval_t *result,
}
QFV_PacketScatterBuffer (packet, lframe->radius_buffer,
1, &lradius_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_IndexRead]);
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
auto eids = (uint32_t *) packet_data;
qfv_scatter_t eid_scatter = {
@ -1111,9 +1113,10 @@ lighting_rewrite_ids (lightingframe_t *lframe, vulkan_ctx_t *ctx)
enqueue_map (matrix_ids, lframe, r);
}
QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter, bb);
QFV_PacketScatterBuffer (packet, lframe->radius_buffer,
1, &radius_scatter, bb);
QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
QFV_PacketScatterBuffer (packet, lframe->radius_buffer, 1, &radius_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
QFV_PacketScatterBuffer (packet, lframe->shadowmat_id_buffer,
1, &matrix_id_scater, bb);
@ -1168,6 +1171,8 @@ lighting_cull_lights (const exprval_t **params, exprval_t *result,
auto render = light_cull->render;
auto cmd = QFV_GetCmdBuffer (ctx, false);
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER, cmd,
"lighting:cmd:lighting_cull_lights");
dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
@ -1879,7 +1884,7 @@ lighting_startup (exprctx_t *ectx)
make_ico (packet);
make_cone (packet);
QFV_PacketCopyBuffer (packet, splat_verts[0].buffer.buffer, 0,
&bufferBarriers[qfv_BB_TransferWrite_to_UniformRead]);
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
QFV_PacketSubmit (packet);
packet = QFV_PacketAcquire (ctx->staging);
write_inds (packet);

View file

@ -160,7 +160,7 @@ update_matrices (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
dfunc->vkCmdCopyBuffer (packet->cmd, mctx->stage->buffer,
mframe->buffer, 1, &copy_region);
bb = bufferBarriers[qfv_LT_TransferDst_to_ShaderReadOnly];
bb = bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
bb.barrier.buffer = mframe->buffer;
bb.barrier.size = packet->length;

View file

@ -92,8 +92,7 @@ static void *vulkan_library;
static void
load_vulkan_library (vulkan_ctx_t *ctx)
{
vulkan_library = dlopen (vulkan_library_name,
RTLD_DEEPBIND | RTLD_NOW);
vulkan_library = dlopen (vulkan_library_name, RTLD_DEEPBIND | RTLD_NOW);
if (!vulkan_library) {
Sys_Error ("Couldn't load vulkan library %s: %s",
vulkan_library_name, dlerror ());