[Mesa-dev] [PATCH] glx: Allow to create any OpenGL ES version.

Ian Romanick idr at freedesktop.org
Mon Apr 13 14:59:46 PDT 2015


On 04/10/2015 03:36 PM, Jose Fonseca wrote:
> From: José Fonseca <jfonseca at vmware.com>
> 
> The latest version of GLX_EXT_create_context_es2_profile states:
> 
>   "If the version requested is a valid and supported OpenGL-ES version,
>   and the GLX_CONTEXT_ES_PROFILE_BIT_EXT bit is set in the
>   GLX_CONTEXT_PROFILE_MASK_ARB attribute (see below), then the context
>   returned will implement the OpenGL ES version requested."
> 
> We must also export EXT_create_context_es_profile too, as
> EXT_create_context_es2_profile specification is crystal clear:
> 
>   "NOTE: implementations of this extension must export BOTH extension
>   strings, for backwards compatibility with applications written
>   against version 1 of this extension."
> 
> Totally untested.  (Just happened to noticed this while implementing
> GLX_EXT_create_context_es2_profile for st/xlib.)
> 
> Reviewed-by: Brian Paul <brianp at vmware.com>
> Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
> 
> v2: Replicate the drisw_glx.c to dri2_glx.c and dri3_glx.c as suggested
> by Emil Velikov.
> ---
>  src/glx/dri2_glx.c   |  5 ++++-
>  src/glx/dri3_glx.c   |  5 ++++-
>  src/glx/dri_common.c | 32 ++++++++++++++++----------------
>  src/glx/drisw_glx.c  |  2 ++
>  4 files changed, 26 insertions(+), 18 deletions(-)
> 
> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
> index 462d560..8192c54 100644
> --- a/src/glx/dri2_glx.c
> +++ b/src/glx/dri2_glx.c
> @@ -1102,9 +1102,12 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv,
>        __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context");
>        __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile");
>  
> -      if ((mask & (1 << __DRI_API_GLES2)) != 0)
> +      if ((mask & (1 << __DRI_API_GLES2)) != 0) {
> +	 __glXEnableDirectExtension(&psc->base,
> +				    "GLX_EXT_create_context_es_profile");
>  	 __glXEnableDirectExtension(&psc->base,
>  				    "GLX_EXT_create_context_es2_profile");
> +      }
>     }
>  
>     for (i = 0; extensions[i]; i++) {
> diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
> index 1ddc723..6973ad1 100644
> --- a/src/glx/dri3_glx.c
> +++ b/src/glx/dri3_glx.c
> @@ -1825,9 +1825,12 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv,
>     __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context");
>     __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile");
>  
> -   if ((mask & (1 << __DRI_API_GLES2)) != 0)
> +   if ((mask & (1 << __DRI_API_GLES2)) != 0) {
> +      __glXEnableDirectExtension(&psc->base,
> +                                 "GLX_EXT_create_context_es_profile");
>        __glXEnableDirectExtension(&psc->base,
>                                   "GLX_EXT_create_context_es2_profile");
> +   }
>  
>     for (i = 0; extensions[i]; i++) {
>        /* when on a different gpu than the server, the server pixmaps
> diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
> index 63c8de3..541abbb 100644
> --- a/src/glx/dri_common.c
> +++ b/src/glx/dri_common.c
> @@ -544,9 +544,22 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
>        case GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB:
>  	 *api = __DRI_API_OPENGL;
>  	 break;
> -      case GLX_CONTEXT_ES2_PROFILE_BIT_EXT:
> -	 *api = __DRI_API_GLES2;
> -	 break;
> +      case GLX_CONTEXT_ES_PROFILE_BIT_EXT:
> +         switch (*major_ver) {
> +         case 3:
> +            *api = __DRI_API_GLES3;
> +            break;
> +         case 2:
> +            *api = __DRI_API_GLES2;
> +            break;
> +         case 1:
> +            *api = __DRI_API_GLES;
> +            break;
> +         default:
> +            *error = __DRI_CTX_ERROR_BAD_API;
> +            return false;
> +         }
> +         break;
>        default:
>  	 *error = __DRI_CTX_ERROR_BAD_API;
>  	 return false;
> @@ -577,19 +590,6 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
>        return false;
>     }
>  
> -   /* The GLX_EXT_create_context_es2_profile spec says:
> -    *
> -    *     "... If the version requested is 2.0, and the
> -    *     GLX_CONTEXT_ES2_PROFILE_BIT_EXT bit is set in the
> -    *     GLX_CONTEXT_PROFILE_MASK_ARB attribute (see below), then the context
> -    *     returned will implement OpenGL ES 2.0. This is the only way in which
> -    *     an implementation may request an OpenGL ES 2.0 context."
> -    */
> -   if (*api == __DRI_API_GLES2 && (*major_ver != 2 || *minor_ver != 0)) {
> -      *error = __DRI_CTX_ERROR_BAD_API;
> -      return false;
> -   }

I guess this text was removed from the extension spec, and now we rely
on some other layer detecting invalid versions (like 2.1)?

This patch combined with Chad's patch seems like it should work... I'm a
little confused why Waffle doesn't like it. :(

> -
>     *error = __DRI_CTX_ERROR_SUCCESS;
>     return true;
>  }
> diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
> index 749ceb0..b0be5d0 100644
> --- a/src/glx/drisw_glx.c
> +++ b/src/glx/drisw_glx.c
> @@ -617,6 +617,8 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
>        /* DRISW version >= 2 implies support for OpenGL ES 2.0.
>         */
>        __glXEnableDirectExtension(&psc->base,
> +				 "GLX_EXT_create_context_es_profile");
> +      __glXEnableDirectExtension(&psc->base,
>  				 "GLX_EXT_create_context_es2_profile");
>     }
>  
> 



More information about the mesa-dev mailing list