diff --git a/libs/video/renderer/vulkan/barrier.c b/libs/video/renderer/vulkan/barrier.c index a34d5033c..bd9d3b85a 100644 --- a/libs/video/renderer/vulkan/barrier.c +++ b/libs/video/renderer/vulkan/barrier.c @@ -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] = { diff --git a/libs/video/renderer/vulkan/render.c b/libs/video/renderer/vulkan/render.c index 2d6326460..925ab4c02 100644 --- a/libs/video/renderer/vulkan/render.c +++ b/libs/video/renderer/vulkan/render.c @@ -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); diff --git a/libs/video/renderer/vulkan/rp_main_def.plist b/libs/video/renderer/vulkan/rp_main_def.plist index 948beb0f1..46e300f03 100644 --- a/libs/video/renderer/vulkan/rp_main_def.plist +++ b/libs/video/renderer/vulkan/rp_main_def.plist @@ -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 = { diff --git a/libs/video/renderer/vulkan/vulkan_lighting.c b/libs/video/renderer/vulkan/vulkan_lighting.c index d1f5dae47..1bcfd81d6 100644 --- a/libs/video/renderer/vulkan/vulkan_lighting.c +++ b/libs/video/renderer/vulkan/vulkan_lighting.c @@ -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); diff --git a/libs/video/renderer/vulkan/vulkan_matrices.c b/libs/video/renderer/vulkan/vulkan_matrices.c index b05001cc4..cb153e446 100644 --- a/libs/video/renderer/vulkan/vulkan_matrices.c +++ b/libs/video/renderer/vulkan/vulkan_matrices.c @@ -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; diff --git a/libs/video/targets/vid_x11_vulkan.c b/libs/video/targets/vid_x11_vulkan.c index af0e1cf3b..55fd955f2 100644 --- a/libs/video/targets/vid_x11_vulkan.c +++ b/libs/video/targets/vid_x11_vulkan.c @@ -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 ());