From a4de176e1cefc6887814f03310c7a8a7046bf06a Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Mon, 27 May 2024 19:44:53 +0100 Subject: [PATCH] Use the correct pixel formats for Vulkan on big endian --- src/render/vulkan/SDL_render_vulkan.c | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index 0dd5f74a13..8d7383c8c9 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -395,9 +395,11 @@ static bool VULKAN_UpdateTextureInternal(VULKAN_RenderData *rendererData, VkImag static SDL_PixelFormat VULKAN_VkFormatToSDLPixelFormat(VkFormat vkFormat) { switch (vkFormat) { - case VK_FORMAT_B8G8R8A8_UNORM: - return SDL_PIXELFORMAT_ARGB8888; case VK_FORMAT_R8G8B8A8_UNORM: + return SDL_PIXELFORMAT_RGBA32; + case VK_FORMAT_B8G8R8A8_UNORM: + return SDL_PIXELFORMAT_BGRA32; + case VK_FORMAT_A8B8G8R8_UNORM_PACK32: return SDL_PIXELFORMAT_ABGR8888; case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return SDL_PIXELFORMAT_ABGR2101010; @@ -430,8 +432,12 @@ static VkDeviceSize VULKAN_GetBytesPerPixel(VkFormat vkFormat, int plane) return 2; case VK_FORMAT_R16G16_UNORM: return 4; + case VK_FORMAT_R8G8B8A8_SRGB: + case VK_FORMAT_R8G8B8A8_UNORM: case VK_FORMAT_B8G8R8A8_SRGB: case VK_FORMAT_B8G8R8A8_UNORM: + case VK_FORMAT_A8B8G8R8_SRGB_PACK32: + case VK_FORMAT_A8B8G8R8_UNORM_PACK32: case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return 4; case VK_FORMAT_R16G16B16A16_SFLOAT: @@ -454,16 +460,23 @@ static VkFormat SDLPixelFormatToVkTextureFormat(Uint32 format, Uint32 output_col return VK_FORMAT_R16G16B16A16_SFLOAT; case SDL_PIXELFORMAT_ABGR2101010: return VK_FORMAT_A2B10G10R10_UNORM_PACK32; - case SDL_PIXELFORMAT_ARGB8888: - if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) { - return VK_FORMAT_B8G8R8A8_SRGB; - } - return VK_FORMAT_B8G8R8A8_UNORM; - case SDL_PIXELFORMAT_ABGR8888: + case SDL_PIXELFORMAT_RGBA32: if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) { return VK_FORMAT_R8G8B8A8_SRGB; } return VK_FORMAT_R8G8B8A8_UNORM; + case SDL_PIXELFORMAT_BGRA32: + if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) { + return VK_FORMAT_B8G8R8A8_SRGB; + } + return VK_FORMAT_B8G8R8A8_UNORM; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + case SDL_PIXELFORMAT_ABGR8888: + if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) { + return VK_FORMAT_A8B8G8R8_SRGB_PACK32; + } + return VK_FORMAT_A8B8G8R8_UNORM_PACK32; +#endif case SDL_PIXELFORMAT_INDEX8: return VK_FORMAT_R8_UNORM; case SDL_PIXELFORMAT_YUY2: @@ -4553,8 +4566,11 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD VULKAN_InvalidateCachedState(renderer); renderer->name = VULKAN_RenderDriver.name; - SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888); + SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32); // SDL_PIXELFORMAT_ARGB8888 on little endian systems + SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32); +#if SDL_BYTEORDER == SDL_BIG_ENDIAN SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888); +#endif SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT); SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);