[Mesa-dev] [PATCH 11/11] glsl: Reject linking shaders with too many uniform blocks.

Ian Romanick idr at freedesktop.org
Fri Jul 20 16:15:11 PDT 2012


On 07/20/2012 03:49 PM, Brian Paul wrote:
> On 07/20/2012 04:33 PM, Eric Anholt wrote:
>> Part of fixing piglit maxblocks.
>> ---
>>   src/glsl/linker.cpp |   34 ++++++++++++++++++++++++++++++++++
>>   1 file changed, 34 insertions(+)
>>
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index bfdde40..f4e578f 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -2324,6 +2324,12 @@ check_resources(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>>         0          /* FINISHME: Geometry shaders. */
>>      };
>>
>> +   const unsigned max_uniform_blocks[MESA_SHADER_TYPES] = {
>> +      ctx->Const.VertexProgram.MaxUniformBlocks,
>> +      ctx->Const.FragmentProgram.MaxUniformBlocks,
>> +      ctx->Const.GeometryProgram.MaxUniformBlocks,
>> +   };
>> +
>>      for (unsigned i = 0; i<  MESA_SHADER_TYPES; i++) {
>>         struct gl_shader *sh = prog->_LinkedShaders[i];
>>
>> @@ -2348,6 +2354,34 @@ check_resources(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>>         }
>>      }
>>
>> +   unsigned blocks[] = {0, 0, 0};
>
> Should that be:
>     unsigned blocks[MESA_SHADER_TYPES] = { 0, 0, 0 };
>
> The idea would be to get a compiler warning if the blocks array isn't
> grown in the future for new shader types.

This is a good idea, but it won't cause a warning.  At least it won't on 
a C99 savvy compiler.  The C99 rules for that usage cause the missing 
fields to get initialized to 0.

>> +   unsigned total_uniform_blocks = 0;
>> +
>> +   for (unsigned i = 0; i<  prog->NumUniformBlocks; i++) {
>> +      for (unsigned j = 0; j<  MESA_SHADER_TYPES; j++) {
>> +     if (prog->UniformBlockStageIndex[j][i] != -1) {
>> +        blocks[j]++;
>> +        total_uniform_blocks++;
>> +     }
>> +      }
>> +
>> +      if (total_uniform_blocks>  ctx->Const.MaxCombinedUniformBlocks) {
>> +     linker_error(prog, "Too many combined uniform blocks (%d/%d)",
>> +              prog->NumUniformBlocks,
>> +              ctx->Const.MaxCombinedUniformBlocks);
>> +      } else {
>> +     for (unsigned i = 0; i<  MESA_SHADER_TYPES; i++) {
>> +        if (blocks[i]>  max_uniform_blocks[i]) {
>> +           linker_error(prog, "Too many %s uniform blocks (%d/%d)",
>> +                shader_names[i],
>> +                blocks[i],
>> +                max_uniform_blocks[i]);
>> +           break;
>> +        }
>> +     }
>> +      }
>> +   }
>> +
>>      return prog->LinkStatus;
>>   }
>>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list