From 5560a72fc8eda64e17ab15469f055edd36cc6045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Poisot?= Date: Fri, 12 Jun 2026 17:37:29 +0000 Subject: [PATCH] render/vulkan: let vkRenderPass handle blend buffer layout transitions --- render/vulkan/pass.c | 33 ++++----------------------------- render/vulkan/renderer.c | 2 +- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 38be3320b..2e98b268a 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -428,35 +428,6 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { pass->render_buffer_out->transitioned = true; } - if (pass->two_pass) { - // On the first frame the clear render pass transitions the blend - // image from undefined and we just mark it transitioned. On every - // frame after, the previous frame left it read-only, so we change - // it back to a color attachment before the render pass starts - if (render_buffer->two_pass.blend_transitioned) { - VkImageMemoryBarrier blend_acq_barrier = { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = render_buffer->two_pass.blend_image, - .oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - .newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - .srcAccessMask = VK_ACCESS_SHADER_READ_BIT, - .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .layerCount = 1, - .levelCount = 1, - }, - }; - vkCmdPipelineBarrier(stage_cb->vk, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - 0, 0, NULL, 0, NULL, 1, &blend_acq_barrier); - } else { - render_buffer->two_pass.blend_transitioned = true; - } - } - // acquire render buffer before rendering acquire_barriers[idx] = (VkImageMemoryBarrier){ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, @@ -602,6 +573,10 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { goto error; } + if (pass->two_pass) { + render_buffer->two_pass.blend_transitioned = true; + } + free(render_wait); vulkan_stage_mark_submit(renderer, render_timeline_point); diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 44f4d39d8..e12a43891 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -2485,7 +2485,7 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup( .storeOp = VK_ATTACHMENT_STORE_OP_STORE, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, - .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, .finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, }, {