From 1fbefe048387b827a8f9859c0754bce2f09d1985 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 2 Apr 2020 06:45:48 +0100 Subject: [PATCH] cube: Pick non-SRGB surface formats first Pick some common non-SRGB formats first. RADV exposes SRGB formats first which causes incorrect rendering. --- cube/cube.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/cube/cube.c b/cube/cube.c index 7de8e26..602b4bd 100644 --- a/cube/cube.c +++ b/cube/cube.c @@ -3412,6 +3412,24 @@ static void demo_create_surface(struct demo *demo) { assert(!err); } +static VkSurfaceFormatKHR pick_surface_format(const VkSurfaceFormatKHR *surfaceFormats, uint32_t count) { + // Prefer non-SRGB formats... + for (uint32_t i = 0; i < count; i++) { + const VkFormat format = surfaceFormats[i].format; + + if (format == VK_FORMAT_R8G8B8A8_UNORM || format == VK_FORMAT_B8G8R8A8_UNORM || + format == VK_FORMAT_A2B10G10R10_UNORM_PACK32 || format == VK_FORMAT_A2R10G10B10_UNORM_PACK32 || + format == VK_FORMAT_R16G16B16A16_SFLOAT) { + return surfaceFormats[i]; + } + } + + printf("Can't find our preferred formats... Falling back to first exposed format. Rendering may be incorrect.\n"); + + assert(count >= 1); + return surfaceFormats[0]; +} + static void demo_init_vk_swapchain(struct demo *demo) { VkResult U_ASSERT_ONLY err; @@ -3489,9 +3507,9 @@ static void demo_init_vk_swapchain(struct demo *demo) { VkSurfaceFormatKHR *surfFormats = (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR)); err = demo->fpGetPhysicalDeviceSurfaceFormatsKHR(demo->gpu, demo->surface, &formatCount, surfFormats); assert(!err); - assert(formatCount >= 1); - demo->format = surfFormats[0].format; - demo->color_space = surfFormats[0].colorSpace; + VkSurfaceFormatKHR surfaceFormat = pick_surface_format(surfFormats, formatCount); + demo->format = surfaceFormat.format; + demo->color_space = surfaceFormat.colorSpace; free(surfFormats); demo->quit = false; -- 2.7.4