summaryrefslogtreecommitdiff
path: root/common/headless_view.cpp
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-07-07 13:51:06 -0700
committerKonstantin Käfer <mail@kkaefer.com>2014-07-07 13:51:06 -0700
commit9b61e39ef33463ffa7cb2e987c39565f092e1890 (patch)
tree689115952846a31b394e7799c88ab8a325ff4801 /common/headless_view.cpp
parent59967fd709f04532a36030e56c3ea064b9b3fc19 (diff)
downloadqtlocation-mapboxgl-9b61e39ef33463ffa7cb2e987c39565f092e1890.tar.gz
move headless to their own files
[skip ci]
Diffstat (limited to 'common/headless_view.cpp')
-rw-r--r--common/headless_view.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/common/headless_view.cpp b/common/headless_view.cpp
new file mode 100644
index 0000000000..7fa5b83946
--- /dev/null
+++ b/common/headless_view.cpp
@@ -0,0 +1,117 @@
+#include "headless_view.hpp"
+#include <llmr/util/timer.hpp>
+#include <llmr/platform/platform.hpp>
+
+namespace llmr {
+
+namespace platform {
+
+void notify_map_change(MapChange change) {
+ // no-op
+}
+
+}
+
+HeadlessView::HeadlessView() {
+ // 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
+ };
+
+ CGLPixelFormatObj pixelFormat;
+ GLint num;
+ CGLError error = CGLChoosePixelFormat(attributes, &pixelFormat, &num);
+ if (error) {
+ fprintf(stderr, "Error pixel format\n");
+ return;
+ }
+
+ error = CGLCreateContext(pixelFormat, NULL, &gl_context);
+ CGLDestroyPixelFormat(pixelFormat);
+ if (error) {
+ fprintf(stderr, "Error creating GL context object\n");
+ return;
+ }
+
+ make_active();
+}
+
+
+void HeadlessView::resize(int width, int height) {
+ clear_buffers();
+
+ // Create depth/stencil buffer
+ glGenRenderbuffersEXT(1, &fbo_depth_stencil);
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_depth_stencil);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, width, height);
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+
+ glGenRenderbuffersEXT(1, &fbo_color);
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_color);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height);
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+
+ glGenFramebuffersEXT(1, &fbo);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
+
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, fbo_color);
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER_EXT, fbo_depth_stencil);
+
+ GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+
+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ fprintf(stderr, "Couldn't create framebuffer: ");
+ switch (status) {
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: fprintf(stderr, "incomplete attachment\n"); break;
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: fprintf(stderr, "incomplete missing attachment\n"); break;
+ case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: fprintf(stderr, "incomplete draw buffer\n"); break;
+ case GL_FRAMEBUFFER_UNSUPPORTED: fprintf(stderr, "unsupported\n"); break;
+ default: fprintf(stderr, "other\n"); break;
+ }
+ return;
+ }
+}
+
+void HeadlessView::clear_buffers() {
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+
+ if (fbo) {
+ glDeleteFramebuffersEXT(1, &fbo);
+ fbo = 0;
+ }
+
+ if (fbo_color) {
+ glDeleteTextures(1, &fbo_color);
+ fbo_color = 0;
+ }
+
+ if (fbo_depth_stencil) {
+ glDeleteRenderbuffersEXT(1, &fbo_depth_stencil);
+ fbo_depth_stencil = 0;
+ }
+}
+
+HeadlessView::~HeadlessView() {
+ clear_buffers();
+ CGLDestroyContext(gl_context);
+}
+
+void HeadlessView::make_active() {
+ CGLError error = CGLSetCurrentContext(gl_context);
+ if (error) {
+ fprintf(stderr, "Switching OpenGL context failed\n");
+ }
+}
+
+void HeadlessView::swap() {}
+
+unsigned int HeadlessView::root_fbo() {
+ return fbo;
+}
+
+}
+