From 879827bdbc0ff0eb4c1959b8ae8382b4c3ec66af Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Thu, 12 Apr 2012 16:24:00 -0300 Subject: [PATCH] enable opengl debugging on x11 --- src/framework/graphics/graphics.cpp | 11 ++++++++ src/framework/platform/x11window.cpp | 38 ++++++++++++++++++---------- src/framework/platform/x11window.h | 1 + 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/framework/graphics/graphics.cpp b/src/framework/graphics/graphics.cpp index 7576b401..bda68b87 100644 --- a/src/framework/graphics/graphics.cpp +++ b/src/framework/graphics/graphics.cpp @@ -28,17 +28,28 @@ Graphics g_graphics; +void oglDebugCallback(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, int length, const char* message, void* userParam) +{ + logWarning("OGL: ", message); +} + void Graphics::init() { logInfo("GPU ", glGetString(GL_RENDERER)); logInfo("OpenGL ", glGetString(GL_VERSION)); + #ifndef OPENGL_ES2 // init GL extensions GLenum err = glewInit(); if(err != GLEW_OK) logFatal("Unable to init GLEW: ", glewGetErrorString(err)); +#ifndef NDEBUG + if(GLEW_ARB_debug_output) + glDebugMessageCallbackARB(oglDebugCallback, NULL); +#endif + const char *requiredExtensions[] = { "GL_ARB_vertex_program", "GL_ARB_vertex_shader", diff --git a/src/framework/platform/x11window.cpp b/src/framework/platform/x11window.cpp index e72178ce..29ee8c0c 100644 --- a/src/framework/platform/x11window.cpp +++ b/src/framework/platform/x11window.cpp @@ -29,6 +29,7 @@ X11Window::X11Window() { + m_fbConfig = 0; m_display = 0; m_visual = 0; m_window = 0; @@ -366,27 +367,24 @@ void X11Window::internalChooseGLVisual() { #ifndef OPENGL_ES2 static int attrList[] = { - GLX_USE_GL, - GLX_RGBA, - GLX_DOUBLEBUFFER, - //GLX_STENCIL_SIZE, 8, - /* - GLX_ACCUM_RED_SIZE, 8, - GLX_ACCUM_GREEN_SIZE, 8, - GLX_ACCUM_BLUE_SIZE, 8, - GLX_ACCUM_ALPHA_SIZE, 8, - */ + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, + GLX_DOUBLEBUFFER, True, None }; - m_visual = glXChooseVisual(m_display, m_screen, attrList); + int nelements; + m_fbConfig = glXChooseFBConfig(m_display, m_screen, attrList, &nelements); + if(!m_fbConfig) + logFatal("Couldn't choose RGBA, double buffered fbconfig"); + + m_visual = glXGetVisualFromFBConfig(m_display, *m_fbConfig); if(!m_visual) logFatal("Couldn't choose RGBA, double buffered visual"); m_rootWindow = RootWindow(m_display, m_visual->screen); #else static int attrList[] = { - //EGL_BUFFER_SIZE, 24, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //EGL_STENCIL_SIZE, 8, EGL_NONE @@ -406,7 +404,21 @@ void X11Window::internalChooseGLVisual() void X11Window::internalCreateGLContext() { #ifndef OPENGL_ES2 - m_glxContext = glXCreateContext(m_display, m_visual, NULL, True); + typedef GLXContext (*GLXCREATECONTEXTATTRIBSARBPROC)(Display*, GLXFBConfig, GLXContext, Bool, const int*); + GLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = NULL; + glXCreateContextAttribsARB = (GLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress((const GLubyte*) "glXCreateContextAttribsARB"); + if(glXCreateContextAttribsARB) { + int attrs[] = { +#ifndef NDEBUG + GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB, +#endif + None + }; + m_glxContext = glXCreateContextAttribsARB(m_display, *m_fbConfig, NULL, True, attrs); + } else + m_glxContext = glXCreateContext(m_display, m_visual, NULL, True); + + //m_glxContext = glXCreateContext(m_display, m_visual, NULL, True); if(!m_glxContext) logFatal("Unable to create GLX context"); diff --git a/src/framework/platform/x11window.h b/src/framework/platform/x11window.h index 0f35f1f8..43b13b7b 100644 --- a/src/framework/platform/x11window.h +++ b/src/framework/platform/x11window.h @@ -82,6 +82,7 @@ public: bool isMaximized(); private: + GLXFBConfig *m_fbConfig; Display *m_display; XVisualInfo *m_visual; Window m_window;