[Mesa-dev] [PATCH 01/20] st-api: Clean-up OpenGL profile handling

Brian Paul brianp at vmware.com
Tue Dec 20 14:50:47 PST 2011


On 12/20/2011 01:31 PM, Ian Romanick wrote:
> From: Ian Romanick<ian.d.romanick at intel.com>
>
> There seems to have been two different ways to communicate the
> profile.  There were flags and there were profiles.  I've opted to
> remove the profile flags and use ST_PROFILE_DEFAULT (compatibility
> profile) and ST_PROFILE_OPENGL_CORE (core profile) consistently
> instead.
>
> Also change the values of the ST_CONTEXT_FLAG_DEBUG and
> ST_CONTEXT_FLAG_FORWARD_COMPATIBLE flags to match the WGL and GLX
> values.
>
> Signed-off-by: Ian Romanick<ian.d.romanick at intel.com>
> ---
>   src/gallium/include/state_tracker/st_api.h   |   19 ++++++++++---------
>   src/gallium/state_trackers/glx/xlib/xm_api.c |   22 +++++++++++++++++-----
>   src/gallium/state_trackers/wgl/stw_context.c |   22 +++++++++++++++++-----
>   3 files changed, 44 insertions(+), 19 deletions(-)
>
> diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
> index f7cc243..3267cb2 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -57,10 +57,10 @@ enum st_api_type {
>    */
>   enum st_profile_type
>   {
> -   ST_PROFILE_DEFAULT,
> -   ST_PROFILE_OPENGL_CORE,
> -   ST_PROFILE_OPENGL_ES1,
> -   ST_PROFILE_OPENGL_ES2
> +   ST_PROFILE_DEFAULT,			/**<  OpenGL compatibility profile */
> +   ST_PROFILE_OPENGL_CORE,		/**<  OpenGL 3.2+ core profile */
> +   ST_PROFILE_OPENGL_ES1,		/**<  OpenGL ES 1.x */
> +   ST_PROFILE_OPENGL_ES2		/**<  OpenGL ES 2.0 */
>   };
>
>   /* for profile_mask in st_api */
> @@ -71,12 +71,13 @@ enum st_profile_type
>
>   /**
>    * New context flags for GL 3.0 and beyond.
> + *
> + * Profile information (core vs. compatibilty for OpenGL 3.2+) is communicated
> + * through the \c st_profile_type, not through flags.
>    */
> -#define ST_CONTEXT_FLAG_CORE_PROFILE        (1<<  0)
> -#define ST_CONTEXT_FLAG_COMPATIBLE_PROFILE  (1<<  1)
> -#define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE  (1<<  2)
> -#define ST_CONTEXT_FLAG_DEBUG               (1<<  3)
> -#define ST_CONTEXT_FLAG_ROBUST_ACCESS       (1<<  4)
> +#define ST_CONTEXT_FLAG_DEBUG               (1<<  0)
> +#define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE  (1<<  1)
> +#define ST_CONTEXT_FLAG_ROBUST_ACCESS       (1<<  2)
>
>   /**
>    * Used in st_context_iface->teximage.
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
> index 75e9e11..5d99e5f 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
> @@ -878,7 +878,6 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list,
>      c->xm_read_buffer = NULL;
>
>      memset(&attribs, 0, sizeof(attribs));
> -   attribs.profile = ST_PROFILE_DEFAULT;
>      attribs.visual = v->stvis;
>      attribs.major = major;
>      attribs.minor = minor;
> @@ -888,10 +887,23 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list,
>         attribs.flags |= ST_CONTEXT_FLAG_DEBUG;
>      if (contextFlags&  GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB)
>         attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS;
> -   if (profileMask&  GLX_CONTEXT_CORE_PROFILE_BIT_ARB)
> -      attribs.flags |= ST_CONTEXT_FLAG_CORE_PROFILE;
> -   if (profileMask&  GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB)
> -      attribs.flags |= ST_CONTEXT_FLAG_COMPATIBLE_PROFILE;
> +
> +   /* There are no profiles before OpenGL 3.2.  The
> +    * GLX_ARB_create_context_profile spec says:
> +    *
> +    *     "If the requested OpenGL version is less than 3.2,
> +    *     GLX_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the
> +    *     context is determined solely by the requested version."
> +    *
> +    * The spec also says:
> +    *
> +    *     "The default value for GLX_CONTEXT_PROFILE_MASK_ARB is
> +    *     GLX_CONTEXT_CORE_PROFILE_BIT_ARB."
> +    */
> +   attribs.profile = ST_PROFILE_DEFAULT;
> +   if ((major>  3 || (major == 3&&  minor>= 2))
> +&&  ((profileMask&  GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) == 0))
> +      attribs.profile = ST_PROFILE_OPENGL_CORE;
>
>      c->st = stapi->create_context(stapi, xmdpy->smapi,
>            &attribs, (share_list) ? share_list->st : NULL);
> diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c
> index 6cc8a83..2c4fb0e 100644
> --- a/src/gallium/state_trackers/wgl/stw_context.c
> +++ b/src/gallium/state_trackers/wgl/stw_context.c
> @@ -169,7 +169,6 @@ stw_create_context_attribs(
>      ctx->iPixelFormat = iPixelFormat;
>
>      memset(&attribs, 0, sizeof(attribs));
> -   attribs.profile = ST_PROFILE_DEFAULT;
>      attribs.visual = pfi->stvis;
>      attribs.major = majorVersion;
>      attribs.minor = minorVersion;
> @@ -177,10 +176,23 @@ stw_create_context_attribs(
>         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;
> +
> +   /* There are no profiles before OpenGL 3.2.  The
> +    * WGL_ARB_create_context_profile spec says:
> +    *
> +    *     "If the requested OpenGL version is less than 3.2,
> +    *     WGL_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the
> +    *     context is determined solely by the requested version."
> +    *
> +    * The spec also says:
> +    *
> +    *     "The default value for WGL_CONTEXT_PROFILE_MASK_ARB is
> +    *     WGL_CONTEXT_CORE_PROFILE_BIT_ARB."
> +    */
> +   attribs.profile = ST_PROFILE_DEFAULT;
> +   if ((major>  3 || (major == 3&&  minor>= 2))
> +&&  ((profileMask&  WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) == 0))
> +      attribs.profile = ST_PROFILE_OPENGL_CORE;
>
>      ctx->st = stw_dev->stapi->create_context(stw_dev->stapi,
>            stw_dev->smapi,&attribs, shareCtx ? shareCtx->st : NULL);

Olv should probably double-check this, but LGTM.

Reviewed-by: Brian Paul <brianp at vmware.com>



More information about the xorg-devel mailing list