# SDL: Fixed Vulkan validation error in SDL\_RenderReadPixels()

**URL:** <https://discourse.libsdl.org/t/sdl-fixed-vulkan-validation-error-in-sdl-renderreadpixels/69274>\
**Category:** SDL Commits\
**Created:** [September 10, 2026, 8:05pm UTC](https://discourse.libsdl.org/t/sdl-fixed-vulkan-validation-error-in-sdl-renderreadpixels/69274 "2026-09-10T20:05:04Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![SDLPushPostBot](https://discourse.libsdl.org/user_avatar/discourse.libsdl.org/sdlpushpostbot/32/4370_2.png) [@SDLPushPostBot](https://discourse.libsdl.org/u/SDLPushPostBot)\
**Post date:** [September 10, 2026, 8:05pm UTC](https://discourse.libsdl.org/t/sdl-fixed-vulkan-validation-error-in-sdl-renderreadpixels/69274/1 "2026-09-10T20:05:04Z")

</div>

> <https://github.com/libsdl-org/SDL/commit/3df2b1a2a7a3ae63a6821997c25a80aaae9e6bd9>
>
> Validation Error: \[VUID-VkImageMemoryBarrier-oldLayout-01212 \] | MessageID = 0x…ff795e16
> vkCmdPipelineBarrier(): pImageMemoryBarriers\[0\].newLayout (VK\_IMAGE\_LAYOUT\_TRANSFER\_SRC\_OPTIMAL) is not compatible with VkImage 0x2160000000216 usage flags VK\_IMAGE\_USAGE\_2\_TRANSFER\_DST\_BIT\_KHR|VK\_IMAGE\_USAGE\_2\_COLOR\_ATTACHMENT\_BIT\_KHR.
> The Vulkan spec states: If layouts are not ignored, oldLayout or newLayout is VK\_IMAGE\_LAYOUT\_TRANSFER\_SRC\_OPTIMAL then image must have been created with the VK\_IMAGE\_USAGE\_TRANSFER\_SRC\_BIT usage flag set (https://docs.vulkan.org/spec/latest/chapters/synchronization.html#VUID-VkImageMemoryBarrier-oldLayout-01212)

```diff
From 3df2b1a2a7a3ae63a6821997c25a80aaae9e6bd9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 10 Sep 2026 10:57:57 -0700
Subject: [PATCH] Fixed Vulkan validation error in SDL_RenderReadPixels()

  Validation Error: [VUID-VkImageMemoryBarrier-oldLayout-01212] | MessageID = 0xff795e16
  vkCmdPipelineBarrier(): pImageMemoryBarriers[0].newLayout (VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) is not compatible with VkImage 0x2160000000216 usage flags VK_IMAGE_USAGE_2_TRANSFER_DST_BIT_KHR|VK_IMAGE_USAGE_2_COLOR_ATTACHMENT_BIT_KHR.
  The Vulkan spec states: If layouts are not ignored, oldLayout or newLayout is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then image must have been created with the VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag set (https://docs.vulkan.org/spec/latest/chapters/synchronization.html#VUID-VkImageMemoryBarrier-oldLayout-01212)
---
 src/render/vulkan/SDL_render_vulkan.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c
index 90a58c1201335..03b344a67a23f 100644
--- a/src/render/vulkan/SDL_render_vulkan.c
+++ b/src/render/vulkan/SDL_render_vulkan.c
@@ -2312,6 +2312,10 @@ static VkResult VULKAN_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
     swapchainCreateInfo.imageExtent = rendererData->swapchainSize;
     swapchainCreateInfo.imageArrayLayers = 1;
     swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ // SDL_RenderReadPixels() copies from the swapchain image, which requires TRANSFER_SRC
+ if (rendererData->surfaceCapabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
+ swapchainCreateInfo.imageUsage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ }
     swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
     swapchainCreateInfo.preTransform = rendererData->swapChainPreTransform;
     swapchainCreateInfo.compositeAlpha = (renderer->window->flags & SDL_WINDOW_TRANSPARENT) ? (VkCompositeAlphaFlagBitsKHR)0 : VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;

```
