| 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 |