aboutsummaryrefslogtreecommitdiff
path: root/cube/cube.c
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2020-04-02 06:45:48 +0100
committerjeremyk-lunarg <jeremyk@lunarg.com>2020-04-06 13:54:26 -0600
commit1fbefe048387b827a8f9859c0754bce2f09d1985 (patch)
treec9f46b0be619aede6e1cd3303c66066c9d04b363 /cube/cube.c
parentf002f7dad7fbe0b6f9457605b3d2968f00643aa9 (diff)
downloadusermoji-1fbefe048387b827a8f9859c0754bce2f09d1985.tar.xz
cube: Pick non-SRGB surface formats first
Pick some common non-SRGB formats first. RADV exposes SRGB formats first which causes incorrect rendering.
Diffstat (limited to 'cube/cube.c')
-rw-r--r--cube/cube.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/cube/cube.c b/cube/cube.c
index 7de8e268..602b4bdc 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;