summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-10-24 16:41:04 +0200
committerKonstantin Käfer <mail@kkaefer.com>2014-10-24 16:41:04 +0200
commitd299e580886353e0813d30f9dee74639f899924a (patch)
treee73137e3258538cb5bbc634d1aff24c22e0f7a0f /common
parentcd9a89257a0004ca18460befc4b141bc07ed5c22 (diff)
parentcd44abcc588c9fc988589c148e76e4590c2197b8 (diff)
downloadqtlocation-mapboxgl-d299e580886353e0813d30f9dee74639f899924a.tar.gz
Merge remote-tracking branch 'origin/headless-display' into gyp-restructuring
Conflicts: Makefile ios/mapbox-gl-cocoa
Diffstat (limited to 'common')
-rw-r--r--common/glx.h2
-rw-r--r--common/headless_display.cpp74
-rw-r--r--common/headless_display.hpp25
3 files changed, 101 insertions, 0 deletions
diff --git a/common/glx.h b/common/glx.h
new file mode 100644
index 0000000000..6b7d9a3df9
--- /dev/null
+++ b/common/glx.h
@@ -0,0 +1,2 @@
+#include <GL/glx.h>
+#undef None
diff --git a/common/headless_display.cpp b/common/headless_display.cpp
new file mode 100644
index 0000000000..3aaf2020b9
--- /dev/null
+++ b/common/headless_display.cpp
@@ -0,0 +1,74 @@
+#include "headless_display.hpp"
+
+#include <cstring>
+#include <stdexcept>
+
+namespace mbgl {
+
+HeadlessDisplay::HeadlessDisplay() {
+#if MBGL_USE_CGL
+ // TODO: test if OpenGL 4.1 with GL_ARB_ES2_compatibility is supported
+ // If it is, use kCGLOGLPVersion_3_2_Core and enable that extension.
+ CGLPixelFormatAttribute attributes[] = {
+ kCGLPFAOpenGLProfile,
+ (CGLPixelFormatAttribute) kCGLOGLPVersion_Legacy,
+ kCGLPFAAccelerated,
+ (CGLPixelFormatAttribute) 0
+ };
+
+ GLint num;
+ CGLError error = CGLChoosePixelFormat(attributes, &pixelFormat, &num);
+ if (error) {
+ fprintf(stderr, "Error pixel format: %s\n", CGLErrorString(error));
+ return;
+ }
+#endif
+
+#if MBGL_USE_GLX
+ if (!XInitThreads()) {
+ throw std::runtime_error("Failed to XInitThreads");
+ }
+
+ x_display = XOpenDisplay(nullptr);
+ if (x_display == nullptr) {
+ throw std::runtime_error("Failed to open X display");
+ }
+
+ const char *extensions = (char *)glXQueryServerString(x_display, DefaultScreen(x_display), GLX_EXTENSIONS);
+ if (!extensions) {
+ throw std::runtime_error("Cannot read GLX extensions");
+ }
+ if (!strstr(extensions,"GLX_SGIX_fbconfig")) {
+ throw std::runtime_error("Extension GLX_SGIX_fbconfig was not found");
+ }
+ if (!strstr(extensions, "GLX_SGIX_pbuffer")) {
+ throw std::runtime_error("Cannot find glXCreateContextAttribsARB");
+ }
+
+ // We're creating a dummy pbuffer anyway that we're not using.
+ static int pixelFormat[] = {
+ GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
+ None
+ };
+
+ int configs = 0;
+ fb_configs = glXChooseFBConfig(x_display, DefaultScreen(x_display), pixelFormat, &configs);
+ if (configs <= 0) {
+ throw std::runtime_error("No Framebuffer configurations");
+ }
+#endif
+}
+
+HeadlessDisplay::~HeadlessDisplay() {
+#if MBGL_USE_CGL
+ CGLDestroyPixelFormat(pixelFormat);
+#endif
+
+#if MBGL_USE_GLX
+ XFree(fb_configs);
+ XCloseDisplay(x_display);
+#endif
+}
+
+}
+
diff --git a/common/headless_display.hpp b/common/headless_display.hpp
new file mode 100644
index 0000000000..5b33fd6990
--- /dev/null
+++ b/common/headless_display.hpp
@@ -0,0 +1,25 @@
+#ifndef MBGL_COMMON_HEADLESS_DISPLAY
+#define MBGL_COMMON_HEADLESS_DISPLAY
+
+#include "headless_view.hpp"
+
+namespace mbgl {
+
+class HeadlessDisplay {
+public:
+ HeadlessDisplay();
+ ~HeadlessDisplay();
+
+#if MBGL_USE_CGL
+ CGLPixelFormatObj pixelFormat;
+#endif
+
+#if MBGL_USE_GLX
+ Display *x_display = nullptr;
+ GLXFBConfig *fb_configs = nullptr;
+#endif
+};
+
+}
+
+#endif