[Mesa-dev] [PATCH] mesa: make vertex array type error checking a little more efficient
Brian Paul
brianp at vmware.com
Wed Aug 6 06:44:37 PDT 2014
On 08/05/2014 10:35 AM, Roland Scheidegger wrote:
> Am 30.07.2014 19:08, schrieb Brian Paul:
>> Compute the bitmask of supported array types once instead of every
>> time we call a GL vertex array function.
>> ---
>> src/mesa/main/mtypes.h | 3 ++
>> src/mesa/main/varray.c | 86 +++++++++++++++++++++++++++++++-----------------
>> 2 files changed, 59 insertions(+), 30 deletions(-)
>>
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 3f60a55..f5ce360 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -1693,6 +1693,9 @@ struct gl_array_attrib
>>
>> /** One of the DRAW_xxx flags, not consumed by drivers */
>> gl_draw_method DrawMethod;
>> +
>> + /** Legal array datatypes */
>> + GLbitfield LegalTypesMask;
>> };
>>
>>
>> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
>> index 46956ef..0356858 100644
>> --- a/src/mesa/main/varray.c
>> +++ b/src/mesa/main/varray.c
>> @@ -179,6 +179,53 @@ vertex_binding_divisor(struct gl_context *ctx, GLuint bindingIndex,
>>
>>
>> /**
>> + * Examine the API profile and extensions to determine which types are legal
>> + * for vertex arrays. This is called once from update_array_format().
>> + */
>> +static GLbitfield
>> +get_legal_types_mask(const struct gl_context *ctx)
>> +{
>> + GLbitfield legalTypesMask = ~0u; /* all */
> I think it would be better to list all possible values explicitly here,
> otherwise you have lots of impossible bits in there in the end. It
> should not make any difference really, though for instance for debugging
> the legalTypesMask might look a little confusing otherwise.
OK, I can do that in a follow-up.
>
>> +
>> + if (_mesa_is_gles(ctx)) {
>> + legalTypesMask &= ~(FIXED_GL_BIT |
>> + DOUBLE_BIT |
>> + UNSIGNED_INT_10F_11F_11F_REV_BIT);
>> +
>> + /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
>> + * 3.0. The 2_10_10_10 types are added in OpenGL ES 3.0 or
>> + * GL_OES_vertex_type_10_10_10_2. GL_HALF_FLOAT data is not allowed
>> + * until 3.0 or with the GL_OES_vertex_half float extension, which isn't
>> + * quite as trivial as we'd like because it uses a different enum value
>> + * for GL_HALF_FLOAT_OES.
>> + */
>> + if (ctx->Version < 30) {
>> + legalTypesMask &= ~(UNSIGNED_INT_BIT |
>> + INT_BIT |
>> + UNSIGNED_INT_2_10_10_10_REV_BIT |
>> + INT_2_10_10_10_REV_BIT |
>> + HALF_BIT);
>> + }
>> + }
>> + else {
>> + 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_vertex_type_10f_11f_11f_rev)
>> + legalTypesMask &= ~UNSIGNED_INT_10F_11F_11F_REV_BIT;
>> + }
>> +
>> + return legalTypesMask;
>> +}
>> +
>> +
>> +/**
>> * Does error checking and updates the format in an attrib array.
>> *
>> * Called by update_array() and VertexAttrib*Format().
>> @@ -208,40 +255,19 @@ update_array_format(struct gl_context *ctx,
>> GLuint elementSize;
>> GLenum format = GL_RGBA;
>>
>> - if (_mesa_is_gles(ctx)) {
>> - legalTypesMask &= ~(FIXED_GL_BIT | DOUBLE_BIT | UNSIGNED_INT_10F_11F_11F_REV_BIT);
>> -
>> - /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
>> - * 3.0. The 2_10_10_10 types are added in OpenGL ES 3.0 or
>> - * GL_OES_vertex_type_10_10_10_2. GL_HALF_FLOAT data is not allowed
>> - * until 3.0 or with the GL_OES_vertex_half float extension, which isn't
>> - * quite as trivial as we'd like because it uses a different enum value
>> - * for GL_HALF_FLOAT_OES.
>> + if (ctx->Array.LegalTypesMask == 0) {
>> + /* One-time initialization. We can't do this in _mesa_init_varrays()
>> + * below because extensions are not yet enabled at that point.
>> */
>> - if (ctx->Version < 30) {
>> - legalTypesMask &= ~(UNSIGNED_INT_BIT
>> - | INT_BIT
>> - | UNSIGNED_INT_2_10_10_10_REV_BIT
>> - | INT_2_10_10_10_REV_BIT
>> - | HALF_BIT);
>> - }
>> + ctx->Array.LegalTypesMask = get_legal_types_mask(ctx);
>> + }
>> +
>> + legalTypesMask &= ctx->Array.LegalTypesMask;
>>
>> + if (_mesa_is_gles(ctx) && sizeMax == BGRA_OR_4) {
>> /* BGRA ordering is not supported in ES contexts.
>> */
>> - if (sizeMax == BGRA_OR_4)
>> - sizeMax = 4;
>> - } else {
>> - 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_vertex_type_10f_11f_11f_rev)
>> - legalTypesMask &= ~UNSIGNED_INT_10F_11F_11F_REV_BIT;
>> + sizeMax = 4;
>> }
>>
>> typeBit = type_to_bit(ctx, type);
>>
>
> Otherwise,
>
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
>
> Did this have a measurable impact somewhere?
I didn't measure anything. It just seemed silly to recompute this for
every vertex array call.
-Brian
More information about the mesa-dev
mailing list