radv: Fix SRGB compute copies.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 20 May 2018 23:26:46 +0000 (01:26 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 21 May 2018 08:33:41 +0000 (10:33 +0200)
SRGB stores are broken. We had compensation code in the
resolve path but none in the copy path. Since we don't
want any conversion and it does not matter for DCC,
just make everything UNORM instead.

This happened to cause wrong colors for the PRIME path, as
that uses image->buffer copies which always use the compute
path.

CC: 18.0 18.1 <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106587
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_meta_copy.c
src/amd/vulkan/vk_format.h

index 1f18886d2c5f56ec0923938a13e70e02bf125a26..a4d359826617a723a833a6d55723fb9dc757ce21 100644 (file)
@@ -94,6 +94,8 @@ blit_surf_for_image_level_layer(struct radv_image *image,
            !(radv_image_is_tc_compat_htile(image)))
                format = vk_format_for_size(vk_format_get_blocksize(format));
 
+       format = vk_format_no_srgb(format);
+
        return (struct radv_meta_blit2d_surf) {
                .format = format,
                .bs = vk_format_get_blocksize(format),
index b8cb4f4ed37a79700be507f08688b6f82987440d..933db4d961c0b3bac6d98787108158a6fd7cf6f5 100644 (file)
@@ -416,6 +416,46 @@ vk_format_is_srgb(VkFormat format)
        return desc->colorspace == VK_FORMAT_COLORSPACE_SRGB;
 }
 
+static inline VkFormat
+vk_format_no_srgb(VkFormat format)
+{
+       switch(format) {
+       case VK_FORMAT_R8_SRGB:
+               return VK_FORMAT_R8_UNORM;
+       case VK_FORMAT_R8G8_SRGB:
+               return VK_FORMAT_R8G8_UNORM;
+       case VK_FORMAT_R8G8B8_SRGB:
+               return VK_FORMAT_R8G8B8_UNORM;
+       case VK_FORMAT_B8G8R8_SRGB:
+               return VK_FORMAT_B8G8R8_UNORM;
+       case VK_FORMAT_R8G8B8A8_SRGB:
+               return VK_FORMAT_R8G8B8A8_UNORM;
+       case VK_FORMAT_B8G8R8A8_SRGB:
+               return VK_FORMAT_B8G8R8A8_UNORM;
+       case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
+               return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
+       case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
+               return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
+       case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
+               return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
+       case VK_FORMAT_BC2_SRGB_BLOCK:
+               return VK_FORMAT_BC2_UNORM_BLOCK;
+       case VK_FORMAT_BC3_SRGB_BLOCK:
+               return VK_FORMAT_BC3_UNORM_BLOCK;
+       case VK_FORMAT_BC7_SRGB_BLOCK:
+               return VK_FORMAT_BC7_UNORM_BLOCK;
+       case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
+               return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
+       case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
+               return VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
+       case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
+               return VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
+       default:
+               assert(!vk_format_is_srgb(format));
+               return format;
+       }
+}
+
 static inline VkFormat
 vk_format_stencil_only(VkFormat format)
 {