Sorry about the missing file. Here is the patch taking into account your remarks.
--- src/gallium/state_trackers/wgl/SConscript | 1 + src/gallium/state_trackers/wgl/stw_context.c | 130 ++++++++++++-------- src/gallium/state_trackers/wgl/stw_context.h | 3 + src/gallium/state_trackers/wgl/stw_ext_context.c | 119 ++++++++++++++++++ .../state_trackers/wgl/stw_getprocaddress.c | 3 + 5 files changed, 207 insertions(+), 49 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 7cb953b..1014b45 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 c2839fe..152984a 100644 --- a/src/gallium/state_trackers/wgl/stw_context.c +++ b/src/gallium/state_trackers/wgl/stw_context.c @@ -27,6 +27,11 @@ #include <windows.h> +#define WGL_WGLEXT_PROTOTYPES + +#include <GL/gl.h> +#include <GL/wglext.h> + #include "pipe/p_compiler.h" #include "pipe/p_context.h" #include "pipe/p_state.h" @@ -121,55 +126,7 @@ DrvCreateLayerContext( HDC hdc, INT iLayerPlane ) { - int iPixelFormat; - const struct stw_pixelformat_info *pfi; - struct st_context_attribs attribs; - struct stw_context *ctx = 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 ); - - ctx = CALLOC_STRUCT( stw_context ); - if (ctx == NULL) - goto no_ctx; - - ctx->hdc = hdc; - ctx->iPixelFormat = iPixelFormat; - - memset(&attribs, 0, sizeof(attribs)); - attribs.profile = ST_PROFILE_DEFAULT; - attribs.visual = pfi->stvis; - - ctx->st = stw_dev->stapi->create_context(stw_dev->stapi, - stw_dev->smapi, &attribs, NULL); - if (ctx->st == NULL) - goto no_st_ctx; - - ctx->st->st_manager_private = (void *) ctx; - - pipe_mutex_lock( stw_dev->ctx_mutex ); - ctx->dhglrc = handle_table_add(stw_dev->ctx_table, ctx); - pipe_mutex_unlock( stw_dev->ctx_mutex ); - if (!ctx->dhglrc) - goto no_hglrc; - - return ctx->dhglrc; - -no_hglrc: - ctx->st->destroy(ctx->st); -no_st_ctx: - FREE(ctx); -no_ctx: - return 0; + return stw_create_context_attribs(hdc, iLayerPlane, 0, 1, 0, 0, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); } BOOL APIENTRY @@ -232,6 +189,81 @@ DrvReleaseContext( return TRUE; } +DHGLRC APIENTRY +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; + 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; + + ctx->hdc = hdc; + ctx->iPixelFormat = iPixelFormat; + + 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, shareCtx ? shareCtx->st : NULL); + if (ctx->st == NULL) + goto no_st_ctx; + + ctx->st->st_manager_private = (void *) ctx; + + pipe_mutex_lock( stw_dev->ctx_mutex ); + ctx->dhglrc = handle_table_add(stw_dev->ctx_table, ctx); + pipe_mutex_unlock( stw_dev->ctx_mutex ); + if (!ctx->dhglrc) + goto no_hglrc; + + return ctx->dhglrc; + +no_hglrc: + ctx->st->destroy(ctx->st); +no_st_ctx: + FREE(ctx); +no_ctx: + return 0; +} DHGLRC stw_get_current_context( void ) diff --git a/src/gallium/state_trackers/wgl/stw_context.h b/src/gallium/state_trackers/wgl/stw_context.h index 0bbed84..103768b 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 APIENTRY 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 0000000..a3470ac --- /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 <morgan.de...@gmail.com> + * + * 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 <windows.h> + +#define WGL_WGLEXT_PROTOTYPES + +#include <GL/gl.h> +#include <GL/wglext.h> + +#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 b0aef94..a1df44c 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 } }; -- 1.7.7.msysgit.1 On Wed, Oct 19, 2011 at 11:51 PM, Jose Fonseca <jfons...@vmware.com> wrote: > ----- Original Message ----- >> --- >> src/gallium/state_trackers/wgl/SConscript | 1 + >> src/gallium/state_trackers/wgl/stw_context.c | 39 >> ++++++++++++++++++-- >> .../state_trackers/wgl/stw_getprocaddress.c | 3 ++ >> src/gallium/state_trackers/wgl/stw_icd.h | 8 ++++ >> 4 files changed, 48 insertions(+), 3 deletions(-) >> >> diff --git a/src/gallium/state_trackers/wgl/SConscript >> b/src/gallium/state_trackers/wgl/SConscript >> index 7cb953b..1014b45 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', > > The file "stw_ext_context.c" was not included in the patch. Please add it and > resend. > >> '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 c2839fe..875d713 100644 >> --- a/src/gallium/state_trackers/wgl/stw_context.c >> +++ b/src/gallium/state_trackers/wgl/stw_context.c >> @@ -27,6 +27,11 @@ >> >> #include <windows.h> >> >> +#define WGL_WGLEXT_PROTOTYPES >> + >> +#include <GL/gl.h> >> +#include <GL/wglext.h> >> + >> #include "pipe/p_compiler.h" >> #include "pipe/p_context.h" >> #include "pipe/p_state.h" >> @@ -121,11 +126,23 @@ DrvCreateLayerContext( >> HDC hdc, >> INT iLayerPlane ) >> { >> + return DrvCreateContextAttribs(hdc, iLayerPlane, 0, 1, 0, 0, >> WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB); >> +} >> + >> +DHGLRC APIENTRY >> +DrvCreateContextAttribs( >> + HDC hdc, >> + INT iLayerPlane, >> + DHGLRC hShareContext, >> + int majorVersion, int minorVersion, >> + int contextFlags, int profileMask) >> +{ > > The Drv* prefix is for entrypoints that are part of the ICD. But don't think > that a "DrvCreateContextAttribs" has been defined by Microsoft as part of the > ICD. > > If so, please use a different funtion name, e.g., stw_create_context_attribs, > and declare in it stw_context.h, instead of stw_icd.h > > > Jose > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev