2015-10-12 22 views
2

目前我正在使用GLEW和GLX(在X11上)的应用程序。初始化catch-22的GLX/GLEW顺序:GLXEW_ARB_create_context,glXCreateContextAttribsARB,glXCreateContext

逻辑的工作原理如下...

glewInit(); /* <- needed so 'GLXEW_ARB_create_context' is set! */ 
if (GLXEW_ARB_create_context) { 
    /* opengl >= 3.0*/ 
    .. get fb_config .. 
    context = glXCreateContextAttribsARB(...); 
} 
else { 
    /* legacy context */ 
    context = glXCreateContext(...); 
} 

我快到的问题,是GLXEW_ARB_create_context由GLEW初始化,初始化而调用GLEW glGetString,其崩溃如果之前(glXCreateContextAttribsARB/glXCreateContext称为)。

请注意,这只发生在Mesa的软件光栅化器中,(libGL.so用swrast编译)。所以它也可能是Mesa的一个问题。

回答

2

更正,这适用于Mesa-SWRast和NVidia的固有OpenGL驱动程序,但与Intel的OpenGL的段错误。 虽然这可能是英特尔驱动程序中的一个错误。需要检查其他项目如何处理这个问题。

在这种情况下,原因是intel的情况是glXGetCurrentDisplay()在glx初始化之前返回NULL(另一个catch-22)。

所以现在,据我所知,它最好别避免创建glew之前glx背景,而是使用GLX直接,如:

if (glXQueryExtension(m_display, NULL, NULL)) { 
     const char *glx_ext = glXGetClientString(display, GLX_EXTENSIONS); 
     if (... check_string_for_extension(glx_ext, "GLX_SOME_EXTENSION")) { 
      printf("We have the extension!\n"); 
     } 
    } 

老答案...

找到了解决办法(似乎很明显回想起来!)

  • 第一次调用glxewInit()
  • 检查GLXEW_ARB_create_context
  • 创建glXCreateContextAttribsARBglXCreateContext上下文。
  • 呼叫glewInit()