diff --git a/.pick_status.json b/.pick_status.json index 733c6e752df..8e79d85448f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -256,7 +256,7 @@ "description": "vulkan: Handle VK_SUBPASS_EXTERNAL at the end of a subpass", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "1d726940d2881395994751078dad3bda0cabbdfb" }, @@ -868,7 +868,7 @@ "description": "meson: Fixes name_prefix for clover on mingw", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, @@ -877,7 +877,7 @@ "description": "clover: Fixes building with mingw-x86", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, @@ -886,7 +886,7 @@ "description": "clover: Rename *OpenCL.def to *OpenCL.def.in", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/vulkan/runtime/vk_render_pass.c b/src/vulkan/runtime/vk_render_pass.c index 451c25670a4..3dfc0637fc0 100644 --- a/src/vulkan/runtime/vk_render_pass.c +++ b/src/vulkan/runtime/vk_render_pass.c @@ -2054,9 +2054,42 @@ static void end_subpass(struct vk_command_buffer *cmd_buffer, const VkSubpassEndInfo *end_info) { + const struct vk_render_pass *pass = cmd_buffer->render_pass; + const uint32_t subpass_idx = cmd_buffer->subpass_idx; struct vk_device_dispatch_table *disp = &cmd_buffer->base.device->dispatch_table; + disp->CmdEndRendering(vk_command_buffer_to_handle(cmd_buffer)); + + bool needs_mem_barrier = false; + VkMemoryBarrier2 mem_barrier = { + .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2, + }; + for (uint32_t d = 0; d < pass->dependency_count; d++) { + const struct vk_subpass_dependency *dep = &pass->dependencies[d]; + if (dep->src_subpass != subpass_idx) + continue; + + if (dep->dst_subpass != VK_SUBPASS_EXTERNAL) + continue; + + needs_mem_barrier = true; + mem_barrier.srcStageMask |= dep->src_stage_mask; + mem_barrier.srcAccessMask |= dep->src_access_mask; + mem_barrier.dstStageMask |= dep->dst_stage_mask; + mem_barrier.dstAccessMask |= dep->dst_access_mask; + } + + if (needs_mem_barrier) { + const VkDependencyInfo dependency_info = { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .dependencyFlags = 0, + .memoryBarrierCount = 1, + .pMemoryBarriers = &mem_barrier, + }; + disp->CmdPipelineBarrier2(vk_command_buffer_to_handle(cmd_buffer), + &dependency_info); + } } VKAPI_ATTR void VKAPI_CALL