Fix compatible format check for vkCmdCopyImage.

Change-Id: I4553bbdb7be5f5bd9e6efc12f4e3aba7557c4549
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213133
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 76230a1..bbcd688 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -75,6 +75,46 @@
     return true;
 }
 
+static int get_compatible_format_class(GrPixelConfig config) {
+    switch (config) {
+        case kAlpha_8_GrPixelConfig:
+        case kAlpha_8_as_Red_GrPixelConfig:
+        case kGray_8_GrPixelConfig:
+        case kGray_8_as_Red_GrPixelConfig:
+            return 1;
+        case kRGB_565_GrPixelConfig:
+        case kRGBA_4444_GrPixelConfig:
+        case kRG_88_GrPixelConfig:
+        case kAlpha_half_GrPixelConfig:
+        case kAlpha_half_as_Red_GrPixelConfig:
+            return 2;
+        case kRGB_888_GrPixelConfig:
+            return 3;
+        case kRGBA_8888_GrPixelConfig:
+        case kRGB_888X_GrPixelConfig:
+        case kBGRA_8888_GrPixelConfig:
+        case kSRGBA_8888_GrPixelConfig:
+        case kSBGRA_8888_GrPixelConfig:
+        case kRGBA_1010102_GrPixelConfig:
+            return 4;
+        case kRGBA_half_GrPixelConfig:
+        case kRGBA_half_Clamped_GrPixelConfig:
+        case kRG_float_GrPixelConfig:
+            return 5;
+        case kRGBA_float_GrPixelConfig:
+            return 6;
+        case kRGB_ETC1_GrPixelConfig:
+            return 7;
+        case kUnknown_GrPixelConfig:
+        case kAlpha_8_as_Alpha_GrPixelConfig:
+        case kGray_8_as_Lum_GrPixelConfig:
+            SK_ABORT("Unsupported Vulkan pixel config");
+            return 0;
+    }
+    SK_ABORT("Invalid pixel config");
+    return 0;
+}
+
 bool GrVkCaps::canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurfaceOrigin dstOrigin,
                             bool dstHasYcbcr, GrPixelConfig srcConfig, int srcSampleCnt,
                             GrSurfaceOrigin srcOrigin, bool srcHasYcbcr) const {
@@ -88,7 +128,8 @@
 
     // We require that all vulkan GrSurfaces have been created with transfer_dst and transfer_src
     // as image usage flags.
-    if (srcOrigin != dstOrigin || GrBytesPerPixel(srcConfig) != GrBytesPerPixel(dstConfig)) {
+    if (srcOrigin != dstOrigin ||
+        get_compatible_format_class(srcConfig) != get_compatible_format_class(dstConfig)) {
         return false;
     }
 
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 5aca28c..6daf28d 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -809,6 +809,17 @@
         if (!copyTexture) {
             return false;
         }
+
+        bool dstHasYcbcr = tex->ycbcrConversionInfo().isValid();
+        if (!this->vkCaps().canCopyAsBlit(tex->config(), 1, false, dstHasYcbcr,
+                                          copyTexture->config(), 1, false,
+                                          false) &&
+            !this->vkCaps().canCopyAsDraw(tex->config(), SkToBool(tex->asRenderTarget()),
+                                          dstHasYcbcr,
+                                          copyTexture->config(), true, false)) {
+            return false;
+        }
+
         uploadTexture = copyTexture.get();
         uploadLeft = 0;
         uploadTop = 0;
@@ -2292,9 +2303,8 @@
             srcSampleCount = rt->numColorSamples();
         }
         bool srcHasYcbcr = image->ycbcrConversionInfo().isValid();
-        static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
-        if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, kOrigin, false,
-                                          surface->config(), srcSampleCount, kOrigin,
+        if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, false, false,
+                                          surface->config(), srcSampleCount, image->isLinearTiled(),
                                           srcHasYcbcr) &&
             !this->vkCaps().canCopyAsDraw(copySurface->config(), false, false,
                                           surface->config(), SkToBool(surface->asTexture()),
@@ -2302,6 +2312,7 @@
             return false;
         }
         SkIRect srcRect = SkIRect::MakeXYWH(left, top, width, height);
+        static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
         if (!this->copySurface(copySurface.get(), kOrigin, surface, kOrigin,
                                srcRect, SkIPoint::Make(0,0))) {
             return false;
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index 6738bc9..3d32b16 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -71,8 +71,6 @@
             *format = VK_FORMAT_R32G32_SFLOAT;
             return true;
         case kRGBA_half_GrPixelConfig:
-            *format = VK_FORMAT_R16G16B16A16_SFLOAT;
-            return true;
         case kRGBA_half_Clamped_GrPixelConfig:
             *format = VK_FORMAT_R16G16B16A16_SFLOAT;
             return true;