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

Ian Romanick idr at freedesktop.org
Tue Apr 14 09:22:14 PDT 2015


On 04/14/2015 08:36 AM, Emil Velikov wrote:
> On 14 April 2015 at 13:52, Jose Fonseca <jfonseca at vmware.com> wrote:
>> On 13/04/15 22:59, Ian Romanick wrote:
>>>
>>> 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)?
>>
>>
>> Yes, the spec replaced that with
>>
>>     "... 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."
>>
>> That is, GLX_EXT_create_context_es_profile effectively allows to create any
>> GLES version from 1.x to 3.x.
>>
>> And we never validated the minor version on src/glx/dri_common.c.
>>
>>>
>>> This patch combined with Chad's patch seems like it should work... I'm a
>>> little confused why Waffle doesn't like it. :(
>>
>>
>> I tried to repro, but my main development machine has native NVIDIA drivers
>> (no DRI), and somehow swrast refuses to load, even with gles2.
>>
>>
>> Maybe this is what's missing:
>>
>> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
>> index 8192c54..192525a 100644
>> --- a/src/glx/dri2_glx.c
>> +++ b/src/glx/dri2_glx.c
>> @@ -1102,7 +1102,7 @@ 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) | (1 << __DRI_API_GLES3))) != 0)

Since ES3 is a superset of ES2, this shouldn't be necessary.  I can't
imagine a driver only setting __DRI_API_GLES3... and the common code may
not even make that possible.  We could, however, enable
GLX_EXT_create_context_es2_profile if only __DRI_API_GLES is set.  I
don't really feel like testing any drivers that only support ES 1.x, do
you? :)

>> {
>>          __glXEnableDirectExtension(&psc->base,
>>                                     "GLX_EXT_create_context_es_profile");
>>          __glXEnableDirectExtension(&psc->base,
>> diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
>> index 6973ad1..a8ef8b5 100644
>> --- a/src/glx/dri3_glx.c
>> +++ b/src/glx/dri3_glx.c
>> @@ -1825,7 +1825,7 @@ 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) | (1 << __DRI_API_GLES3)) != 0) {
>>        __glXEnableDirectExtension(&psc->base,
>>                                   "GLX_EXT_create_context_es_profile");
>>        __glXEnableDirectExtension(&psc->base,
>>
>>
> After a bit of looking around it seems that we due to
> glXCreateContextAttribsARB's
> xcb_glx_create_context_attribs_arb_checked().
> So I've skimmed through the xserver's glx/createcontext.c which seems
> to explicitly error out if the version is different from 2.0
> 
>     case GLX_CONTEXT_ES2_PROFILE_BIT_EXT:
> ...
>         if (major_version != 2 || minor_version != 0)
>             return __glXError(GLXBadProfileARB);

Ah... that is the problem.  I forgot that there was actually server
support necessary for the extension.  I think we should do the following:

1. I believe we can remove the hack that Chad mentioned if we also
change the availability of  GLX_EXT_create_context_es2_profile on server
support.  I'll submit a patch for that.

2. Modify Chad's patch to use a separate bit for
GLX_EXT_create_context_es_profile, and configure it the same way as
GLX_EXT_create_context_es2_profile (i.e., require server support).

3. Add support for GLX_EXT_create_context_es_profile to the server.  I
can write a compile-tested patch for that, but I won't have an
opportunity to really test it in the near future.

4. Update the GLX_EXT_create_context_es2_profile to be aware of
GLX_EXT_create_context_es_profile.

> I'm leaning that we need Jose's patch above (apart from updating the
> xserver), although perhaps we should handle  __DRI_API_GLES and drisw
> as well ?
> 
> Now if we can find a brave soul to rebuild xserver, as I cannot really
> mock around with mine atm that would be great :-) A small side note
> piglit's glx_arb_create_context tests might need an update (there
> might be a regression or two depending on how lucky we are).
> 
> 
> Cheers,
> Emil



More information about the mesa-dev mailing list