diff options
author | Tiago Vignatti <tvignatti@gmail.com> | 2016-08-01 17:30:43 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-11-17 01:01:15 +0100 |
commit | 32b6f2fa0383f04855a181f6db61df84968ec97c (patch) | |
tree | b47e1f03cb06924d16ac1a514dc4727ea0053b75 /platform/linux/src/headless_display_egl.cpp | |
parent | 50f0f919c38a905b8b169fcbd3e77c03bf48d17b (diff) | |
download | qtlocation-mapboxgl-32b6f2fa0383f04855a181f6db61df84968ec97c.tar.gz |
[linux] Implement EGL headless backend
Original author: Tiago Vignatti <tvignatti@gmail.com>
Calling X11 window system is superfluous for headless rendering. This patch
implements EGL platform using GBM, which is slightly more simple than the GLX
path when using X11.
In principle there are no big advantages in terms of performance etc. My
motivation behind this was to get in touch with the code and the project. For
testing I'm using:
$ unset DISPLAY && ./build/linux-x86_64/Debug/mbgl-test
v2: rebased patch against the new cmake changes; walk through render node to
find a valid one; remove EGLSurface completely cause windows are not needed
here.
Diffstat (limited to 'platform/linux/src/headless_display_egl.cpp')
-rw-r--r-- | platform/linux/src/headless_display_egl.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/platform/linux/src/headless_display_egl.cpp b/platform/linux/src/headless_display_egl.cpp new file mode 100644 index 0000000000..2c0481ddd1 --- /dev/null +++ b/platform/linux/src/headless_display_egl.cpp @@ -0,0 +1,56 @@ +#include <mbgl/platform/default/headless_display.hpp> +#include <mbgl/util/string.hpp> + +#include <EGL/egl.h> + +namespace mbgl { + +class HeadlessDisplay::Impl { +public: + Impl(); + ~Impl(); + + EGLDisplay display = EGL_NO_DISPLAY; + EGLConfig config = 0; +}; + +HeadlessDisplay::Impl::Impl() { + display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (display == EGL_NO_DISPLAY) { + throw std::runtime_error("Failed to obtain a valid EGL display.\n"); + } + + EGLint major, minor, numConfigs; + if (!eglInitialize(display, &major, &minor)) { + throw std::runtime_error("eglInitialize() failed.\n"); + } + + // This shouldn't matter as we're rendering to a framebuffer. + const EGLint attribs[] = { EGL_NONE }; + if (!eglChooseConfig(display, attribs, &config, 1, &numConfigs) || numConfigs != 1) { + throw std::runtime_error("Failed to choose ARGB config.\n"); + } +} + +HeadlessDisplay::Impl::~Impl() { + eglTerminate(display); +} + +template <> +EGLDisplay HeadlessDisplay::attribute() const { + return impl->display; +} + +template <> +EGLConfig& HeadlessDisplay::attribute() const { + return impl->config; +} + +HeadlessDisplay::HeadlessDisplay() + : impl(std::make_unique<Impl>()) { +} + +HeadlessDisplay::~HeadlessDisplay() { +} + +} // namespace mbgl |