diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-07-07 12:39:03 -0700 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-07-07 12:39:03 -0700 |
commit | 59967fd709f04532a36030e56c3ea064b9b3fc19 (patch) | |
tree | 416a3cdfcb89ef9f2ad65cc47f5282e007a3bc7b /test/headless.cpp | |
parent | 853c9a58763e990d1a66ee24423413109da05930 (diff) | |
download | qtlocation-mapboxgl-59967fd709f04532a36030e56c3ea064b9b3fc19.tar.gz |
make headless rendering work again by setting the correct fbo
Diffstat (limited to 'test/headless.cpp')
-rw-r--r-- | test/headless.cpp | 160 |
1 files changed, 86 insertions, 74 deletions
diff --git a/test/headless.cpp b/test/headless.cpp index 34a3f1db77..297b3f28ec 100644 --- a/test/headless.cpp +++ b/test/headless.cpp @@ -23,92 +23,104 @@ void notify_map_change(MapChange change) { class View : public llmr::View { public: - void make_active() { - CGLError error = CGLSetCurrentContext(gl_context); + View(int width, int height) { + // 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, "Switching OpenGL context failed\n"); + fprintf(stderr, "Error pixel format\n"); + return; } - } - void swap() {} - -CGLContextObj gl_context; -}; -TEST(Headless, initialize) { - llmr::util::timer timer; + error = CGLCreateContext(pixelFormat, NULL, &gl_context); + CGLDestroyPixelFormat(pixelFormat); + if (error) { + fprintf(stderr, "Error creating GL context object\n"); + return; + } - // Setup OpenGL - View view; - - // 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; + make_active(); + + // 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; + } } - error = CGLCreateContext(pixelFormat, NULL, &view.gl_context); - CGLDestroyPixelFormat(pixelFormat); - if (error) { - fprintf(stderr, "Error creating GL context object\n"); - return; + ~View() { + glDeleteFramebuffersEXT(1, &fbo); + glDeleteTextures(1, &fbo_color); + glDeleteRenderbuffersEXT(1, &fbo_depth_stencil); + + CGLDestroyContext(gl_context); } - view.make_active(); + void make_active() { + CGLError error = CGLSetCurrentContext(gl_context); + if (error) { + fprintf(stderr, "Switching OpenGL context failed\n"); + } + } - timer.report("gl setup"); + void swap() {} + unsigned int root_fbo() { + return fbo; + } - int width = 1024; - int height = 768; - // Create depth/stencil buffer +private: + CGLContextObj gl_context; + GLuint fbo = 0; GLuint fbo_depth_stencil = 0; - 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); - GLuint fbo_color = 0; - glGenRenderbuffersEXT(1, &fbo_color); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_color); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - - GLuint fbo = 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); +}; +TEST(Headless, initialize) { + llmr::util::timer timer; - 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; - } + int width = 1024; + int height = 768; - timer.report("gl framebuffer"); + // Setup OpenGL + View view(width, height); + timer.report("gl setup"); llmr::Map map(view); @@ -121,6 +133,10 @@ TEST(Headless, initialize) { map.setStyleJSON(stylejson.str()); + map.setLonLatZoom(0, 0, 2); + map.setAngle(0); + map.setDebug(false); + timer.report("map resize"); // Run the loop. It will terminate when we don't have any further listeners. @@ -130,6 +146,8 @@ TEST(Headless, initialize) { uint32_t *pixels = new uint32_t[width * height]; + view.make_active(); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); timer.report("gl readpixels"); @@ -146,11 +164,5 @@ TEST(Headless, initialize) { delete[] pixels; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - glDeleteFramebuffersEXT(1, &fbo); - glDeleteTextures(1, &fbo_color); - glDeleteRenderbuffersEXT(1, &fbo_depth_stencil); - - CGLDestroyContext(view.gl_context); - timer.report("destruct"); } |