[Mesa-dev] [PATCH 4/7] mesa: Convert some runtime asserts to static asserts.

Dave Airlie airlied at gmail.com
Sun Sep 22 13:53:53 PDT 2013


On Sun, Sep 22, 2013 at 12:57 AM, Brian Paul <brian.e.paul at gmail.com> wrote:
> On Fri, Sep 20, 2013 at 7:52 PM, Eric Anholt <eric at anholt.net> wrote:
>> Noticed while grepping through the code for something else.
>> ---
>>  src/mesa/program/program.c | 36 ++++++++++++++++++++++--------------
>>  1 file changed, 22 insertions(+), 14 deletions(-)
>>
>> diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c
>> index 2529c13..5dd68d9 100644
>> --- a/src/mesa/program/program.c
>> +++ b/src/mesa/program/program.c
>> @@ -55,27 +55,35 @@ _mesa_init_program(struct gl_context *ctx)
>>      * If this assertion fails, we need to increase the field
>>      * size for register indexes (see INST_INDEX_BITS).
>>      */
>> -   ASSERT(ctx->Const.VertexProgram.MaxUniformComponents / 4
>> +   STATIC_ASSERT(ctx->Const.VertexProgram.MaxUniformComponents / 4
>>            <= (1 << INST_INDEX_BITS));
>> -   ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents / 4
>> +   STATIC_ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents / 4
>>            <= (1 << INST_INDEX_BITS));
>>
>> -   ASSERT(ctx->Const.VertexProgram.MaxTemps <= (1 << INST_INDEX_BITS));
>> -   ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= (1 << INST_INDEX_BITS));
>> -   ASSERT(ctx->Const.FragmentProgram.MaxTemps <= (1 << INST_INDEX_BITS));
>> -   ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= (1 << INST_INDEX_BITS));
>> -
>> -   ASSERT(ctx->Const.VertexProgram.MaxUniformComponents <= 4 * MAX_UNIFORMS);
>> -   ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents <= 4 * MAX_UNIFORMS);
>> -
>> -   ASSERT(ctx->Const.VertexProgram.MaxAddressOffset <= (1 << INST_INDEX_BITS));
>> -   ASSERT(ctx->Const.FragmentProgram.MaxAddressOffset <= (1 << INST_INDEX_BITS));
>> +   STATIC_ASSERT(ctx->Const.VertexProgram.MaxTemps <=
>> +                 (1 << INST_INDEX_BITS));
>> +   STATIC_ASSERT(ctx->Const.VertexProgram.MaxLocalParams <=
>> +                 (1 << INST_INDEX_BITS));
>> +   STATIC_ASSERT(ctx->Const.FragmentProgram.MaxTemps <=
>> +                 (1 << INST_INDEX_BITS));
>> +   STATIC_ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <=
>> +                 (1 << INST_INDEX_BITS));
>> +
>> +   STATIC_ASSERT(ctx->Const.VertexProgram.MaxUniformComponents <=
>> +                 4 * MAX_UNIFORMS);
>> +   STATIC_ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents <=
>> +                 4 * MAX_UNIFORMS);
>> +
>> +   STATIC_ASSERT(ctx->Const.VertexProgram.MaxAddressOffset <=
>> +                 (1 << INST_INDEX_BITS));
>> +   STATIC_ASSERT(ctx->Const.FragmentProgram.MaxAddressOffset <=
>> +                 (1 << INST_INDEX_BITS));
>
> Are you sure about those?  How does the compiler know the values of
> ctx->Const.Foo at compile time?
>
> It's worrisome that our STATIC_ASSERT macro is silent at compile time
> when the expression isn't a compile-time constant.  The problem with
> our macro now is variable-sized arrays are OK at compile time.

just as an aside the current S_A macro produces a warning on later gcc's.

kinda a misfeature.

Dave.


More information about the mesa-dev mailing list