From f321b80e7a48bdc7a59e199440008ec4b97b387c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 29 Jun 2026 18:25:17 -0700 Subject: [PATCH] Issue a batch when changing render targets in the Vulkan renderer Otherwise we get rendering artifacts that look like drawing is being applied to the wrong render target (cherry picked from commit 464b90b475f922ce038a926d497ecdb361b7e773) --- src/render/vulkan/SDL_render_vulkan.c | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index 0257c63c24..bd5dd6139f 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -3157,9 +3157,24 @@ static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) VULKAN_EnsureCommandBuffer(rendererData); - if (!texture) { - if (rendererData->textureRenderTarget) { + if (texture) { + textureData = (VULKAN_TextureData *)texture->internal; + if (textureData->mainImage.imageView == VK_NULL_HANDLE) { + return SDL_SetError("specified texture is not a render target"); + } + + rendererData->textureRenderTarget = textureData; + VULKAN_RecordPipelineImageBarrier(rendererData, + VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + rendererData->textureRenderTarget->mainImage.image, + &rendererData->textureRenderTarget->mainImage.imageLayout); + } else { + if (rendererData->textureRenderTarget) { VULKAN_RecordPipelineImageBarrier(rendererData, VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, @@ -3170,24 +3185,9 @@ static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture) &rendererData->textureRenderTarget->mainImage.imageLayout); } rendererData->textureRenderTarget = NULL; - return true; } - textureData = (VULKAN_TextureData *)texture->internal; - - if (textureData->mainImage.imageView == VK_NULL_HANDLE) { - return SDL_SetError("specified texture is not a render target"); - } - - rendererData->textureRenderTarget = textureData; - VULKAN_RecordPipelineImageBarrier(rendererData, - VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - rendererData->textureRenderTarget->mainImage.image, - &rendererData->textureRenderTarget->mainImage.imageLayout); + VULKAN_IssueBatch(rendererData); return true; }