[Mesa-dev] [PATCH 2/2 v2] mesa: Dynamically allocate the matrix stack.

Brian Paul brianp at vmware.com
Wed Aug 3 21:58:16 UTC 2016


Reviewed-by: Brian Paul <brianp at vmware.com>


On 08/03/2016 03:22 PM, Eric Anholt wrote:
> By allocating and initializing the matrices at context creation, the OS
> can't even overcommit the pages.  This saves about 63k (out of 946k) of
> maximum memory size according to massif on simulated vc4
> glsl-algebraic-add-add-1.  It also means we could potentially relax the
> maximum stack sizes, but that should be a separate commit.
>
> v2: Drop redundant Top update, explain why the stack is small at init
>      time.
> ---
>   src/mesa/main/matrix.c | 28 ++++++++++++++++++++++++----
>   src/mesa/main/mtypes.h |  1 +
>   2 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c
> index 293d50c33595..b30b983f14fd 100644
> --- a/src/mesa/main/matrix.c
> +++ b/src/mesa/main/matrix.c
> @@ -243,6 +243,24 @@ _mesa_PushMatrix( void )
>         }
>         return;
>      }
> +   if (stack->Depth + 1 >= stack->StackSize) {
> +      unsigned new_stack_size = stack->StackSize * 2;
> +      unsigned i;
> +      GLmatrix *new_stack = realloc(stack->Stack,
> +                                    sizeof(*new_stack) * new_stack_size);
> +
> +      if (!new_stack) {
> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushMatrix()");
> +         return;
> +      }
> +
> +      for (i = stack->StackSize; i < new_stack_size; i++)
> +         _math_matrix_ctr(&new_stack[i]);
> +
> +      stack->Stack = new_stack;
> +      stack->StackSize = new_stack_size;
> +   }
> +
>      _math_matrix_copy( &stack->Stack[stack->Depth + 1],
>                         &stack->Stack[stack->Depth] );
>      stack->Depth++;
> @@ -645,9 +663,10 @@ init_matrix_stack( struct gl_matrix_stack *stack,
>      stack->Depth = 0;
>      stack->MaxDepth = maxDepth;
>      stack->DirtyFlag = dirtyFlag;
> -   /* The stack */
> -   stack->Stack = calloc(maxDepth, sizeof(GLmatrix));
> -   for (i = 0; i < maxDepth; i++) {
> +   /* The stack will be dynamically resized at glPushMatrix() time */
> +   stack->Stack = calloc(1, sizeof(GLmatrix));
> +   stack->StackSize = 1;
> +   for (i = 0; i < stack->StackSize; i++) {
>         _math_matrix_ctr(&stack->Stack[i]);
>      }
>      stack->Top = stack->Stack;
> @@ -665,11 +684,12 @@ static void
>   free_matrix_stack( struct gl_matrix_stack *stack )
>   {
>      GLuint i;
> -   for (i = 0; i < stack->MaxDepth; i++) {
> +   for (i = 0; i < stack->StackSize; i++) {
>         _math_matrix_dtr(&stack->Stack[i]);
>      }
>      free(stack->Stack);
>      stack->Stack = stack->Top = NULL;
> +   stack->StackSize = 0;
>   }
>
>   /*@}*/
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 2647f8fab841..5b02fadf3cd8 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3990,6 +3990,7 @@ struct gl_matrix_stack
>   {
>      GLmatrix *Top;      /**< points into Stack */
>      GLmatrix *Stack;    /**< array [MaxDepth] of GLmatrix */
> +   unsigned StackSize; /**< Number of elements in Stack */
>      GLuint Depth;       /**< 0 <= Depth < MaxDepth */
>      GLuint MaxDepth;    /**< size of Stack[] array */
>      GLuint DirtyFlag;   /**< _NEW_MODELVIEW or _NEW_PROJECTION, for example */
>



More information about the mesa-dev mailing list