diff options
author | 2016-07-26 12:02:50 -0700 | |
---|---|---|
committer | 2016-07-26 12:02:51 -0700 | |
commit | d1bdd1fcbd308afb9903f39d231742f5c951cf07 (patch) | |
tree | 786715537d870e3ff8bc3686ea40b83b62c43d6b /tools/viewer/sk_app/unix | |
parent | 1ed2ae45f59c2864ea05838b4da2750b85472824 (diff) |
Use Windowing system-specific WindowContext factories.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2169543002
Review-Url: https://codereview.chromium.org/2169543002
Diffstat (limited to 'tools/viewer/sk_app/unix')
-rw-r--r-- | tools/viewer/sk_app/unix/GLWindowContext_unix.cpp | 93 | ||||
-rw-r--r-- | tools/viewer/sk_app/unix/GLWindowContext_unix.h | 39 | ||||
-rw-r--r-- | tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp | 114 | ||||
-rw-r--r-- | tools/viewer/sk_app/unix/WindowContextFactory_unix.h | 37 | ||||
-rw-r--r-- | tools/viewer/sk_app/unix/Window_unix.cpp | 17 | ||||
-rw-r--r-- | tools/viewer/sk_app/unix/Window_unix.h | 6 |
6 files changed, 160 insertions, 146 deletions
diff --git a/tools/viewer/sk_app/unix/GLWindowContext_unix.cpp b/tools/viewer/sk_app/unix/GLWindowContext_unix.cpp index cde1eb2b5c..6df1a523a7 100644 --- a/tools/viewer/sk_app/unix/GLWindowContext_unix.cpp +++ b/tools/viewer/sk_app/unix/GLWindowContext_unix.cpp @@ -6,50 +6,50 @@ * found in the LICENSE file. */ -#include "GLWindowContext_unix.h" +#include "../GLWindowContext.h" +#include "WindowContextFactory_unix.h" #include <GL/gl.h> -#include "Window_unix.h" +using sk_app::window_context_factory::XlibWindowInfo; +using sk_app::DisplayParams; +using sk_app::GLWindowContext; -namespace sk_app { +namespace { -// platform-dependent create -GLWindowContext* GLWindowContext::Create(void* platformData, const DisplayParams& params) { - GLWindowContext_unix* ctx = new GLWindowContext_unix(platformData, params); - if (!ctx->isValid()) { - delete ctx; - return nullptr; - } - return ctx; -} +class GLWindowContext_xlib : public GLWindowContext { +public: + GLWindowContext_xlib(const XlibWindowInfo&, const DisplayParams&); + ~GLWindowContext_xlib() override; -GLWindowContext_unix::GLWindowContext_unix(void* platformData, const DisplayParams& params) - : GLWindowContext(platformData, params) - , fDisplay(nullptr) - , fWindow(0) - , fGLContext(0) { + void onSwapBuffers() override; - // any config code here (particularly for msaa)? + void onDestroyContext() override; - this->initializeContext(platformData, params); -} +protected: + void onInitializeContext() override; -GLWindowContext_unix::~GLWindowContext_unix() { - this->destroyContext(); -} +private: + GLWindowContext_xlib(void*, const DisplayParams&); -void GLWindowContext_unix::onInitializeContext(void* platformData, const DisplayParams& params) { - ContextPlatformData_unix* unixPlatformData = - reinterpret_cast<ContextPlatformData_unix*>(platformData); + Display* fDisplay; + XWindow fWindow; + XVisualInfo* fVisualInfo; + GLXContext fGLContext; +}; - if (unixPlatformData) { - fDisplay = unixPlatformData->fDisplay; - fWindow = unixPlatformData->fWindow; - fVisualInfo = unixPlatformData->fVisualInfo; - } - SkASSERT(fDisplay); +GLWindowContext_xlib::GLWindowContext_xlib(const XlibWindowInfo& winInfo, const DisplayParams& params) + : GLWindowContext(params) + , fDisplay(winInfo.fDisplay) + , fWindow(winInfo.fWindow) + , fVisualInfo(winInfo.fVisualInfo) + , fGLContext() { + this->initializeContext(); +} +void GLWindowContext_xlib::onInitializeContext() { + // any config code here (particularly for msaa)? + SkASSERT(fDisplay); fGLContext = glXCreateContext(fDisplay, fVisualInfo, nullptr, GL_TRUE); if (!fGLContext) { return; @@ -73,12 +73,16 @@ void GLWindowContext_unix::onInitializeContext(void* platformData, const Display int x, y; unsigned int border_width, depth; XGetGeometry(fDisplay, fWindow, &root, &x, &y, - (unsigned int*)&fWidth, (unsigned int*)&fHeight, &border_width, &depth); + (unsigned int*)&fWidth, (unsigned int*)&fHeight, &border_width, &depth); glViewport(0, 0, fWidth, fHeight); } } -void GLWindowContext_unix::onDestroyContext() { +GLWindowContext_xlib::~GLWindowContext_xlib() { + this->destroyContext(); +} + +void GLWindowContext_xlib::onDestroyContext() { if (!fDisplay || !fGLContext) { return; } @@ -87,12 +91,27 @@ void GLWindowContext_unix::onDestroyContext() { fGLContext = nullptr; } - -void GLWindowContext_unix::onSwapBuffers() { +void GLWindowContext_xlib::onSwapBuffers() { if (fDisplay && fGLContext) { glXSwapBuffers(fDisplay, fWindow); } } +} // anonymous namespace + +namespace sk_app { + +namespace window_context_factory { + +WindowContext* NewGLForXlib(const XlibWindowInfo& winInfo, const DisplayParams& params) { + WindowContext* ctx = new GLWindowContext_xlib(winInfo, params); + if (!ctx->isValid()) { + delete ctx; + return nullptr; + } + return ctx; +} + +} // namespace window_context_factory -} //namespace sk_app +} // namespace sk_app diff --git a/tools/viewer/sk_app/unix/GLWindowContext_unix.h b/tools/viewer/sk_app/unix/GLWindowContext_unix.h deleted file mode 100644 index 2d76254c21..0000000000 --- a/tools/viewer/sk_app/unix/GLWindowContext_unix.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* - * Copyright 2016 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#ifndef GLWindowContext_unix_DEFINED -#define GLWindowContext_unix_DEFINED - -#include "../GLWindowContext.h" -#include "Window_unix.h" - -namespace sk_app { - -class GLWindowContext_unix : public GLWindowContext { -public: - friend GLWindowContext* GLWindowContext::Create(void* platformData, const DisplayParams&); - - ~GLWindowContext_unix() override; - - void onSwapBuffers() override; - - void onInitializeContext(void*, const DisplayParams&) override; - void onDestroyContext() override; - -private: - GLWindowContext_unix(void*, const DisplayParams&); - - Display* fDisplay; - XWindow fWindow; - XVisualInfo* fVisualInfo; - GLXContext fGLContext; -}; - - -} - -#endif diff --git a/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp b/tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp index 02bf516b22..b94e8edc20 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 diff --git a/tools/viewer/sk_app/unix/WindowContextFactory_unix.h b/tools/viewer/sk_app/unix/WindowContextFactory_unix.h new file mode 100644 index 0000000000..fb1568902d --- /dev/null +++ b/tools/viewer/sk_app/unix/WindowContextFactory_unix.h @@ -0,0 +1,37 @@ + +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef WindowContextFactory_unix_DEFINED +#define WindowContextFactory_unix_DEFINED + +#include <X11/Xlib.h> +#include <GL/glx.h> +typedef Window XWindow; + +namespace sk_app { + +class WindowContext; +struct DisplayParams; + +namespace window_context_factory { + +struct XlibWindowInfo { + Display* fDisplay; + XWindow fWindow; + XVisualInfo* fVisualInfo; +}; + +WindowContext* NewVulkanForXlib(const XlibWindowInfo&, const DisplayParams&); + +WindowContext* NewGLForXlib(const XlibWindowInfo&, const DisplayParams&); + +} // namespace window_context_factory + +} // namespace sk_app + +#endif diff --git a/tools/viewer/sk_app/unix/Window_unix.cpp b/tools/viewer/sk_app/unix/Window_unix.cpp index c4729263ec..e6edfd9ef9 100644 --- a/tools/viewer/sk_app/unix/Window_unix.cpp +++ b/tools/viewer/sk_app/unix/Window_unix.cpp @@ -7,12 +7,11 @@ //#include <tchar.h> +#include "WindowContextFactory_unix.h" + #include "SkUtils.h" #include "Timer.h" #include "../GLWindowContext.h" -#ifdef SK_VULKAN -#include "../VulkanWindowContext.h" -#endif #include "Window_unix.h" extern "C" { @@ -273,19 +272,19 @@ void Window_unix::show() { bool Window_unix::attach(BackendType attachType, const DisplayParams& params) { this->initWindow(fDisplay, ¶ms); - ContextPlatformData_unix platformData; - platformData.fDisplay = fDisplay; - platformData.fWindow = fWindow; - platformData.fVisualInfo = fVisualInfo; + window_context_factory::XlibWindowInfo xwinInfo; + xwinInfo.fDisplay = fDisplay; + xwinInfo.fWindow = fWindow; + xwinInfo.fVisualInfo = fVisualInfo; switch (attachType) { #ifdef SK_VULKAN case kVulkan_BackendType: - fWindowContext = VulkanWindowContext::Create((void*)&platformData, params); + fWindowContext = window_context_factory::NewVulkanForXlib(xwinInfo, params); break; #endif case kNativeGL_BackendType: default: - fWindowContext = GLWindowContext::Create((void*)&platformData, params); + fWindowContext = window_context_factory::NewGLForXlib(xwinInfo, params); break; } diff --git a/tools/viewer/sk_app/unix/Window_unix.h b/tools/viewer/sk_app/unix/Window_unix.h index b6d40e69db..462214df4a 100644 --- a/tools/viewer/sk_app/unix/Window_unix.h +++ b/tools/viewer/sk_app/unix/Window_unix.h @@ -18,12 +18,6 @@ typedef Window XWindow; namespace sk_app { -struct ContextPlatformData_unix { - Display* fDisplay; - XWindow fWindow; - XVisualInfo* fVisualInfo; -}; - class Window_unix : public Window { public: Window_unix() : Window() |