| 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
|
| index 02bf516b22fd63e3e621b982c00c54a024d9b91c..b94e8edc2090539c84dcbed84242d9558e809d71 100644
|
| --- a/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp
|
| +++ b/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp
|
| @@ -6,70 +6,74 @@
|
| * 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;
|
| +#include "WindowContextFactory_unix.h"
|
| +#include "../VulkanWindowContext.h"
|
|
|
| - 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->fWindow;
|
| +namespace sk_app {
|
|
|
| - VkResult res = createXcbSurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface);
|
| - if (VK_SUCCESS != res) {
|
| - return VK_NULL_HANDLE;
|
| +namespace window_context_factory {
|
| +
|
| +WindowContext* NewVulkanForXlib(const XlibWindowInfo& info, const DisplayParams& displayParams) {
|
| + auto createVkSurface = [&info](VkInstance instance) -> VkSurfaceKHR {
|
| + static PFN_vkCreateXcbSurfaceKHR createXcbSurfaceKHR = nullptr;
|
| + if (!createXcbSurfaceKHR) {
|
| + createXcbSurfaceKHR =
|
| + (PFN_vkCreateXcbSurfaceKHR) vkGetInstanceProcAddr(instance,
|
| + "vkCreateXcbSurfaceKHR");
|
| + }
|
| +
|
| + 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(info.fDisplay);
|
| + surfaceCreateInfo.window = info.fWindow;
|
| +
|
| + VkResult res = createXcbSurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface);
|
| + if (VK_SUCCESS != res) {
|
| + return VK_NULL_HANDLE;
|
| + }
|
| +
|
| + return surface;
|
| + };
|
| +
|
| + auto canPresent = [&info](VkInstance instance, VkPhysicalDevice physDev,
|
| + uint32_t queueFamilyIndex) {
|
| + static PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR
|
| + getPhysicalDeviceXcbPresentationSupportKHR = nullptr;
|
| + if (!getPhysicalDeviceXcbPresentationSupportKHR) {
|
| + getPhysicalDeviceXcbPresentationSupportKHR =
|
| + (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)
|
| + vkGetInstanceProcAddr(instance,
|
| + "vkGetPhysicalDeviceXcbPresentationSupportKHR");
|
| + }
|
| +
|
| +
|
| + Display* display = info.fDisplay;
|
| + VisualID visualID = info.fVisualInfo->visualid;
|
| + VkBool32 check = getPhysicalDeviceXcbPresentationSupportKHR(physDev,
|
| + queueFamilyIndex,
|
| + XGetXCBConnection(display),
|
| + visualID);
|
| + return (VK_FALSE != check);
|
| + };
|
| + WindowContext* context = new VulkanWindowContext(displayParams, createVkSurface, canPresent);
|
| + if (!context->isValid()) {
|
| + delete context;
|
| + return nullptr;
|
| }
|
| -
|
| - return surface;
|
| + return context;
|
| }
|
|
|
| -// 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;
|
| - VisualID visualID = unixPlatformData->fVisualInfo->visualid;
|
| - VkBool32 check = getPhysicalDeviceXcbPresentationSupportKHR(physDev,
|
| - queueFamilyIndex,
|
| - XGetXCBConnection(display),
|
| - visualID);
|
| - return (VK_FALSE != check);
|
| -}
|
| +} // namespace VulkanWindowContextFactory
|
|
|
| -} // namespace sk_app
|
| +} // namespace sk_app
|
|
|