Implement Vulkan GrBackendObject for textures.

BUG=skia:5043
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1808263002

Review URL: https://codereview.chromium.org/1808263002
diff --git a/tests/VkWrapTests.cpp b/tests/VkWrapTests.cpp
new file mode 100755
index 0000000..fe954fa
--- /dev/null
+++ b/tests/VkWrapTests.cpp
@@ -0,0 +1,179 @@
+
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+// This is a GPU-backend specific test. It relies on static intializers to work
+
+#include "SkTypes.h"
+
+#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_VULKAN)
+
+#include "GrContextFactory.h"
+#include "GrTest.h"
+#include "Test.h"
+#include "vk/GrVkCaps.h"
+#include "vk/GrVkGpu.h"
+#include "vk/GrVkMemory.h"
+#include "vk/GrVkTypes.h"
+
+const int kW = 1024;
+const int kH = 1024;
+const GrPixelConfig kPixelConfig = kRGBA_8888_GrPixelConfig;
+
+void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) {
+
+    GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
+
+    GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig);
+    const GrVkTextureInfo* backendTex = reinterpret_cast<const GrVkTextureInfo*>(backendObj);
+
+    // check basic borrowed creation
+    GrBackendTextureDesc desc;
+    desc.fConfig = kPixelConfig;
+    desc.fWidth = kW;
+    desc.fHeight = kH;
+    desc.fTextureHandle = backendObj;
+    GrTexture* tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, tex);
+    tex->unref();
+
+    // image is null
+    GrVkTextureInfo backendCopy = *backendTex;
+    backendCopy.fImage = VK_NULL_HANDLE;
+    desc.fTextureHandle = (GrBackendObject) &backendCopy;
+    tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+
+    // alloc is null
+    backendCopy.fImage = backendTex->fImage;
+    backendCopy.fAlloc = VK_NULL_HANDLE;
+    tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+
+    // check adopt creation
+    backendCopy.fAlloc = backendTex->fAlloc;
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, tex);
+    tex->unref();
+
+    gpu->deleteTestingOnlyBackendTexture(backendObj, true);
+}
+
+void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
+    GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
+
+    GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig);
+    const GrVkTextureInfo* backendTex = reinterpret_cast<const GrVkTextureInfo*>(backendObj);
+
+    // check basic borrowed creation
+    GrBackendRenderTargetDesc desc;
+    desc.fWidth = kW;
+    desc.fHeight = kH;
+    desc.fConfig = kPixelConfig;
+    desc.fOrigin = kTopLeft_GrSurfaceOrigin;
+    desc.fSampleCnt = 0;
+    desc.fStencilBits = 0;
+    desc.fRenderTargetHandle = backendObj;
+    GrRenderTarget* rt = gpu->wrapBackendRenderTarget(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, rt);
+    rt->unref();
+
+    // image is null
+    GrVkTextureInfo backendCopy = *backendTex;
+    backendCopy.fImage = VK_NULL_HANDLE;
+    desc.fRenderTargetHandle = (GrBackendObject)&backendCopy;
+    rt = gpu->wrapBackendRenderTarget(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !rt);
+    rt = gpu->wrapBackendRenderTarget(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !rt);
+
+    // alloc is null
+    backendCopy.fImage = backendTex->fImage;
+    backendCopy.fAlloc = VK_NULL_HANDLE;
+    // can wrap null alloc if borrowing
+    rt = gpu->wrapBackendRenderTarget(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, rt);
+    // but not if adopting
+    rt = gpu->wrapBackendRenderTarget(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !rt);
+
+    // check adopt creation
+    backendCopy.fAlloc = backendTex->fAlloc;
+    rt = gpu->wrapBackendRenderTarget(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, rt);
+    rt->unref();
+
+    gpu->deleteTestingOnlyBackendTexture(backendObj, true);
+}
+
+void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
+    GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
+
+    GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig);
+    const GrVkTextureInfo* backendTex = reinterpret_cast<const GrVkTextureInfo*>(backendObj);
+
+    // check basic borrowed creation
+    GrBackendTextureDesc desc;
+    desc.fFlags = kRenderTarget_GrBackendTextureFlag;
+    desc.fConfig = kPixelConfig;
+    desc.fWidth = kW;
+    desc.fHeight = kH;
+    desc.fTextureHandle = backendObj;
+    GrTexture* tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, tex);
+    tex->unref();
+
+    // image is null
+    GrVkTextureInfo backendCopy = *backendTex;
+    backendCopy.fImage = VK_NULL_HANDLE;
+    desc.fTextureHandle = (GrBackendObject)&backendCopy;
+    tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+
+    // alloc is null
+    backendCopy.fImage = backendTex->fImage;
+    backendCopy.fAlloc = VK_NULL_HANDLE;
+    tex = gpu->wrapBackendTexture(desc, kBorrow_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, !tex);
+
+    // check adopt creation
+    backendCopy.fAlloc = backendTex->fAlloc;
+    tex = gpu->wrapBackendTexture(desc, kAdopt_GrWrapOwnership);
+    REPORTER_ASSERT(reporter, tex);
+    tex->unref();
+
+    gpu->deleteTestingOnlyBackendTexture(backendObj, true);
+}
+
+DEF_GPUTEST(VkWrapTests, reporter, factory) {
+    GrContextOptions opts;
+    opts.fSuppressPrints = true;
+    GrContextFactory debugFactory(opts);
+    for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) {
+        if (static_cast<GrContextFactory::GLContextType>(type) !=
+            GrContextFactory::kNative_GLContextType) {
+            continue;
+        }
+        GrContext* context = debugFactory.get(static_cast<GrContextFactory::GLContextType>(type));
+        if (context) {
+            wrap_tex_test(reporter, context);
+            wrap_rt_test(reporter, context);
+            wrap_trt_test(reporter, context);
+        }
+
+    }
+}
+
+#endif