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 |