【问题标题】:GLX/GLEW order of initialization catch-22: GLXEW_ARB_create_context, glXCreateContextAttribsARB, glXCreateContextGLX/GLEW 初始化 catch-22 的顺序:GLXEW_ARB_create_context、glXCreateContextAttribsARB、glXCreateContext
【发布时间】:2015-10-12 20:37:55
【问题描述】:

目前我正在开发一个使用 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)中。所以这也可能是 Mesa 的问题。

【问题讨论】:

    标签: opengl x11 glew glx


    【解决方案1】:

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

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

    所以目前,据我所知,最好在创建glx 上下文之前避免glew,而是直接使用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()

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多