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