随后将具有不同视觉效果的 GLX 上下文附加到同一个 X Window
Attach GLX contexts with different visuals to the same X Window subsequently
我正在尝试创建一个 GLX 上下文,将其附加到 X Window,分离并再次销毁它,然后创建另一个具有不同 Visual 的 GLX 上下文并将其附加到同一个 window.
#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;
}
此示例在带有英特尔显卡的 Mesa 10.5.2 上运行,但在附加第二个上下文时在 AMD fglrx 12.104 上失败 (fail: attach #2
)。
这个错误的原因是什么?这是规范禁止的还是驱动程序错误?
如果您查看 XCreateSimpleWindow
的定义,您会发现它实际上只是 XCreateWindow
的包装器。 XCreateWindow
反过来将使用其父项的视觉对象。
现在 X11 视觉效果只是故事的一半。当您第一次将 OpenGL 上下文附加到 Drawable 时,该 Drawable 可能 的视觉效果(对于更高级的功能还有它的 FBConfig)变得精致,因此以后只有 OpenGL可以附加与该配置兼容的上下文。
简而言之,一旦确定了 Drawable Visual/FBConfig,就只能附加与其兼容的 OpenGL 上下文。查看为 glXMakeCurrent
定义的错误,特别是
BadMatch is generated if drawable was not created with the same X
screen and visual as ctx. It is also generated if drawable is None and
ctx is not NULL.
通常在使用 GLX 时,您会使用 glXCreateWindow
在主 window 中创建一个 OpenGL 独占子 window,您可以设置 Visual/FBConfig 而不会影响您的主要 window.
我正在尝试创建一个 GLX 上下文,将其附加到 X Window,分离并再次销毁它,然后创建另一个具有不同 Visual 的 GLX 上下文并将其附加到同一个 window.
#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;
}
此示例在带有英特尔显卡的 Mesa 10.5.2 上运行,但在附加第二个上下文时在 AMD fglrx 12.104 上失败 (fail: attach #2
)。
这个错误的原因是什么?这是规范禁止的还是驱动程序错误?
如果您查看 XCreateSimpleWindow
的定义,您会发现它实际上只是 XCreateWindow
的包装器。 XCreateWindow
反过来将使用其父项的视觉对象。
现在 X11 视觉效果只是故事的一半。当您第一次将 OpenGL 上下文附加到 Drawable 时,该 Drawable 可能 的视觉效果(对于更高级的功能还有它的 FBConfig)变得精致,因此以后只有 OpenGL可以附加与该配置兼容的上下文。
简而言之,一旦确定了 Drawable Visual/FBConfig,就只能附加与其兼容的 OpenGL 上下文。查看为 glXMakeCurrent
定义的错误,特别是
BadMatch is generated if drawable was not created with the same X screen and visual as ctx. It is also generated if drawable is None and ctx is not NULL.
通常在使用 GLX 时,您会使用 glXCreateWindow
在主 window 中创建一个 OpenGL 独占子 window,您可以设置 Visual/FBConfig 而不会影响您的主要 window.