winex11: Get the current pixel format from the drawable structure in wglCreateContextAttribsARB.
This commit is contained in:
parent
c01d723a4f
commit
d52c2de7da
|
@ -1880,90 +1880,77 @@ static void wglFlush(void)
|
||||||
static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wgl_context *hShareContext,
|
static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wgl_context *hShareContext,
|
||||||
const int* attribList )
|
const int* attribList )
|
||||||
{
|
{
|
||||||
struct x11drv_escape_get_drawable escape;
|
struct wgl_context *ret = NULL;
|
||||||
struct wgl_context *ret;
|
struct gl_drawable *gl;
|
||||||
const struct wgl_pixel_format *fmt;
|
HWND hwnd = WindowFromDC( hdc );
|
||||||
|
|
||||||
TRACE("(%p %p %p)\n", hdc, hShareContext, attribList);
|
TRACE("(%p %p %p)\n", hdc, hShareContext, attribList);
|
||||||
|
|
||||||
escape.code = X11DRV_GET_DRAWABLE;
|
EnterCriticalSection( &context_section );
|
||||||
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 */);
|
if (!XFindContext( gdi_display, (XID)hwnd, gl_hwnd_context, (char **)&gl ) ||
|
||||||
/* wglCreateContextAttribsARB supports ALL pixel formats, so also offscreen ones.
|
!XFindContext( gdi_display, (XID)hdc, gl_pbuffer_context, (char **)&gl ))
|
||||||
* 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);
|
if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) goto done;
|
||||||
SetLastError(ERROR_INVALID_PIXEL_FORMAT);
|
ret->hdc = hdc;
|
||||||
return NULL;
|
ret->fmt = gl->format;
|
||||||
}
|
ret->vis = NULL; /* glXCreateContextAttribsARB requires a fbconfig instead of a visual */
|
||||||
|
ret->gl3_context = TRUE;
|
||||||
if (!(ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)))) return 0;
|
ret->numAttribs = 0;
|
||||||
|
if (attribList)
|
||||||
ret->hdc = hdc;
|
|
||||||
ret->fmt = fmt;
|
|
||||||
ret->vis = NULL; /* glXCreateContextAttribsARB requires a fbconfig instead of a visual */
|
|
||||||
ret->gl3_context = TRUE;
|
|
||||||
|
|
||||||
ret->numAttribs = 0;
|
|
||||||
if(attribList)
|
|
||||||
{
|
|
||||||
int *pAttribList = (int*)attribList;
|
|
||||||
int *pContextAttribList = &ret->attribList[0];
|
|
||||||
/* attribList consists of pairs {token, value] terminated with 0 */
|
|
||||||
while(pAttribList[0] != 0)
|
|
||||||
{
|
{
|
||||||
TRACE("%#x %#x\n", pAttribList[0], pAttribList[1]);
|
int *pContextAttribList = &ret->attribList[0];
|
||||||
switch(pAttribList[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:
|
case WGL_CONTEXT_MAJOR_VERSION_ARB:
|
||||||
pContextAttribList[0] = GLX_CONTEXT_MAJOR_VERSION_ARB;
|
pContextAttribList[0] = GLX_CONTEXT_MAJOR_VERSION_ARB;
|
||||||
pContextAttribList[1] = pAttribList[1];
|
pContextAttribList[1] = attribList[1];
|
||||||
break;
|
break;
|
||||||
case WGL_CONTEXT_MINOR_VERSION_ARB:
|
case WGL_CONTEXT_MINOR_VERSION_ARB:
|
||||||
pContextAttribList[0] = GLX_CONTEXT_MINOR_VERSION_ARB;
|
pContextAttribList[0] = GLX_CONTEXT_MINOR_VERSION_ARB;
|
||||||
pContextAttribList[1] = pAttribList[1];
|
pContextAttribList[1] = attribList[1];
|
||||||
break;
|
break;
|
||||||
case WGL_CONTEXT_LAYER_PLANE_ARB:
|
case WGL_CONTEXT_LAYER_PLANE_ARB:
|
||||||
break;
|
break;
|
||||||
case WGL_CONTEXT_FLAGS_ARB:
|
case WGL_CONTEXT_FLAGS_ARB:
|
||||||
pContextAttribList[0] = GLX_CONTEXT_FLAGS_ARB;
|
pContextAttribList[0] = GLX_CONTEXT_FLAGS_ARB;
|
||||||
pContextAttribList[1] = pAttribList[1];
|
pContextAttribList[1] = attribList[1];
|
||||||
break;
|
break;
|
||||||
case WGL_CONTEXT_PROFILE_MASK_ARB:
|
case WGL_CONTEXT_PROFILE_MASK_ARB:
|
||||||
pContextAttribList[0] = GLX_CONTEXT_PROFILE_MASK_ARB;
|
pContextAttribList[0] = GLX_CONTEXT_PROFILE_MASK_ARB;
|
||||||
pContextAttribList[1] = pAttribList[1];
|
pContextAttribList[1] = attribList[1];
|
||||||
break;
|
break;
|
||||||
default:
|
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);
|
X11DRV_expect_error(gdi_display, GLXErrorHandler, NULL);
|
||||||
ret->ctx = create_glxcontext(gdi_display, ret, NULL);
|
ret->ctx = create_glxcontext(gdi_display, ret, NULL);
|
||||||
|
XSync(gdi_display, False);
|
||||||
XSync(gdi_display, False);
|
if (!X11DRV_check_error() && ret->ctx)
|
||||||
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 */
|
/* In the future we should convert the GLX error to a win32 one here if needed */
|
||||||
ERR("Context creation failed\n");
|
ERR("Context creation failed\n");
|
||||||
HeapFree( GetProcessHeap(), 0, ret );
|
HeapFree( GetProcessHeap(), 0, ret );
|
||||||
return NULL;
|
ret = NULL;
|
||||||
}
|
}
|
||||||
|
else SetLastError( ERROR_INVALID_PIXEL_FORMAT );
|
||||||
|
|
||||||
EnterCriticalSection( &context_section );
|
done:
|
||||||
list_add_head( &context_list, &ret->entry );
|
|
||||||
LeaveCriticalSection( &context_section );
|
LeaveCriticalSection( &context_section );
|
||||||
|
TRACE( "%p -> %p\n", hdc, ret );
|
||||||
TRACE(" creating context %p\n", ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue