[Mesa-dev] [PATCH 02/12] mesa: Rearrange array type checking, filter more types in ES

Ian Romanick idr at freedesktop.org
Thu Aug 23 08:45:47 PDT 2012


On 08/23/2012 12:00 AM, Kenneth Graunke wrote:
> On 08/22/2012 07:26 PM, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>>   src/mesa/main/varray.c |   28 +++++++++++++++++++---------
>>   1 files changed, 19 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
>> index 327fabb..36d0eb8 100644
>> --- a/src/mesa/main/varray.c
>> +++ b/src/mesa/main/varray.c
>> @@ -133,16 +133,26 @@ update_array(struct gl_context *ctx,
>>      GLsizei elementSize;
>>      GLenum format = GL_RGBA;
>>
>> -   if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) {
>> -      /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */
>> +   if (ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2) {
>
> if (_mesa_is_gles(ctx)) {

Right.  Most of the patches in this series are pretty old, so they 
predate the existence of that function.  I converted most, but I 
obviously missed some.

>> +      /* Once Mesa gets support for GL_OES_vertex_half_float this mask will
>> +       * change.  Adding support for this extension isn't quite as trivial as
>> +       * we'd like because ES uses a different enum value for GL_HALF_FLOAT.
>> +       */
>> +      legalTypesMask &= ~(FIXED_GL_BIT
>> +                          | UNSIGNED_INT_2_10_10_10_REV_BIT
>> +                          | INT_2_10_10_10_REV_BIT
>> +                          | HALF_BIT | DOUBLE_BIT);
>> +   } else {
>> +      assert(ctx->API == API_OPENGL);
>
> I believe this assertion is wrong.  Both VertexAttribPointer and
> VertexAttribIPointer call update_arrays, and neither of those functions
> are deprecated.  So it's possible to get here from API_OPENGL_CORE.
>
> I would just remove it.

Yeah.  When I wrote that assertion there was no API_OPENGL_CORE.

>> +
>>         legalTypesMask &= ~FIXED_ES_BIT;
>> -   }
>> -   if (!ctx->Extensions.ARB_ES2_compatibility) {
>> -      legalTypesMask &= ~FIXED_GL_BIT;
>> -   }
>> -   if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
>> -      legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
>> -                          INT_2_10_10_10_REV_BIT);
>> +
>> +      if (!ctx->Extensions.ARB_ES2_compatibility)
>> +         legalTypesMask &= ~FIXED_GL_BIT;
>> +
>> +      if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev)
>> +         legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
>> +                             INT_2_10_10_10_REV_BIT);
>>      }
>>
>>      typeBit = type_to_bit(ctx, type);
>>
>
> This is also not a mere refactor---unless I'm reading something wrong,
> it changes behavior rather substantially.
>
> Consider the old code:
>
>     if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) {
>        /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */
>        legalTypesMask &= ~FIXED_ES_BIT;
>     }
>     if (!ctx->Extensions.ARB_ES2_compatibility) {
>        legalTypesMask &= ~FIXED_GL_BIT;
>     }
>
> In the API_OPENGL case, the first conditional would mask out
> FIXED_ES_BIT, disallowing it even if ARB_ES2_compatibility was
> supported.  Your new code allows it, which is a bug fix.  (The
> ARB_ES2_compatibility spec explicitly allows GL_FIXED with
> VertexAttribPointer.)

Not exactly.  FIXED_ES_BIT and FIXED_GL_BIT are generated depending on 
the context API.

    case GL_FIXED:
       return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT;

In a non-ES context, FIXED_ES_BIT should be impossible, and likewise for 
FIXED_GL_BIT in an ES context.  It's weird, and I don't understand why 
it is the way it is.  I didn't want to change it in this series, and I 
forgot about it after writing these patches.

> In the API_OPENGLES (1 or 2) case, if the driver supports
> ARB_ES2_compatibility, the second conditional would /still/ mask out
> FIXED_ES_BIT, disallowing it even on ES!  Your new code correctly allows
> that (another serious bug fix).
>
> So unless I'm misreading it, the old code was just completely broken
> regarding GL_FIXED data, and your new code is reasonable and fixes it.
> I believe at least a comment in the commit message is in order; maybe
> even a mark for stable?  (Unless GL_FIXED is just totally broken
> elsewhere and allowing it through here causes worse bugs...)


More information about the mesa-dev mailing list