On 04/10/2015 03:36 PM, Jose Fonseca wrote:
> From: José Fonseca <jfons...@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 <bri...@vmware.com>
> Reviewed-by: Emil Velikov <emil.l.veli...@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");
>     }
>  
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to