[Mesa-dev] [PATCH] mesa: declare UniformBufferBindings as an array with a static size

Ian Romanick idr at freedesktop.org
Wed May 15 10:13:09 PDT 2013


On 05/14/2013 03:50 PM, Dave Airlie wrote:
> On Wed, May 15, 2013 at 2:03 AM, Marek Olšák <maraeo at gmail.com> wrote:
>> Some Gallium drivers were crashing, because the array was not large enough.
>>
>> NOTE: This is a candidate for the stable branches.
>> ---
>>   src/mesa/main/bufferobj.c              |   10 ++--------
>>   src/mesa/main/config.h                 |    2 ++
>>   src/mesa/main/mtypes.h                 |    3 ++-
>>   src/mesa/state_tracker/st_extensions.c |    7 ++++---
>>   4 files changed, 10 insertions(+), 12 deletions(-)
>>
>> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
>> index 1566cb4..ffb67b9 100644
>> --- a/src/mesa/main/bufferobj.c
>> +++ b/src/mesa/main/bufferobj.c
>> @@ -619,13 +619,10 @@ _mesa_init_buffer_objects( struct gl_context *ctx )
>>      _mesa_reference_buffer_object(ctx, &ctx->CopyWriteBuffer,
>>                                    ctx->Shared->NullBufferObj);
>>
>> -   ctx->UniformBufferBindings = calloc(ctx->Const.MaxUniformBufferBindings,
>> -                                     sizeof(*ctx->UniformBufferBindings));
>> -
>>      _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer,
>>                                   ctx->Shared->NullBufferObj);
>>
>> -   for (i = 0; i < ctx->Const.MaxUniformBufferBindings; i++) {
>> +   for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
>>         _mesa_reference_buffer_object(ctx,
>>                                      &ctx->UniformBufferBindings[i].BufferObject,
>>                                      ctx->Shared->NullBufferObj);
>> @@ -647,14 +644,11 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
>>
>>      _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, NULL);
>>
>> -   for (i = 0; i < ctx->Const.MaxUniformBufferBindings; i++) {
>> +   for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
>>         _mesa_reference_buffer_object(ctx,
>>                                      &ctx->UniformBufferBindings[i].BufferObject,
>>                                      NULL);
>>      }
>> -
>> -   free(ctx->UniformBufferBindings);
>> -   ctx->UniformBufferBindings = NULL;
>>   }
>>
>>   static bool
>> diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
>> index ea87b75..134c88a 100644
>> --- a/src/mesa/main/config.h
>> +++ b/src/mesa/main/config.h
>> @@ -168,6 +168,8 @@
>>   /*@{*/
>>   #define MAX_PROGRAM_LOCAL_PARAMS       4096
>>   #define MAX_UNIFORMS                   4096
>> +/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */
>> +#define MAX_COMBINED_UNIFORM_BUFFERS   (16 * 6)
>
> Hmm softpipe currently says it has 32 per stage, so this won't scale
> long term. How would it work if we report 32 per stage but limit the
> max combined to 16*6, is some other code going to do the wrong thing

I'm not 100% sure that's okay.  I have some recollection (but I'll have 
to do spec archaeology) that MAX_COMBINED is eventually required to be 
the sum of all the other maximums... basically making it a useless 
query.  This was done because that's what everyone was already doing, 
and it's what apps were implicitly expecting.

> Dave.
> _______________________________________________
> 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