[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