[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, .srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, .dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
.barrier = { .barrier = {
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 0, .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_UNIFORM_READ_BIT, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, .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] = { [qfv_BB_TransferWrite_to_ShaderRW] = {

View file

@ -180,6 +180,8 @@ QFV_RunRenderPassCmd (VkCommandBuffer cmd, vulkan_ctx_t *ctx,
.cmd = QFV_GetCmdBuffer (ctx, true), .cmd = QFV_GetCmdBuffer (ctx, true),
.data = data, .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); run_subpass (sp, &taskctx);
dfunc->vkCmdExecuteCommands (cmd, 1, &taskctx.cmd); dfunc->vkCmdExecuteCommands (cmd, 1, &taskctx.cmd);
QFV_duCmdEndLabel (device, cmd); QFV_duCmdEndLabel (device, cmd);

View file

@ -14,6 +14,16 @@ properties = {
slice = "[0.8, 0.7, 0.2, 1]"; slice = "[0.8, 0.7, 0.2, 1]";
lines = "[0.8, 0.7, 0.4, 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 = { color_dependency = {
src = { src = {
stage = color_attachment_output; 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; output = output;
}; };
@ -2117,6 +2141,9 @@ renderpasses = {
subpasses = { subpasses = {
compose = { compose = {
color = "[ 0, 0.5, 0.5, 1]"; color = "[ 0, 0.5, 0.5, 1]";
dependencies = {
$external = $swapchain_dependency;
};
attachments = { attachments = {
color = { color = {
output = { output = {
@ -2219,7 +2246,7 @@ renderpasses = {
color = "[ 0.5, 0.5, 0.5, 1]"; color = "[ 0.5, 0.5, 0.5, 1]";
attachments = { attachments = {
depth = { 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 = { shadow2 = {

View file

@ -585,6 +585,8 @@ transition_shadow_targets (lightingframe_t *lframe, vulkan_ctx_t *ctx)
} }
auto cmd = QFV_GetCmdBuffer (ctx, false); auto cmd = QFV_GetCmdBuffer (ctx, false);
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER, cmd,
"lighting:cmd:transition_shadow_targets");
dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) { dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, .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, QFV_PacketScatterBuffer (packet, lframe->id_buffer,
1, &lid_scatter, 1, &lid_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_IndexRead]); &bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
auto lradii = (float *) packet_data; auto lradii = (float *) packet_data;
qfv_scatter_t lradius_scatter = { 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, QFV_PacketScatterBuffer (packet, lframe->radius_buffer,
1, &lradius_scatter, 1, &lradius_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_IndexRead]); &bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
auto eids = (uint32_t *) packet_data; auto eids = (uint32_t *) packet_data;
qfv_scatter_t eid_scatter = { 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); enqueue_map (matrix_ids, lframe, r);
} }
QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter, bb); QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter,
QFV_PacketScatterBuffer (packet, lframe->radius_buffer, &bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
1, &radius_scatter, bb); QFV_PacketScatterBuffer (packet, lframe->radius_buffer, 1, &radius_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
QFV_PacketScatterBuffer (packet, lframe->shadowmat_id_buffer, QFV_PacketScatterBuffer (packet, lframe->shadowmat_id_buffer,
1, &matrix_id_scater, bb); 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 render = light_cull->render;
auto cmd = QFV_GetCmdBuffer (ctx, false); auto cmd = QFV_GetCmdBuffer (ctx, false);
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER, cmd,
"lighting:cmd:lighting_cull_lights");
dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) { dfunc->vkBeginCommandBuffer (cmd, &(VkCommandBufferBeginInfo) {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
@ -1879,7 +1884,7 @@ lighting_startup (exprctx_t *ectx)
make_ico (packet); make_ico (packet);
make_cone (packet); make_cone (packet);
QFV_PacketCopyBuffer (packet, splat_verts[0].buffer.buffer, 0, QFV_PacketCopyBuffer (packet, splat_verts[0].buffer.buffer, 0,
&bufferBarriers[qfv_BB_TransferWrite_to_UniformRead]); &bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
QFV_PacketSubmit (packet); QFV_PacketSubmit (packet);
packet = QFV_PacketAcquire (ctx->staging); packet = QFV_PacketAcquire (ctx->staging);
write_inds (packet); 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, dfunc->vkCmdCopyBuffer (packet->cmd, mctx->stage->buffer,
mframe->buffer, 1, &copy_region); 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.buffer = mframe->buffer;
bb.barrier.size = packet->length; bb.barrier.size = packet->length;

View file

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