mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 13:11:00 +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,
|
.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] = {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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, ©_region);
|
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.buffer = mframe->buffer;
|
||||||
bb.barrier.size = packet->length;
|
bb.barrier.size = packet->length;
|
||||||
|
|
||||||
|
|
|
@ -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 ());
|
||||||
|
|
Loading…
Reference in a new issue