aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/viewer/sk_app/unix
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2016-07-26 12:02:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-07-26 12:02:51 -0700
commitd1bdd1fcbd308afb9903f39d231742f5c951cf07 (patch)
tree786715537d870e3ff8bc3686ea40b83b62c43d6b /tools/viewer/sk_app/unix
parent1ed2ae45f59c2864ea05838b4da2750b85472824 (diff)
Use Windowing system-specific WindowContext factories.
Diffstat (limited to 'tools/viewer/sk_app/unix')
-rw-r--r--tools/viewer/sk_app/unix/GLWindowContext_unix.cpp93
-rw-r--r--tools/viewer/sk_app/unix/GLWindowContext_unix.h39
-rw-r--r--tools/viewer/sk_app/unix/VulkanWindowContext_unix.cpp114
-rw-r--r--tools/viewer/sk_app/unix/WindowContextFactory_unix.h37
-rw-r--r--tools/viewer/sk_app/unix/Window_unix.cpp17
-rw-r--r--tools/viewer/sk_app/unix/Window_unix.h6
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, &params);
- 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()