utils: fix gl_create_context() with parent context set.

If GLX window was created from a foreign Display, then that same Display shall
be used for subsequent glXMakeCurrent(). This means that gl_create_context()
will now use the same Display that the parent, if available.

This fixes cluttersink with the Intel GenX VA driver.
This commit is contained in:
Gwenole Beauchesne 2012-07-24 10:58:32 +02:00
parent 753a56e9a1
commit e52def4737

View file

@ -309,8 +309,15 @@ gl_create_context(Display *dpy, int screen, GLContextState *parent)
if (!cs)
goto error;
cs->display = dpy;
cs->window = parent ? parent->window : None;
if (parent) {
cs->display = parent->display;
cs->window = parent->window;
screen = DefaultScreen(parent->display);
}
else {
cs->display = dpy;
cs->window = None;
}
cs->visual = NULL;
cs->context = NULL;
cs->swapped_buffers = FALSE;
@ -327,14 +334,14 @@ gl_create_context(Display *dpy, int screen, GLContextState *parent)
if (fbconfig_id == GLX_DONT_CARE)
goto choose_fbconfig;
fbconfigs = glXGetFBConfigs(dpy, screen, &n_fbconfigs);
fbconfigs = glXGetFBConfigs(parent->display, screen, &n_fbconfigs);
if (!fbconfigs)
goto error;
/* Find out a GLXFBConfig compatible with the parent context */
for (n = 0; n < n_fbconfigs; n++) {
status = glXGetFBConfigAttrib(
dpy,
parent->display,
fbconfigs[n],
GLX_FBCONFIG_ID, &val
);
@ -347,7 +354,7 @@ gl_create_context(Display *dpy, int screen, GLContextState *parent)
else {
choose_fbconfig:
fbconfigs = glXChooseFBConfig(
dpy,
cs->display,
screen,
fbconfig_attrs, &n_fbconfigs
);
@ -358,9 +365,9 @@ gl_create_context(Display *dpy, int screen, GLContextState *parent)
n = 0;
}
cs->visual = glXGetVisualFromFBConfig(dpy, fbconfigs[n]);
cs->visual = glXGetVisualFromFBConfig(cs->display, fbconfigs[n]);
cs->context = glXCreateNewContext(
dpy,
cs->display,
fbconfigs[n],
GLX_RGBA_TYPE,
parent ? parent->context : NULL,