Add new GrVkBackendContext::Create explicitly requiring vk proc getters

Also remove the feature of GrVkGpu that creates the instance/device if the client doesn't provide one.

Change-Id: Ie617313b6c684ed355333a475b80d0aae7e3a026
Reviewed-on: https://skia-review.googlesource.com/14261
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/include/gpu/vk/GrVkBackendContext.h b/include/gpu/vk/GrVkBackendContext.h
index 5ae7b31..5838caa 100644
--- a/include/gpu/vk/GrVkBackendContext.h
+++ b/include/gpu/vk/GrVkBackendContext.h
@@ -58,6 +58,20 @@
                                             CanPresentFn = CanPresentFn(),
                                             GrVkInterface::GetProc getProc = nullptr);
 
+    static const GrVkBackendContext* Create(const GrVkInterface::GetInstanceProc& getInstanceProc,
+                                            const GrVkInterface::GetDeviceProc& getDeviceProc,
+                                            uint32_t* presentQueueIndex = nullptr,
+                                            CanPresentFn canPresent = CanPresentFn()) {
+        auto getProc = [&getInstanceProc, &getDeviceProc](const char* proc_name,
+                                                          VkInstance instance, VkDevice device) {
+            if (device != VK_NULL_HANDLE) {
+                return getDeviceProc(device, proc_name);
+            }
+            return getInstanceProc(instance, proc_name);
+        };
+        return Create(presentQueueIndex, canPresent, getProc);
+    }
+
     ~GrVkBackendContext() override;
 };
 
diff --git a/include/gpu/vk/GrVkInterface.h b/include/gpu/vk/GrVkInterface.h
index dca47ff..1a381bd 100644
--- a/include/gpu/vk/GrVkInterface.h
+++ b/include/gpu/vk/GrVkInterface.h
@@ -40,6 +40,13 @@
         VkInstance,  // instance or VK_NULL_HANDLE
         VkDevice     // device or VK_NULL_HANDLE
         )>;
+
+    // This is typically vkGetInstanceProcAddr.
+    using GetInstanceProc = std::function<PFN_vkVoidFunction(VkInstance, const char*)>;
+
+    // This is typically vkGetDeviceProcAddr.
+    using GetDeviceProc = std::function<PFN_vkVoidFunction(VkDevice, const char*)>;
+
     GrVkInterface(GetProc getProc,
                   VkInstance instance,
                   VkDevice device,
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 3d30e35..d8f1037 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -77,10 +77,7 @@
     const GrVkBackendContext* vkBackendContext =
         reinterpret_cast<const GrVkBackendContext*>(backendContext);
     if (!vkBackendContext) {
-        vkBackendContext = GrVkBackendContext::Create();
-        if (!vkBackendContext) {
-            return nullptr;
-        }
+        return nullptr;
     } else {
         vkBackendContext->ref();
     }
diff --git a/tools/gpu/vk/VkTestContext.cpp b/tools/gpu/vk/VkTestContext.cpp
index b1e7ad4..3e76d87 100644
--- a/tools/gpu/vk/VkTestContext.cpp
+++ b/tools/gpu/vk/VkTestContext.cpp
@@ -109,7 +109,8 @@
 class VkTestContextImpl : public sk_gpu_test::VkTestContext {
 public:
     static VkTestContext* Create() {
-        sk_sp<const GrVkBackendContext> backendContext(GrVkBackendContext::Create());
+        sk_sp<const GrVkBackendContext> backendContext(
+                GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr));
         if (!backendContext) {
             return nullptr;
         }
diff --git a/tools/viewer/sk_app/VulkanWindowContext.cpp b/tools/viewer/sk_app/VulkanWindowContext.cpp
index 831c7ae..f483c27 100644
--- a/tools/viewer/sk_app/VulkanWindowContext.cpp
+++ b/tools/viewer/sk_app/VulkanWindowContext.cpp
@@ -41,7 +41,8 @@
     , fBackbuffers(nullptr) {
 
     // any config code here (particularly for msaa)?
-    fBackendContext.reset(GrVkBackendContext::Create(&fPresentQueueIndex, canPresent));
+    fBackendContext.reset(GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr,
+                                                     &fPresentQueueIndex, canPresent));
 
     if (!(fBackendContext->fExtensions & kKHR_surface_GrVkExtensionFlag) ||
         !(fBackendContext->fExtensions & kKHR_swapchain_GrVkExtensionFlag)) {