Alexandre Julliard : winex11: Get the current pixel format from the drawable structure in wglCreateContextAttribsARB .
Alexandre Julliard
julliard at winehq.org
Fri Sep 7 13:26:21 CDT 2012
Module: wine
Branch: master
Commit: d52c2de7dad0a5f0f9cbcc5115360028f390d4a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d52c2de7dad0a5f0f9cbcc5115360028f390d4a7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Sep 7 16:19:06 2012 +0200
winex11: Get the current pixel format from the drawable structure in wglCreateContextAttribsARB.
---
dlls/winex11.drv/opengl.c | 93 +++++++++++++++++++-------------------------
1 files changed, 40 insertions(+), 53 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index dccee22..97055ae 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1880,90 +1880,77 @@ static void wglFlush(void)
static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wgl_context *hShareContext,
const int* attribList )
{
- struct x11drv_escape_get_drawable escape;
- struct wgl_context *ret;
- const struct wgl_pixel_format *fmt;
+ struct wgl_context *ret = NULL;
+ struct gl_drawable *gl;
+ HWND hwnd = WindowFromDC( hdc );
TRACE("(%p %p %p)\n", hdc, hShareContext, attribList);
- escape.code = X11DRV_GET_DRAWABLE;
- if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape.code), (LPCSTR)&escape.code,
- sizeof(escape), (LPSTR)&escape ))
- return 0;
-
- fmt = get_pixel_format(gdi_display, escape.pixel_format, TRUE /* Offscreen */);
- /* wglCreateContextAttribsARB supports ALL pixel formats, so also offscreen ones.
- * If this fails something is very wrong on the system. */
- if(!fmt)
- {
- ERR("Cannot get FB Config for iPixelFormat %d, expect problems!\n", escape.pixel_format);
- SetLastError(ERROR_INVALID_PIXEL_FORMAT);
- return NULL;
- }
-
- if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) return 0;
-
- ret->hdc = hdc;
- ret->fmt = fmt;
- ret->vis = NULL; /* glXCreateContextAttribsARB requires a fbconfig instead of a visual */
- ret->gl3_context = TRUE;
+ EnterCriticalSection( &context_section );
- ret->numAttribs = 0;
- if(attribList)
+ if (!XFindContext( gdi_display, (XID)hwnd, gl_hwnd_context, (char **)&gl ) ||
+ !XFindContext( gdi_display, (XID)hdc, gl_pbuffer_context, (char **)&gl ))
{
- int *pAttribList = (int*)attribList;
- int *pContextAttribList = &ret->attribList[0];
- /* attribList consists of pairs {token, value] terminated with 0 */
- while(pAttribList[0] != 0)
+ if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) goto done;
+ ret->hdc = hdc;
+ ret->fmt = gl->format;
+ ret->vis = NULL; /* glXCreateContextAttribsARB requires a fbconfig instead of a visual */
+ ret->gl3_context = TRUE;
+ ret->numAttribs = 0;
+ if (attribList)
{
- TRACE("%#x %#x\n", pAttribList[0], pAttribList[1]);
- switch(pAttribList[0])
+ int *pContextAttribList = &ret->attribList[0];
+ /* attribList consists of pairs {token, value] terminated with 0 */
+ while(attribList[0] != 0)
{
+ TRACE("%#x %#x\n", attribList[0], attribList[1]);
+ switch(attribList[0])
+ {
case WGL_CONTEXT_MAJOR_VERSION_ARB:
pContextAttribList[0] = GLX_CONTEXT_MAJOR_VERSION_ARB;
- pContextAttribList[1] = pAttribList[1];
+ pContextAttribList[1] = attribList[1];
break;
case WGL_CONTEXT_MINOR_VERSION_ARB:
pContextAttribList[0] = GLX_CONTEXT_MINOR_VERSION_ARB;
- pContextAttribList[1] = pAttribList[1];
+ pContextAttribList[1] = attribList[1];
break;
case WGL_CONTEXT_LAYER_PLANE_ARB:
break;
case WGL_CONTEXT_FLAGS_ARB:
pContextAttribList[0] = GLX_CONTEXT_FLAGS_ARB;
- pContextAttribList[1] = pAttribList[1];
+ pContextAttribList[1] = attribList[1];
break;
case WGL_CONTEXT_PROFILE_MASK_ARB:
pContextAttribList[0] = GLX_CONTEXT_PROFILE_MASK_ARB;
- pContextAttribList[1] = pAttribList[1];
+ pContextAttribList[1] = attribList[1];
break;
default:
- ERR("Unhandled attribList pair: %#x %#x\n", pAttribList[0], pAttribList[1]);
+ ERR("Unhandled attribList pair: %#x %#x\n", attribList[0], attribList[1]);
+ }
+ ret->numAttribs++;
+ attribList += 2;
+ pContextAttribList += 2;
}
-
- ret->numAttribs++;
- pAttribList += 2;
- pContextAttribList += 2;
}
- }
-
- X11DRV_expect_error(gdi_display, GLXErrorHandler, NULL);
- ret->ctx = create_glxcontext(gdi_display, ret, NULL);
- XSync(gdi_display, False);
- if(X11DRV_check_error() || !ret->ctx)
- {
+ X11DRV_expect_error(gdi_display, GLXErrorHandler, NULL);
+ ret->ctx = create_glxcontext(gdi_display, ret, NULL);
+ XSync(gdi_display, False);
+ if (!X11DRV_check_error() && ret->ctx)
+ {
+ list_add_head( &context_list, &ret->entry );
+ goto done;
+ }
/* In the future we should convert the GLX error to a win32 one here if needed */
ERR("Context creation failed\n");
HeapFree( GetProcessHeap(), 0, ret );
- return NULL;
+ ret = NULL;
}
+ else SetLastError( ERROR_INVALID_PIXEL_FORMAT );
- EnterCriticalSection( &context_section );
- list_add_head( &context_list, &ret->entry );
+done:
LeaveCriticalSection( &context_section );
-
- TRACE(" creating context %p\n", ret);
+ TRACE( "%p -> %p\n", hdc, ret );
return ret;
}
More information about the wine-cvs
mailing list