[Mesa-dev] [PATCH] gallium: implement WGL_ARB_create_context
Jose Fonseca
jfonseca at vmware.com
Thu Oct 27 12:04:10 PDT 2011
Margan,
The code in the diff has wrapped-around and can't be applied automatically.
Please re-send the patch as an attachment.
Jose
----- Original Message -----
> Here is the modified patch. I just checked if it works but doesn't
> have a good test case for it. But I will write one for sure!
>
> ---
> 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 +
> src/gallium/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 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..6cc8a83 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,23 +126,41 @@ 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 0bbed84..07a5c7d 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 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.devel at 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 Mon, Oct 24, 2011 at 5:37 PM, Jose Fonseca <jfonseca at vmware.com>
> wrote:
> > Looks good to me. Just a few minor requests:
> > - The APIENTRY keyword in stw_create_context_attribs() is
> > unnecessary given it is an internal API.
> > - Please move the stw_create_context_attribs() immediately after
> > DrvCreateLayerContext so that the code doesn't move around so
> > much, and the diff is cleaner.
> >
> > BTW, do you have test case for this? It would be really good have
> > one in piglit and/or mesa demos.
> >
> > Jose
> >
> > ----- Original Message -----
> >> 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.devel at 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
> >> <jfonseca at 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
> >> >
> >>
> >
>
More information about the mesa-dev
mailing list