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

Dave Airlie airlied at gmail.com
Tue May 14 15:50:23 PDT 2013


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

Dave.


More information about the mesa-dev mailing list