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

Marek Olšák maraeo at gmail.com
Tue May 14 09:03:24 PDT 2013


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)
 /*@}*/
 
 /**
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index bce1e6c..c3a0ff4 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3526,7 +3526,8 @@ struct gl_context
     * associated with uniform blocks by glUniformBlockBinding()'s state in the
     * shader program.
     */
-   struct gl_uniform_buffer_binding *UniformBufferBindings;
+   struct gl_uniform_buffer_binding
+      UniformBufferBindings[MAX_COMBINED_UNIFORM_BUFFERS];
 
    /*@}*/
 
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index b64d363..259421a 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -280,9 +280,10 @@ void st_init_limits(struct st_context *st)
       c->UniformBufferOffsetAlignment =
          screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
       c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings =
-         c->VertexProgram.MaxUniformBlocks +
-         c->GeometryProgram.MaxUniformBlocks +
-         c->FragmentProgram.MaxUniformBlocks;
+         _min(c->VertexProgram.MaxUniformBlocks +
+              c->GeometryProgram.MaxUniformBlocks +
+              c->FragmentProgram.MaxUniformBlocks,
+              MAX_COMBINED_UNIFORM_BUFFERS);
    }
 }
 
-- 
1.7.10.4



More information about the mesa-dev mailing list