Start removing uses of VkFormatToPixelConfig in vulkan backend

Bug: skia:
Change-Id: I2c8e86b9e8ca6a33913be347a3c65af963c5fd12
Reviewed-on: https://skia-review.googlesource.com/84341
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 319e188..5fdf58e 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -898,7 +898,7 @@
         return false;
     }
 
-    SkASSERT(config == GrVkFormatToPixelConfig(info->fFormat));
+    SkASSERT(GrVkFormatPixelConfigPairIsValid(info->fFormat, config));
     return true;
 }
 
@@ -1072,7 +1072,7 @@
     }
 
     // setup memory barrier
-    SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(tex->imageFormat()));
+    SkASSERT(GrVkFormatIsSupported(tex->imageFormat()));
     VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
     VkImageMemoryBarrier imageMemoryBarrier = {
         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,          // sType
diff --git a/src/gpu/vk/GrVkImage.cpp b/src/gpu/vk/GrVkImage.cpp
index c3a47dc..d23ebfe 100644
--- a/src/gpu/vk/GrVkImage.cpp
+++ b/src/gpu/vk/GrVkImage.cpp
@@ -20,7 +20,7 @@
         case VK_FORMAT_D32_SFLOAT_S8_UINT:
             return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
         default:
-            SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(format));
+            SkASSERT(GrVkFormatIsSupported(format));
             return VK_IMAGE_ASPECT_COLOR_BIT;
     }
 }
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index 1b20605..cb0046e 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -106,6 +106,63 @@
     }
 }
 
+bool GrVkFormatPixelConfigPairIsValid(VkFormat format, GrPixelConfig config) {
+    switch (format) {
+        case VK_FORMAT_R8G8B8A8_UNORM:
+            return kRGBA_8888_GrPixelConfig == config;
+        case VK_FORMAT_B8G8R8A8_UNORM:
+            return kBGRA_8888_GrPixelConfig == config;
+        case VK_FORMAT_R8G8B8A8_SRGB:
+            return kSRGBA_8888_GrPixelConfig == config;
+        case VK_FORMAT_B8G8R8A8_SRGB:
+            return kSBGRA_8888_GrPixelConfig == config;
+        case VK_FORMAT_R8G8B8A8_SINT:
+            return kRGBA_8888_sint_GrPixelConfig == config;
+        case VK_FORMAT_R5G6B5_UNORM_PACK16:
+            return kRGB_565_GrPixelConfig == config;
+        case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+            // R4G4B4A4 is not required to be supported so we actually
+            // store RGBA_4444 data as B4G4R4A4.
+            return kRGBA_4444_GrPixelConfig == config;
+        case VK_FORMAT_R8_UNORM:
+            return kAlpha_8_GrPixelConfig == config ||
+                   kAlpha_8_as_Red_GrPixelConfig == config ||
+                   kGray_8_GrPixelConfig == config ||
+                   kGray_8_as_Red_GrPixelConfig == config;
+        case VK_FORMAT_R32G32B32A32_SFLOAT:
+            return kRGBA_float_GrPixelConfig == config;
+        case VK_FORMAT_R32G32_SFLOAT:
+            return kRG_float_GrPixelConfig == config;
+        case VK_FORMAT_R16G16B16A16_SFLOAT:
+            return kRGBA_half_GrPixelConfig == config;
+        case VK_FORMAT_R16_SFLOAT:
+            return kAlpha_half_GrPixelConfig == config ||
+                   kAlpha_half_as_Red_GrPixelConfig == config;
+        default:
+            return false;
+    }
+}
+
+bool GrVkFormatIsSupported(VkFormat format) {
+    switch (format) {
+        case VK_FORMAT_R8G8B8A8_UNORM:
+        case VK_FORMAT_B8G8R8A8_UNORM:
+        case VK_FORMAT_R8G8B8A8_SRGB:
+        case VK_FORMAT_B8G8R8A8_SRGB:
+        case VK_FORMAT_R8G8B8A8_SINT:
+        case VK_FORMAT_R5G6B5_UNORM_PACK16:
+        case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+        case VK_FORMAT_R8_UNORM:
+        case VK_FORMAT_R32G32B32A32_SFLOAT:
+        case VK_FORMAT_R32G32_SFLOAT:
+        case VK_FORMAT_R16G16B16A16_SFLOAT:
+        case VK_FORMAT_R16_SFLOAT:
+            return true;
+        default:
+            return false;
+    }
+}
+
 bool GrVkFormatIsSRGB(VkFormat format, VkFormat* linearFormat) {
     VkFormat linearFmt = format;
     switch (format) {
diff --git a/src/gpu/vk/GrVkUtil.h b/src/gpu/vk/GrVkUtil.h
index 72ed483..01688c8 100644
--- a/src/gpu/vk/GrVkUtil.h
+++ b/src/gpu/vk/GrVkUtil.h
@@ -37,6 +37,13 @@
 */
 GrPixelConfig GrVkFormatToPixelConfig(VkFormat format);
 
+bool GrVkFormatIsSupported(VkFormat);
+
+/**
+ * Returns true if the passed in VkFormat and GrPixelConfig are compatible with each other.
+ */
+bool GrVkFormatPixelConfigPairIsValid(VkFormat, GrPixelConfig);
+
 /**
  * Returns true if the given vulkan texture format is sRGB encoded.
  * Also provides the non-sRGB version, if there is one.
diff --git a/tools/sk_app/VulkanWindowContext.cpp b/tools/sk_app/VulkanWindowContext.cpp
index 3517749..711791d 100644
--- a/tools/sk_app/VulkanWindowContext.cpp
+++ b/tools/sk_app/VulkanWindowContext.cpp
@@ -185,10 +185,10 @@
     auto srgbColorSpace = SkColorSpace::MakeSRGB();
     bool wantSRGB = srgbColorSpace == params.fColorSpace;
     for (uint32_t i = 0; i < surfaceFormatCount; ++i) {
-        GrPixelConfig config = GrVkFormatToPixelConfig(surfaceFormats[i].format);
-        if (kUnknown_GrPixelConfig != config &&
-            GrPixelConfigIsSRGB(config) == wantSRGB) {
-            surfaceFormat = surfaceFormats[i].format;
+        VkFormat localFormat = surfaceFormats[i].format;
+        if (GrVkFormatIsSupported(localFormat) &&
+            GrVkFormatIsSRGB(localFormat, nullptr) == wantSRGB) {
+            surfaceFormat = localFormat;
             colorSpace = surfaceFormats[i].colorSpace;
             break;
         }