blob: 03c8e16a59841795508479778c7dba85e28aa80d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include <mbgl/gl/headless_display.hpp>
#include <mbgl/util/logging.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");
}
if (!eglBindAPI(EGL_OPENGL_ES_API)) {
mbgl::Log::Error(mbgl::Event::OpenGL, "eglBindAPI(EGL_OPENGL_ES_API) returned error %d", eglGetError());
throw std::runtime_error("eglBindAPI() failed");
}
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
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
|