随后将具有不同视觉效果的GLX上下文附加到同一个X Window

时间:2015-07-14 07:32:57

标签: linux opengl x11 glx

我正在尝试创建一个GLX上下文,将其附加到X Window,再次分离并销毁它,然后使用不同的Visual创建另一个GLX上下文并将其附加到同一个窗口。

#include <GL/glx.h>
#include <X11/Xlib.h>
#include <stdlib.h>
#include <stdio.h>

// Descriptions for the visuals to try - if both are equal, the example works
static int attr_sets[][3] = {
        { GLX_RGBA, GLX_DOUBLEBUFFER, None },
        { GLX_RGBA, None }
};

Display *dpy;
XVisualInfo *vi;
GLXContext cxt;
Window wnd;
size_t i;

void fail(const char *m) { fprintf(stderr, "fail: %s #%lu\n", m, i+1); abort(); }

int main(void) {
    dpy = XOpenDisplay(NULL);
    wnd = XCreateSimpleWindow(dpy, RootWindow(dpy, 0), 0, 0, 1, 1, 1, 0, 0);
    for (i = 0; i < 2; ++i) {
        if (!(vi = glXChooseVisual(dpy, 0, attr_sets[1]))) fail("choose");
        if (!(cxt = glXCreateContext(dpy, vi, None, True))) fail("create");
        XFree(vi);
        if (!glXMakeCurrent(dpy, wnd, cxt)) fail("attach");
        if (!glXMakeCurrent(dpy, wnd, 0)) fail("detach");
        glXDestroyContext(dpy, cxt);
    }
    XDestroyWindow(dpy, wnd);
    XCloseDisplay(dpy);
    return 0;
}

此示例适用于具有Intel图形的Mesa 10.5.2,但在附加第二个上下文(fail: attach #2)时在AMD fglrx 12.104上失败。

出现此错误的原因是什么?这是否被规范禁止或是驱动程序错误?

1 个答案:

答案 0 :(得分:2)

如果你看一下XCreateSimpleWindow的定义,你会发现,它实际上只是XCreateWindow的包装。 XCreateWindow反过来会使用它的父母的视觉效果。

现在X11的视觉效果只是故事的一半。当您第一次将OpenGL上下文附加到Drawable时,Drawable 的可视(以及更高级的功能,也是它的FBConfig)可能变得精致,以便稍后仅与OpenGL上下文相兼容可以附加配置。

简而言之,一旦Drawables Visual / FBConfig被固定下来,只能附加与之兼容的OpenGL上下文。查看为glXMakeCurrent定义的错误,特别是

  

如果未使用相同的X创建drawable,则会生成BadMatch   屏幕和视觉为ctx。如果drawable是None和,也会生成它   ctx不是NULL。

通常在使用GLX时,您可以使用glXCreateWindow在主窗口中创建一个OpenGL独占子窗口,您可以在不影响主窗口的情况下设置Visual / FBConfig。