Revise WSI setup.

- Set up present queue creation correctly.
- Move WSI functions to VulkanTestContext.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1899213002

Review URL: https://codereview.chromium.org/1899213002
diff --git a/tools/vulkan/VulkanTestContext.h b/tools/vulkan/VulkanTestContext.h
index 66171af..5ef288b 100644
--- a/tools/vulkan/VulkanTestContext.h
+++ b/tools/vulkan/VulkanTestContext.h
@@ -21,8 +21,8 @@
     ~VulkanTestContext();
 
     // each platform will have to implement these in its CPP file
-    VkSurfaceKHR createVkSurface(void* platformData);
-    bool canPresent(uint32_t queueFamilyIndex);
+    static VkSurfaceKHR createVkSurface(VkInstance, void* platformData);
+    static bool canPresent(VkInstance, VkPhysicalDevice, uint32_t queueFamilyIndex);
 
     static VulkanTestContext* Create(void* platformData, int msaaSampleCount) {
         VulkanTestContext* ctx = new VulkanTestContext(platformData, msaaSampleCount);
@@ -69,6 +69,30 @@
 
     SkAutoTUnref<const GrVkBackendContext> fBackendContext;
 
+    // simple wrapper class that exists only to initialize a pointer to NULL
+    template <typename FNPTR_TYPE> class VkPtr {
+    public:
+        VkPtr() : fPtr(NULL) {}
+        VkPtr operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
+        operator FNPTR_TYPE() const { return fPtr; }
+    private:
+        FNPTR_TYPE fPtr;
+    };
+    
+    // WSI interface functions
+    VkPtr<PFN_vkDestroySurfaceKHR> fDestroySurfaceKHR;
+    VkPtr<PFN_vkGetPhysicalDeviceSurfaceSupportKHR> fGetPhysicalDeviceSurfaceSupportKHR;
+    VkPtr<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR> fGetPhysicalDeviceSurfaceCapabilitiesKHR;
+    VkPtr<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR> fGetPhysicalDeviceSurfaceFormatsKHR;
+    VkPtr<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR> fGetPhysicalDeviceSurfacePresentModesKHR;
+
+    VkPtr<PFN_vkCreateSwapchainKHR> fCreateSwapchainKHR;
+    VkPtr<PFN_vkDestroySwapchainKHR> fDestroySwapchainKHR;
+    VkPtr<PFN_vkGetSwapchainImagesKHR> fGetSwapchainImagesKHR;
+    VkPtr<PFN_vkAcquireNextImageKHR> fAcquireNextImageKHR;
+    VkPtr<PFN_vkQueuePresentKHR> fQueuePresentKHR;
+    VkPtr<PFN_vkCreateSharedSwapchainsKHR> fCreateSharedSwapchainsKHR;
+
     GrContext*        fContext;
     VkSurfaceKHR      fSurface;
     VkSwapchainKHR    fSwapchain;