1 2 /* 3 * Copyright 2016 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include <Windows.h> 10 #include "WindowContextFactory_win.h" 11 12 #include "../VulkanWindowContext.h" 13 #include "Window_win.h" 14 15 #include "vk/GrVkInterface.h" 16 #include "vk/GrVkUtil.h" 17 18 #include "vk/VkTestUtils.h" 19 20 namespace sk_app { 21 namespace window_context_factory { 22 23 WindowContext* NewVulkanForWin(HWND hwnd, const DisplayParams& params) { 24 PFN_vkGetInstanceProcAddr instProc; 25 PFN_vkGetDeviceProcAddr devProc; 26 if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc, &devProc)) { 27 return nullptr; 28 } 29 30 auto createVkSurface = [hwnd, instProc] (VkInstance instance) -> VkSurfaceKHR { 31 static PFN_vkCreateWin32SurfaceKHR createWin32SurfaceKHR = nullptr; 32 if (!createWin32SurfaceKHR) { 33 createWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR) 34 instProc(instance, "vkCreateWin32SurfaceKHR"); 35 } 36 HINSTANCE hinstance = GetModuleHandle(0); 37 VkSurfaceKHR surface; 38 39 VkWin32SurfaceCreateInfoKHR surfaceCreateInfo; 40 memset(&surfaceCreateInfo, 0, sizeof(VkWin32SurfaceCreateInfoKHR)); 41 surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 42 surfaceCreateInfo.pNext = nullptr; 43 surfaceCreateInfo.flags = 0; 44 surfaceCreateInfo.hinstance = hinstance; 45 surfaceCreateInfo.hwnd = hwnd; 46 47 VkResult res = createWin32SurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface); 48 if (VK_SUCCESS != res) { 49 return VK_NULL_HANDLE; 50 } 51 52 return surface; 53 }; 54 55 auto canPresent = [instProc] (VkInstance instance, VkPhysicalDevice physDev, 56 uint32_t queueFamilyIndex) { 57 static PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR 58 getPhysicalDeviceWin32PresentationSupportKHR = nullptr; 59 if (!getPhysicalDeviceWin32PresentationSupportKHR) { 60 getPhysicalDeviceWin32PresentationSupportKHR = 61 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR) 62 instProc(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); 63 } 64 65 VkBool32 check = getPhysicalDeviceWin32PresentationSupportKHR(physDev, queueFamilyIndex); 66 return (VK_FALSE != check); 67 }; 68 69 WindowContext* ctx = new VulkanWindowContext(params, createVkSurface, canPresent, 70 instProc, devProc); 71 if (!ctx->isValid()) { 72 delete ctx; 73 return nullptr; 74 } 75 return ctx; 76 } 77 78 } // namespace window_context_factory 79 } // namespace sk_app 80