radv: Don't use SRGB format for image stores during resolve.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 5 Aug 2017 23:47:09 +0000 (01:47 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 6 Aug 2017 14:06:50 +0000 (16:06 +0200)
These seem to store very bogus results. Luckily there is some code
that converts srgb->linear already, so just making the descriptor
format UNORM should work.

Fixes: 588185eb6b7 "radv/meta: add srgb conversion to end of resolve shader."
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_meta_resolve_cs.c
src/amd/vulkan/vk_format.h

index 1eef22ad7712f37be45a281f3dd0916bedcd8b75..832ae7b8c99d1f2f89d61dc78549d5821d978ac4 100644 (file)
@@ -402,7 +402,7 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
                                                     .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
                                                             .image = radv_image_to_handle(dest_image),
                                                             .viewType = radv_meta_get_view_type(dest_image),
-                                                            .format = dest_image->vk_format,
+                                                            .format = vk_to_non_srgb_format(dest_image->vk_format),
                                                             .subresourceRange = {
                                                             .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
                                                             .baseMipLevel = region->dstSubresource.mipLevel,
index c2c7ca4ce249c8bb987ed3628832dd913ade661e..43265ed3d979aa9a85faabc5a1534753f5b09343 100644 (file)
@@ -465,4 +465,27 @@ vk_format_get_component_bits(VkFormat format,
        }
 }
 
+static inline VkFormat
+vk_to_non_srgb_format(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;
+       default:
+               return format;
+       }
+}
+
 #endif /* VK_FORMAT_H */