OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2016 Google Inc. | 3 * Copyright 2016 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "../VulkanWindowContext.h" | |
10 #include "Window_unix.h" | |
11 | 9 |
12 #include "vk/GrVkInterface.h" | 10 #include "vk/GrVkInterface.h" |
13 #include "vk/GrVkUtil.h" | 11 #include "vk/GrVkUtil.h" |
14 | 12 |
15 #include <X11/Xlib-xcb.h> | 13 #include <X11/Xlib-xcb.h> |
16 | 14 |
| 15 #include "WindowContextFactory_unix.h" |
| 16 #include "../VulkanWindowContext.h" |
| 17 |
17 namespace sk_app { | 18 namespace sk_app { |
18 | 19 |
19 // Platform dependant call | 20 namespace window_context_factory { |
20 VkSurfaceKHR VulkanWindowContext::createVkSurface(VkInstance instance, void* pla
tformData) { | |
21 static PFN_vkCreateXcbSurfaceKHR createXcbSurfaceKHR = nullptr; | |
22 if (!createXcbSurfaceKHR) { | |
23 createXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR) vkGetInstanceProcAddr(
instance, | |
24 "vkCreat
eXcbSurfaceKHR"); | |
25 } | |
26 | 21 |
27 if (!platformData) { | 22 WindowContext* NewVulkanForXlib(const XlibWindowInfo& info, const DisplayParams&
displayParams) { |
28 return VK_NULL_HANDLE; | 23 auto createVkSurface = [&info](VkInstance instance) -> VkSurfaceKHR { |
29 } | 24 static PFN_vkCreateXcbSurfaceKHR createXcbSurfaceKHR = nullptr; |
30 ContextPlatformData_unix* unixPlatformData = | 25 if (!createXcbSurfaceKHR) { |
31 reinterpret_cast<ContextPlatformData_u
nix*>(platformData); | 26 createXcbSurfaceKHR = |
| 27 (PFN_vkCreateXcbSurfaceKHR) vkGetInstanceProcAddr(instance, |
| 28 "vkCreateX
cbSurfaceKHR"); |
| 29 } |
| 30 |
| 31 VkSurfaceKHR surface; |
| 32 |
| 33 VkXcbSurfaceCreateInfoKHR surfaceCreateInfo; |
| 34 memset(&surfaceCreateInfo, 0, sizeof(VkXcbSurfaceCreateInfoKHR)); |
| 35 surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; |
| 36 surfaceCreateInfo.pNext = nullptr; |
| 37 surfaceCreateInfo.flags = 0; |
| 38 surfaceCreateInfo.connection = XGetXCBConnection(info.fDisplay); |
| 39 surfaceCreateInfo.window = info.fWindow; |
| 40 |
| 41 VkResult res = createXcbSurfaceKHR(instance, &surfaceCreateInfo, nullptr
, &surface); |
| 42 if (VK_SUCCESS != res) { |
| 43 return VK_NULL_HANDLE; |
| 44 } |
| 45 |
| 46 return surface; |
| 47 }; |
| 48 |
| 49 auto canPresent = [&info](VkInstance instance, VkPhysicalDevice physDev, |
| 50 uint32_t queueFamilyIndex) { |
| 51 static PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR |
| 52 getPhysicalDeviceXcbPresentation
SupportKHR = nullptr; |
| 53 if (!getPhysicalDeviceXcbPresentationSupportKHR) { |
| 54 getPhysicalDeviceXcbPresentationSupportKHR = |
| 55 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR) |
| 56 vkGetInstanceProcAddr(instance, |
| 57 "vkGetPhysicalDeviceXcbPresentatio
nSupportKHR"); |
| 58 } |
32 | 59 |
33 | 60 |
34 VkSurfaceKHR surface; | 61 Display* display = info.fDisplay; |
35 | 62 VisualID visualID = info.fVisualInfo->visualid; |
36 VkXcbSurfaceCreateInfoKHR surfaceCreateInfo; | 63 VkBool32 check = getPhysicalDeviceXcbPresentationSupportKHR(physDev, |
37 memset(&surfaceCreateInfo, 0, sizeof(VkXcbSurfaceCreateInfoKHR)); | 64 queueFamilyI
ndex, |
38 surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; | 65 XGetXCBConne
ction(display), |
39 surfaceCreateInfo.pNext = nullptr; | 66 visualID); |
40 surfaceCreateInfo.flags = 0; | 67 return (VK_FALSE != check); |
41 surfaceCreateInfo.connection = XGetXCBConnection(unixPlatformData->fDisplay)
; | 68 }; |
42 surfaceCreateInfo.window = unixPlatformData->fWindow; | 69 WindowContext* context = new VulkanWindowContext(displayParams, createVkSurf
ace, canPresent); |
43 | 70 if (!context->isValid()) { |
44 VkResult res = createXcbSurfaceKHR(instance, &surfaceCreateInfo, nullptr, &s
urface); | 71 delete context; |
45 if (VK_SUCCESS != res) { | 72 return nullptr; |
46 return VK_NULL_HANDLE; | |
47 } | 73 } |
48 | 74 return context; |
49 return surface; | |
50 } | 75 } |
51 | 76 |
52 // Platform dependant call | 77 } // namespace VulkanWindowContextFactory |
53 bool VulkanWindowContext::canPresent(VkInstance instance, VkPhysicalDevice physD
ev, | |
54 uint32_t queueFamilyIndex, void* platformDa
ta) { | |
55 static PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR | |
56 getPhysicalDeviceXcbPresentationSupp
ortKHR = nullptr; | |
57 if (!getPhysicalDeviceXcbPresentationSupportKHR) { | |
58 getPhysicalDeviceXcbPresentationSupportKHR = | |
59 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR) vkGetInstanceProc
Addr(instance, | |
60 "vkGetPhysicalDeviceXcbPresenta
tionSupportKHR"); | |
61 } | |
62 | 78 |
63 ContextPlatformData_unix* unixPlatformData = | 79 } // namespace sk_app |
64 reinterpret_cast<ContextPlatformData_u
nix*>(platformData); | |
65 | |
66 Display* display = unixPlatformData->fDisplay; | |
67 VisualID visualID = unixPlatformData->fVisualInfo->visualid; | |
68 VkBool32 check = getPhysicalDeviceXcbPresentationSupportKHR(physDev, | |
69 queueFamilyIndex
, | |
70 XGetXCBConnectio
n(display), | |
71 visualID); | |
72 return (VK_FALSE != check); | |
73 } | |
74 | |
75 } // namespace sk_app | |
OLD | NEW |