From f6bf5d9a3efe8b6212c6522c9d4b65e4429303c0 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 21 May 2025 15:09:29 -0700 Subject: [PATCH] vulkan/wsi: amend barriers for blit dst buffer For non-external blit dst buffer, it's bliting the wsi image to a buffer with mapping populated by vkMapMemory, and it's shared via xcb_put_image for x11 or memcpy into a shared wl_buffer backed by shm. So we need additional host stage and host access bit to ensure proper cache flush. There's no queue family ownership transfer needed. Reviewed-by: Hans-Kristian Arntzen Part-of: --- src/vulkan/wsi/wsi_common.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 2f8879ea75d..f4c23b19d55 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -1984,12 +1984,24 @@ wsi_cmd_blit_image_to_buffer(VkCommandBuffer cmd_buffer, img_mem_barrier.dstAccessMask = 0; img_mem_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; img_mem_barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + + const VkBufferMemoryBarrier buf_mem_barrier = { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .pNext = NULL, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = image->blit.buffer, + .offset = 0, + .size = VK_WHOLE_SIZE, + }; wsi->CmdPipelineBarrier(cmd_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, + VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, - 0, NULL, + 1, &buf_mem_barrier, 1, &img_mem_barrier); }