From 0c6a2c78fdd8b4ae620a9f449cab65c4be21a9a1 Mon Sep 17 00:00:00 2001 From: Morgan Armand Date: Fri, 28 Oct 2011 06:42:29 -0700 Subject: [PATCH] implement WGL_ARB_create_context MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: José Fonseca --- src/gallium/state_trackers/wgl/SConscript | 1 + src/gallium/state_trackers/wgl/stw_context.c | 47 +++++-- src/gallium/state_trackers/wgl/stw_context.h | 3 + .../state_trackers/wgl/stw_ext_context.c | 119 ++++++++++++++++++ .../state_trackers/wgl/stw_getprocaddress.c | 3 + 5 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 src/gallium/state_trackers/wgl/stw_ext_context.c diff --git a/src/gallium/state_trackers/wgl/SConscript b/src/gallium/state_trackers/wgl/SConscript index 7cb953ba742..1014b45c367 100644 --- a/src/gallium/state_trackers/wgl/SConscript +++ b/src/gallium/state_trackers/wgl/SConscript @@ -22,6 +22,7 @@ if not env['gles']: sources = [ 'stw_context.c', 'stw_device.c', + 'stw_ext_context.c', 'stw_ext_extensionsstring.c', 'stw_ext_gallium.c', 'stw_ext_pbuffer.c', diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c index c2839fe815f..6cc8a83150c 100644 --- a/src/gallium/state_trackers/wgl/stw_context.c +++ b/src/gallium/state_trackers/wgl/stw_context.c @@ -27,6 +27,11 @@ #include +#define WGL_WGLEXT_PROTOTYPES + +#include +#include + #include "pipe/p_compiler.h" #include "pipe/p_context.h" #include "pipe/p_state.h" @@ -120,24 +125,42 @@ DHGLRC APIENTRY DrvCreateLayerContext( HDC hdc, INT iLayerPlane ) +{ + return stw_create_context_attribs(hdc, iLayerPlane, 0, 1, 0, 0, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); +} + +DHGLRC +stw_create_context_attribs( + HDC hdc, + INT iLayerPlane, + DHGLRC hShareContext, + int majorVersion, int minorVersion, + int contextFlags, int profileMask) { int iPixelFormat; const struct stw_pixelformat_info *pfi; struct st_context_attribs attribs; struct stw_context *ctx = NULL; - - if(!stw_dev) + struct stw_context *shareCtx = NULL; + + if (!stw_dev) return 0; - + if (iLayerPlane != 0) return 0; iPixelFormat = GetPixelFormat(hdc); if(!iPixelFormat) return 0; - + pfi = stw_pixelformat_get_info( iPixelFormat - 1 ); - + + if (hShareContext != 0) { + pipe_mutex_lock( stw_dev->ctx_mutex ); + shareCtx = stw_lookup_context_locked( hShareContext ); + pipe_mutex_unlock( stw_dev->ctx_mutex ); + } + ctx = CALLOC_STRUCT( stw_context ); if (ctx == NULL) goto no_ctx; @@ -148,10 +171,20 @@ DrvCreateLayerContext( memset(&attribs, 0, sizeof(attribs)); attribs.profile = ST_PROFILE_DEFAULT; attribs.visual = pfi->stvis; + attribs.major = majorVersion; + attribs.minor = minorVersion; + if (contextFlags & WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) + attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE; + if (contextFlags & WGL_CONTEXT_DEBUG_BIT_ARB) + attribs.flags |= ST_CONTEXT_FLAG_DEBUG; + if (profileMask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB) + attribs.flags |= ST_CONTEXT_FLAG_CORE_PROFILE; + if (profileMask & WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) + attribs.flags |= ST_CONTEXT_FLAG_COMPATIBLE_PROFILE; ctx->st = stw_dev->stapi->create_context(stw_dev->stapi, - stw_dev->smapi, &attribs, NULL); - if (ctx->st == NULL) + stw_dev->smapi, &attribs, shareCtx ? shareCtx->st : NULL); + if (ctx->st == NULL) goto no_st_ctx; ctx->st->st_manager_private = (void *) ctx; diff --git a/src/gallium/state_trackers/wgl/stw_context.h b/src/gallium/state_trackers/wgl/stw_context.h index 0bbed84104a..07a5c7d15ec 100644 --- a/src/gallium/state_trackers/wgl/stw_context.h +++ b/src/gallium/state_trackers/wgl/stw_context.h @@ -43,6 +43,9 @@ struct stw_context struct stw_framebuffer *current_framebuffer; }; +DHGLRC stw_create_context_attribs( HDC hdc, INT iLayerPlane, DHGLRC hShareContext, + int majorVersion, int minorVersion, int contextFlags, int profileMask ); + DHGLRC stw_get_current_context( void ); HDC stw_get_current_dc( void ); diff --git a/src/gallium/state_trackers/wgl/stw_ext_context.c b/src/gallium/state_trackers/wgl/stw_ext_context.c new file mode 100644 index 00000000000..a3470ac35a5 --- /dev/null +++ b/src/gallium/state_trackers/wgl/stw_ext_context.c @@ -0,0 +1,119 @@ +/* + * Mesa 3-D graphics library + * Version: 7.11 + * + * Copyright (C) 2011 Morgan Armand + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#define WGL_WGLEXT_PROTOTYPES + +#include +#include + +#include "stw_icd.h" +#include "stw_context.h" + +HGLRC WINAPI +wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList) +{ + int majorVersion = 1, minorVersion = 0, layerPlane = 0; + int contextFlags = 0x0; + int profileMask = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; + int i; + BOOL done = FALSE; + + /* parse attrib_list */ + if (attribList) { + for (i = 0; !done && attribList[i]; i++) { + switch (attribList[i]) { + case WGL_CONTEXT_MAJOR_VERSION_ARB: + majorVersion = attribList[++i]; + break; + case WGL_CONTEXT_MINOR_VERSION_ARB: + minorVersion = attribList[++i]; + break; + case WGL_CONTEXT_LAYER_PLANE_ARB: + layerPlane = attribList[++i]; + break; + case WGL_CONTEXT_FLAGS_ARB: + contextFlags = attribList[++i]; + break; + case WGL_CONTEXT_PROFILE_MASK_ARB: + profileMask = attribList[++i]; + break; + case 0: + /* end of list */ + done = TRUE; + break; + default: + /* bad attribute */ + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + } + } + + /* check version (generate ERROR_INVALID_VERSION_ARB if bad) */ + switch (majorVersion) { + case 1: + if (minorVersion < 0 || minorVersion > 5) { + SetLastError(ERROR_INVALID_VERSION_ARB); + return NULL; + } + break; + case 2: + if (minorVersion < 0 || minorVersion > 1) { + SetLastError(ERROR_INVALID_VERSION_ARB); + return NULL; + } + break; + case 3: + if (minorVersion < 0 || minorVersion > 3) { + SetLastError(ERROR_INVALID_VERSION_ARB); + return NULL; + } + break; + case 4: + if (minorVersion < 0 || minorVersion > 2) { + SetLastError(ERROR_INVALID_VERSION_ARB); + return NULL; + } + break; + default: + return NULL; + } + + if ((contextFlags & WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) && majorVersion < 3) { + SetLastError(ERROR_INVALID_VERSION_ARB); + return NULL; + } + + /* check profileMask */ + if (profileMask != WGL_CONTEXT_CORE_PROFILE_BIT_ARB && + profileMask != WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) { + SetLastError(ERROR_INVALID_PROFILE_ARB); + return NULL; + } + + return (HGLRC) stw_create_context_attribs( hDC, layerPlane, (DHGLRC)(UINT_PTR)hShareContext, + majorVersion, minorVersion, contextFlags, profileMask ); +} diff --git a/src/gallium/state_trackers/wgl/stw_getprocaddress.c b/src/gallium/state_trackers/wgl/stw_getprocaddress.c index b0aef943d30..a1df44c53d4 100644 --- a/src/gallium/state_trackers/wgl/stw_getprocaddress.c +++ b/src/gallium/state_trackers/wgl/stw_getprocaddress.c @@ -73,6 +73,9 @@ static const struct stw_extension_entry stw_extension_entries[] = { STW_EXTENSION_ENTRY( wglGetGalliumScreenMESA ), STW_EXTENSION_ENTRY( wglCreateGalliumContextMESA ), + /* WGL_ARB_create_context */ + STW_EXTENSION_ENTRY( wglCreateContextAttribsARB ), + { NULL, NULL } }; -- 2.30.2