• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "tools/window/win/WindowContextFactory_win.h"
10 
11 #include "tools/sk_app/win/Window_win.h"
12 #include "tools/window/VulkanWindowContext.h"
13 
14 #include "src/gpu/ganesh/vk/GrVkUtil.h"
15 
16 #include "tools/gpu/vk/VkTestUtils.h"
17 
18 #include <Windows.h>
19 
20 namespace skwindow {
21 
MakeVulkanForWin(HWND hwnd,const DisplayParams & params)22 std::unique_ptr<WindowContext> MakeVulkanForWin(HWND hwnd, const DisplayParams& params) {
23     PFN_vkGetInstanceProcAddr instProc;
24     if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc)) {
25         return nullptr;
26     }
27 
28     auto createVkSurface = [hwnd, instProc] (VkInstance instance) -> VkSurfaceKHR {
29         static PFN_vkCreateWin32SurfaceKHR createWin32SurfaceKHR = nullptr;
30         if (!createWin32SurfaceKHR) {
31             createWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)
32                 instProc(instance, "vkCreateWin32SurfaceKHR");
33         }
34         HINSTANCE hinstance = GetModuleHandle(0);
35         VkSurfaceKHR surface;
36 
37         VkWin32SurfaceCreateInfoKHR surfaceCreateInfo;
38         memset(&surfaceCreateInfo, 0, sizeof(VkWin32SurfaceCreateInfoKHR));
39         surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
40         surfaceCreateInfo.pNext = nullptr;
41         surfaceCreateInfo.flags = 0;
42         surfaceCreateInfo.hinstance = hinstance;
43         surfaceCreateInfo.hwnd = hwnd;
44 
45         VkResult res = createWin32SurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface);
46         if (VK_SUCCESS != res) {
47             return VK_NULL_HANDLE;
48         }
49 
50         return surface;
51     };
52 
53     auto canPresent = [instProc] (VkInstance instance, VkPhysicalDevice physDev,
54                                   uint32_t queueFamilyIndex) {
55         static PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR
56                                             getPhysicalDeviceWin32PresentationSupportKHR = nullptr;
57         if (!getPhysicalDeviceWin32PresentationSupportKHR) {
58             getPhysicalDeviceWin32PresentationSupportKHR =
59                 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)
60                     instProc(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
61         }
62 
63         VkBool32 check = getPhysicalDeviceWin32PresentationSupportKHR(physDev, queueFamilyIndex);
64         return (VK_FALSE != check);
65     };
66 
67     std::unique_ptr<WindowContext> ctx(
68             new internal::VulkanWindowContext(params, createVkSurface, canPresent, instProc));
69     if (!ctx->isValid()) {
70         return nullptr;
71     }
72     return ctx;
73 }
74 
75 }  // namespace skwindow
76