Add backend safe classes for passing in external texture and render targets into gpu

This CL adds the GrBackend* classes as well as just updates the API for SkSurface and
SkImage. The implementation on SkSurface/Image and the plumbing down into Ganesh will
be in an additional CL.

Besides the change to use the type safe classes, we also pull the SurfaceFlags, origin,
samples, out of the descriptor and pass those in directly.

Bug: skia:
Change-Id: I9702981fe26c3d5d7d2cbcf6977ba569d356d854
Reviewed-on: https://skia-review.googlesource.com/13122
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrBackendSurface.cpp b/src/gpu/GrBackendSurface.cpp
new file mode 100644
index 0000000..9bf85cb
--- /dev/null
+++ b/src/gpu/GrBackendSurface.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrBackendSurface.h"
+
+#ifdef SK_VULKAN
+#include "vk/GrVkTypes.h"
+#include "vk/GrVkUtil.h"
+GrBackendTexture::GrBackendTexture(int width,
+                                   int height,
+                                   GrVkImageInfo* vkInfo)
+        : fWidth(width)
+        , fHeight(height)
+        , fConfig(GrVkFormatToPixelConfig(vkInfo->fFormat))
+        , fBackend(kVulkan_GrBackend)
+        , fVkInfo(vkInfo) {}
+#endif // SK_VULKAN
+
+GrBackendTexture::GrBackendTexture(int width,
+                                   int height,
+                                   GrPixelConfig config,
+                                   GrGLTextureInfo* glInfo)
+        : fWidth(width)
+        , fHeight(height)
+        , fConfig(config)
+        , fBackend(kOpenGL_GrBackend)
+        , fGLInfo(glInfo) {}
+
+GrBackendTexture::GrBackendTexture(const GrBackendTextureDesc& desc, GrBackend backend)
+        : fWidth(desc.fWidth)
+        , fHeight(desc.fHeight)
+        , fConfig(kVulkan_GrBackend == backend
+#ifdef SK_VULKAN
+                  ? GrVkFormatToPixelConfig(((GrVkImageInfo*)desc.fTextureHandle)->fFormat)
+#else
+                  ? kUnknown_GrPixelConfig
+#endif
+                  : desc.fConfig)
+        , fBackend(backend)
+        , fHandle(desc.fTextureHandle) {}
+
+GrVkImageInfo* GrBackendTexture::getVkImageInfo() {
+    if (kVulkan_GrBackend == fBackend) {
+        return fVkInfo;
+    }
+    return nullptr;
+}
+
+GrGLTextureInfo* GrBackendTexture::getGLTextureInfo() {
+    if (kOpenGL_GrBackend == fBackend) {
+        return fGLInfo;
+    }
+    return nullptr;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef SK_VULKAN
+GrBackendRenderTarget::GrBackendRenderTarget(int width,
+                                             int height,
+                                             int sampleCnt,
+                                             int stencilBits,
+                                             GrVkImageInfo* vkInfo)
+        : fWidth(width)
+        , fHeight(height)
+        , fSampleCnt(sampleCnt)
+        , fStencilBits(stencilBits)
+        , fConfig(GrVkFormatToPixelConfig(vkInfo->fFormat))
+        , fBackend(kVulkan_GrBackend)
+        , fVkInfo(vkInfo) {}
+#endif // SK_VULKAN
+
+GrBackendRenderTarget::GrBackendRenderTarget(int width,
+                                             int height,
+                                             int sampleCnt,
+                                             int stencilBits,
+                                             GrPixelConfig config,
+                                             GrGLTextureInfo* glInfo)
+        : fWidth(width)
+        , fHeight(height)
+        , fSampleCnt(sampleCnt)
+        , fStencilBits(stencilBits)
+        , fConfig(config)
+        , fBackend(kOpenGL_GrBackend)
+        , fGLInfo(glInfo) {}
+
+GrBackendRenderTarget::GrBackendRenderTarget(const GrBackendRenderTargetDesc& desc,
+                                             GrBackend backend)
+        : fWidth(desc.fWidth)
+        , fHeight(desc.fHeight)
+        , fSampleCnt(desc.fSampleCnt)
+        , fStencilBits(desc.fStencilBits)
+        , fConfig(kVulkan_GrBackend == backend
+#ifdef SK_VULKAN
+                  ? GrVkFormatToPixelConfig(((GrVkImageInfo*)desc.fRenderTargetHandle)->fFormat)
+#else
+                  ? kUnknown_GrPixelConfig
+#endif
+                  : desc.fConfig)
+        , fBackend(backend)
+        , fHandle(desc.fRenderTargetHandle) {}
+
+GrVkImageInfo* GrBackendRenderTarget::getVkImageInfo() {
+    if (kVulkan_GrBackend == fBackend) {
+        return fVkInfo;
+    }
+    return nullptr;
+}
+
+GrGLTextureInfo* GrBackendRenderTarget::getGLTextureInfo() {
+    if (kOpenGL_GrBackend == fBackend) {
+        return fGLInfo;
+    }
+    return nullptr;
+}
+
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index c9f5903..a483ccb 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -948,7 +948,7 @@
     }
 
     // setup memory barrier
-    SkASSERT(GrVkFormatToPixelConfig(tex->imageFormat(), nullptr));
+    SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(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 c3302a2..b3c103a 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(GrVkFormatToPixelConfig(format, nullptr));
+            SkASSERT(kUnknown_GrPixelConfig != GrVkFormatToPixelConfig(format));
             return VK_IMAGE_ASPECT_COLOR_BIT;
     }
 }
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index 1fdf69c..ec71fb0 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -69,58 +69,40 @@
     return false;
 }
 
-bool GrVkFormatToPixelConfig(VkFormat format, GrPixelConfig* config) {
-    GrPixelConfig dontCare;
-    if (!config) {
-        config = &dontCare;
-    }
-
+GrPixelConfig GrVkFormatToPixelConfig(VkFormat format) {
     switch (format) {
         case VK_FORMAT_R8G8B8A8_UNORM:
-            *config = kRGBA_8888_GrPixelConfig;
-            break;
+            return kRGBA_8888_GrPixelConfig;
         case VK_FORMAT_B8G8R8A8_UNORM:
-            *config = kBGRA_8888_GrPixelConfig;
-            break;
+            return kBGRA_8888_GrPixelConfig;
         case VK_FORMAT_R8G8B8A8_SRGB:
-            *config = kSRGBA_8888_GrPixelConfig;
-            break;
+            return kSRGBA_8888_GrPixelConfig;
         case VK_FORMAT_B8G8R8A8_SRGB:
-            *config = kSBGRA_8888_GrPixelConfig;
-            break;
+            return kSBGRA_8888_GrPixelConfig;
         case VK_FORMAT_R8G8B8A8_SINT:
-            *config = kRGBA_8888_sint_GrPixelConfig;
-            break;
+            return kRGBA_8888_sint_GrPixelConfig;
         case VK_FORMAT_R5G6B5_UNORM_PACK16:
-            *config = kRGB_565_GrPixelConfig;
+            return kRGB_565_GrPixelConfig;
             break;
         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
             // R4G4B4A4 is not required to be supported so we actually
             // store RGBA_4444 data as B4G4R4A4.
-            *config = kRGBA_4444_GrPixelConfig;
-            break;
+            return kRGBA_4444_GrPixelConfig;
         case VK_FORMAT_R8_UNORM:
-            *config = kAlpha_8_GrPixelConfig;
-            break;
+            return kAlpha_8_GrPixelConfig;
         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
-            *config = kETC1_GrPixelConfig;      // this conversion seems a bit sketchy
-            break;
+            return kETC1_GrPixelConfig;      // this conversion seems a bit sketchy
         case VK_FORMAT_R32G32B32A32_SFLOAT:
-            *config = kRGBA_float_GrPixelConfig;
-            break;
+            return kRGBA_float_GrPixelConfig;
         case VK_FORMAT_R32G32_SFLOAT:
-            *config = kRG_float_GrPixelConfig;
-            break;
+            return kRG_float_GrPixelConfig;
         case VK_FORMAT_R16G16B16A16_SFLOAT:
-            *config = kRGBA_half_GrPixelConfig;
-            break;
+            return kRGBA_half_GrPixelConfig;
         case VK_FORMAT_R16_SFLOAT:
-            *config = kAlpha_half_GrPixelConfig;
-            break;
+            return kAlpha_half_GrPixelConfig;
         default:
-            return false;
+            return kUnknown_GrPixelConfig;
     }
-    return true;
 }
 
 bool GrVkFormatIsSRGB(VkFormat format, VkFormat* linearFormat) {
diff --git a/src/gpu/vk/GrVkUtil.h b/src/gpu/vk/GrVkUtil.h
index ba07bca..72ed483 100644
--- a/src/gpu/vk/GrVkUtil.h
+++ b/src/gpu/vk/GrVkUtil.h
@@ -35,7 +35,7 @@
 /**
 * Returns the GrPixelConfig for the given vulkan texture format
 */
-bool GrVkFormatToPixelConfig(VkFormat format, GrPixelConfig* config);
+GrPixelConfig GrVkFormatToPixelConfig(VkFormat format);
 
 /**
  * Returns true if the given vulkan texture format is sRGB encoded.