From ca54443b2c7068f621d70569d46385f1955bcbc4 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 6 May 2026 15:06:02 +0100 Subject: [PATCH] vulkan-renderer: Fix stages for sync in read_pixels When we're reading back from a framebuffer, we need to sync from fragment-shader output (i.e. after the final pixels are written to the framebuffer) before we copy away from it, and sync to fragment-shader (i.e. before any output touches the framebuffer) before we reuse it after the copy. The latter is a no-op as we currently do a complete vkQueueWaitIdle() after read_pixels(), but it removes a future footgun. Fixes occasional fixes seen in screenshot testing. Signed-off-by: Daniel Stone --- libweston/renderer-vulkan/vulkan-renderer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libweston/renderer-vulkan/vulkan-renderer.c b/libweston/renderer-vulkan/vulkan-renderer.c index 5d95858b8..9e01533d7 100644 --- a/libweston/renderer-vulkan/vulkan-renderer.c +++ b/libweston/renderer-vulkan/vulkan-renderer.c @@ -1349,8 +1349,8 @@ vulkan_renderer_do_read_pixels(struct vulkan_renderer *vr, transition_image_layout(cmd_buffer, color_attachment, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, VK_ACCESS_TRANSFER_WRITE_BIT); + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); copy_sub_image_to_buffer(cmd_buffer, dst_buffer, color_attachment, @@ -1362,8 +1362,8 @@ vulkan_renderer_do_read_pixels(struct vulkan_renderer *vr, transition_image_layout(cmd_buffer, color_attachment, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, VK_ACCESS_TRANSFER_WRITE_BIT); + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); // TODO: async implementation of this, remove wait vulkan_renderer_cmd_end_wait(vr, &cmd_buffer);