From 0935cef9c30cdd56499ca9a28effdf31c0848034 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Tue, 2 Dec 2014 21:40:23 +1100 Subject: [PATCH] Fix tests when using GL 3.0+ context --- .../mbgl/platform/default/headless_view.hpp | 1 + platform/default/glfw_view.cpp | 6 ++-- platform/default/headless_view.cpp | 32 +++++++++++++++---- src/renderer/painter.cpp | 6 ++-- src/shader/shader.cpp | 6 ++-- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/include/mbgl/platform/default/headless_view.hpp b/include/mbgl/platform/default/headless_view.hpp index 9d8acf70f..415c9740a 100644 --- a/include/mbgl/platform/default/headless_view.hpp +++ b/include/mbgl/platform/default/headless_view.hpp @@ -59,6 +59,7 @@ private: GLuint fbo = 0; GLuint fbo_depth_stencil = 0; GLuint fbo_color = 0; + bool using_gl_3_or_newer = false; }; } diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index ed37653bb..9c84610dc 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -69,7 +69,7 @@ void GLFWView::initialize(mbgl::Map *map_) { glfwSetKeyCallback(window, key); - const std::string extensions = (char *)glGetString(GL_EXTENSIONS); + const std::string extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); { using namespace mbgl; @@ -79,8 +79,8 @@ void GLFWView::initialize(mbgl::Map *map_) { gl::DebugMessageCallback = (gl::PFNGLDEBUGMESSAGECALLBACKPROC)glfwGetProcAddress("glDebugMessageCallback"); gl::GetDebugMessageLog = (gl::PFNGLGETDEBUGMESSAGELOGPROC)glfwGetProcAddress("glGetDebugMessageLog"); gl::GetPointerv = (gl::PFNGLGETPOINTERVPROC)glfwGetProcAddress("glGetPointerv"); - gl::PushDebugGroup = (gl::PFNGLPUSHDEBUGGROUPPROC)glfwGetProcAddress("glPushDebugGroup"); - gl::PopDebugGroup = (gl::PFNGLPOPDEBUGGROUPPROC)glfwGetProcAddress("glPopDebugGroup"); + //gl::PushDebugGroup = (gl::PFNGLPUSHDEBUGGROUPPROC)glfwGetProcAddress("glPushDebugGroup"); + //gl::PopDebugGroup = (gl::PFNGLPOPDEBUGGROUPPROC)glfwGetProcAddress("glPopDebugGroup"); gl::ObjectLabel = (gl::PFNGLOBJECTLABELPROC)glfwGetProcAddress("glObjectLabel"); gl::GetObjectLabel = (gl::PFNGLGETOBJECTLABELPROC)glfwGetProcAddress("glGetObjectLabel"); gl::ObjectPtrLabel = (gl::PFNGLOBJECTPTRLABELPROC)glfwGetProcAddress("glObjectPtrLabel"); diff --git a/platform/default/headless_view.cpp b/platform/default/headless_view.cpp index 10d6ed8f4..c23ddadd6 100644 --- a/platform/default/headless_view.cpp +++ b/platform/default/headless_view.cpp @@ -49,7 +49,23 @@ HeadlessView::HeadlessView(std::shared_ptr display) void HeadlessView::loadExtensions() { make_active(); - const std::string extensions = (char *)glGetString(GL_EXTENSIONS); + + std::string extensions; + if (using_gl_3_or_newer) { +#ifdef GL_VERSION_3_0 + GLuint num_extensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, reinterpret_cast(&num_extensions)); + for (GLuint i = 0; i < num_extensions; i++) { + extensions.append(reinterpret_cast(glGetStringi(GL_EXTENSIONS, i))); + extensions.append(" "); + } +#else + throw std::runtime_error("Using GL 3.0+ context with out correct headers.\n"); +#endif + } else { + extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); + } + #ifdef MBGL_USE_CGL if (extensions.find("GL_APPLE_vertex_array_object") != std::string::npos) { @@ -90,7 +106,7 @@ static const core_profile_version core_profile_versions[] = { {0, 0}, }; -GLXContext createCoreProfile(Display *dpy, GLXFBConfig fbconfig) { +GLXContext createCoreProfile(Display *dpy, GLXFBConfig fbconfig, bool& using_gl_3_or_newer) { static bool context_creation_failed = false; GLXContext ctx = 0; @@ -103,7 +119,8 @@ GLXContext createCoreProfile(Display *dpy, GLXFBConfig fbconfig) { }); // Try to create core profiles from the highest known version on down. - for (int i = 0; !ctx && core_profile_versions[i].major; i++) { + int i = 0; + for (; !ctx && core_profile_versions[i].major; i++) { context_creation_failed = false; const int context_flags[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, core_profile_versions[i].major, @@ -116,6 +133,10 @@ GLXContext createCoreProfile(Display *dpy, GLXFBConfig fbconfig) { } } + if (core_profile_versions[i].major >= 3) { + using_gl_3_or_newer = true; + } + // Restore the old error handler. XSetErrorHandler(previous_error_handler); return ctx; @@ -149,11 +170,11 @@ void HeadlessView::createContext() { #ifdef GLX_ARB_create_context if (glXCreateContextAttribsARB) { // Try to create a core profile context. - gl_context = createCoreProfile(x_display, fb_configs[0]); + gl_context = createCoreProfile(x_display, fb_configs[0], using_gl_3_or_newer); } #endif - if (!gl_context) { + if (gl_context == 0) { // Try to create a legacy context gl_context = glXCreateNewContext(x_display, fb_configs[0], GLX_RGBA_TYPE, 0, True); if (gl_context) { @@ -331,4 +352,3 @@ void HeadlessView::make_inactive() { void HeadlessView::swap() {} } - diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 3b4e817d3..f5ca2cc74 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -46,11 +46,11 @@ void Painter::setup() { // Enable GL debugging if ((gl::DebugMessageControl != nullptr) && (gl::DebugMessageCallback != nullptr)) { // This will enable all messages including performance hints - gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); + //gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); // This will only enable high and medium severity messages - //gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE); - //gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE); + gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE); + gl::DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE); gl::DebugMessageCallback(gl::debug_callback, nullptr); } diff --git a/src/shader/shader.cpp b/src/shader/shader.cpp index 84cb55eac..06bdcb34c 100644 --- a/src/shader/shader.cpp +++ b/src/shader/shader.cpp @@ -43,7 +43,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo GLint logLength; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); if (logLength > 0) { - GLchar *log = (GLchar *)malloc(logLength); + GLchar *log = reinterpret_cast(malloc(logLength)); glGetProgramInfoLog(program, logLength, &logLength, log); Log::Error(Event::Shader, "Program failed to link: %s", log); free(log); @@ -69,7 +69,7 @@ Shader::Shader(const char *name_, const GLchar *vertSource, const GLchar *fragSo GLint logLength; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); if (logLength > 0) { - GLchar *log = (GLchar *)malloc(logLength); + GLchar *log = reinterpret_cast(malloc(logLength)); glGetProgramInfoLog(program, logLength, &logLength, log); Log::Error(Event::Shader, "Program failed to validate: %s", log); free(log); @@ -110,7 +110,7 @@ bool Shader::compileShader(GLuint *shader, GLenum type, const GLchar *source) { GLint logLength; glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength); if (logLength > 0) { - GLchar *log = (GLchar *)malloc(logLength); + GLchar *log = reinterpret_cast(malloc(logLength)); glGetShaderInfoLog(*shader, logLength, &logLength, log); Log::Error(Event::Shader, "Shader failed to compile: %s", log); free(log);