Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Side by Side Diff: tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp

Issue 2169543002: Use Windowing system-specific WindowContext factories. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: more xlib Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW
« no previous file with comments | « tools/viewer/sk_app/unix/GLWindowContext_unix.cpp ('k') | tools/viewer/sk_app/unix/WindowContextFactory_unix.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698