GLX / GLEW初始化顺序catch-22:GLXEW_ARB_create_context,glXCreateContextAttribsARB,glXCreateContext

时间:2015-10-12 03:35:20

标签: opengl x11 glew glx

目前我正在开发一个使用GLEW和GLX的应用程序(在X11上)。

逻辑如下工作......

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的软件光栅化器(用swrast编译的libGL.so)中。所以它也可能是梅萨的一个问题。

1 个答案:

答案 0 :(得分:2)

更正,这适用于Mesa-SWRast和NVidia的固有OpenGL驱动程序,但是使用英特尔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()
  •