| Index: tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp
|
| diff --git a/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp b/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ddfc8e3068d39583c86ea76dc39e1c57c3662fa4
|
| --- /dev/null
|
| +++ b/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp
|
| @@ -0,0 +1,74 @@
|
| +
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "../VulkanWindowContext.h"
|
| +#include "Window_unix.h"
|
| +
|
| +#include "vk/GrVkInterface.h"
|
| +#include "vk/GrVkUtil.h"
|
| +
|
| +#include <X11/Xlib-xcb.h>
|
| +
|
| +namespace sk_app {
|
| +
|
| +// Platform dependant call
|
| +VkSurfaceKHR VulkanWindowContext::createVkSurface(VkInstance instance, void* platformData) {
|
| + static PFN_vkCreateXcbSurfaceKHR createXcbSurfaceKHR = nullptr;
|
| + if (!createXcbSurfaceKHR) {
|
| + createXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR) vkGetInstanceProcAddr(instance,
|
| + "vkCreateXcbSurfaceKHR");
|
| + }
|
| +
|
| + if (!platformData) {
|
| + return VK_NULL_HANDLE;
|
| + }
|
| + ContextPlatformData_unix* unixPlatformData =
|
| + reinterpret_cast<ContextPlatformData_unix*>(platformData);
|
| +
|
| +
|
| + VkSurfaceKHR surface;
|
| +
|
| + VkXcbSurfaceCreateInfoKHR surfaceCreateInfo;
|
| + memset(&surfaceCreateInfo, 0, sizeof(VkXcbSurfaceCreateInfoKHR));
|
| + surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
|
| + surfaceCreateInfo.pNext = nullptr;
|
| + surfaceCreateInfo.flags = 0;
|
| + surfaceCreateInfo.connection = XGetXCBConnection(unixPlatformData->fDisplay);
|
| + surfaceCreateInfo.window = unixPlatformData->fHWnd;
|
| +
|
| + VkResult res = createXcbSurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface);
|
| + if (VK_SUCCESS != res) {
|
| + return VK_NULL_HANDLE;
|
| + }
|
| +
|
| + return surface;
|
| +}
|
| +
|
| +// Platform dependant call
|
| +bool VulkanWindowContext::canPresent(VkInstance instance, VkPhysicalDevice physDev,
|
| + uint32_t queueFamilyIndex, void* platformData) {
|
| + static PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR
|
| + getPhysicalDeviceXcbPresentationSupportKHR = nullptr;
|
| + if (!getPhysicalDeviceXcbPresentationSupportKHR) {
|
| + getPhysicalDeviceXcbPresentationSupportKHR =
|
| + (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR) vkGetInstanceProcAddr(instance,
|
| + "vkGetPhysicalDeviceXcbPresentationSupportKHR");
|
| + }
|
| +
|
| + ContextPlatformData_unix* unixPlatformData =
|
| + reinterpret_cast<ContextPlatformData_unix*>(platformData);
|
| +
|
| + Display* display = unixPlatformData->fDisplay;
|
| + VkBool32 check = getPhysicalDeviceXcbPresentationSupportKHR(physDev,
|
| + queueFamilyIndex,
|
| + XGetXCBConnection(display),
|
| + unixPlatformData->fVisualID);
|
| + return (VK_FALSE != check);
|
| +}
|
| +
|
| +} // namespace sk_app
|
|
|