winex11: Fix wglCopyContext case where GLX contexts are missing.

This commit is contained in:
Chris Robinson 2008-02-25 12:23:48 -08:00 committed by Alexandre Julliard
parent b83abb6122
commit 14abaa5709
1 changed files with 34 additions and 5 deletions

View File

@ -1523,15 +1523,44 @@ BOOL X11DRV_wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask) {
* Up to now that works fine.
*
* The delayed GLX context creation could cause issues for wglCopyContext as it might get called
* when there is no GLX context yet. Warn the user about it and let him report a bug report.
* The chance this will cause problems is small as at the time of writing Wine has had OpenGL support
* for more than 7 years and this function has remained a stub ever since then.
* when there is no GLX context yet. The chance this will cause problems is small as at the time of
* writing Wine has had OpenGL support for more than 7 years and this function has remained a stub
* ever since then.
*/
if(!src->ctx || !dst->ctx) {
FIXME("No source or destination context available! This could indicate a Wine bug.\n");
return FALSE;
/* NOTE: As a special case, if both GLX contexts are NULL, that means
* neither WGL context was made current. In that case, both contexts
* are in a default state, so any copy would no-op.
*/
if(!src->ctx && !dst->ctx) {
TRACE("No source or destination contexts set. No-op.\n");
return TRUE;
}
if (!src->ctx) {
DWORD type = GetObjectType(src->hdc);
wine_tsx11_lock();
if(src->vis)
src->ctx = pglXCreateContext(gdi_display, src->vis, NULL, type == OBJ_MEMDC ? False : True);
else /* Create a GLX Context for a pbuffer */
src->ctx = pglXCreateNewContext(gdi_display, src->fmt->fbconfig, src->fmt->render_type, NULL, True);
TRACE(" created a delayed OpenGL context (%p)\n", src->ctx);
}
else if (!dst->ctx) {
DWORD type = GetObjectType(dst->hdc);
wine_tsx11_lock();
if(dst->vis)
dst->ctx = pglXCreateContext(gdi_display, dst->vis, NULL, type == OBJ_MEMDC ? False : True);
else /* Create a GLX Context for a pbuffer */
dst->ctx = pglXCreateNewContext(gdi_display, dst->fmt->fbconfig, dst->fmt->render_type, NULL, True);
TRACE(" created a delayed OpenGL context (%p)\n", dst->ctx);
}
}
else
wine_tsx11_lock();
pglXCopyContext(gdi_display, src->ctx, dst->ctx, mask);
wine_tsx11_unlock();
/* As opposed to wglCopyContext, glXCopyContext doesn't return anything, so hopefully we passed */
return TRUE;