mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 05:01:24 +00:00
[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:
parent
e0d9410469
commit
61e6332473
6 changed files with 63 additions and 13 deletions
|
@ -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] = {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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, ©_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;
|
||||
|
||||
|
|
|
@ -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 ());
|
||||
|
|
Loading…
Reference in a new issue