By allocating and initializing the matrices at context creation, the OS
couldn'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.
Reviewed-by: Brian Paul <brianp@vmware.com>
+ 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++;
_math_matrix_copy( &stack->Stack[stack->Depth + 1],
&stack->Stack[stack->Depth] );
stack->Depth++;
stack->Depth = 0;
stack->MaxDepth = maxDepth;
stack->DirtyFlag = dirtyFlag;
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;
_math_matrix_ctr(&stack->Stack[i]);
}
stack->Top = stack->Stack;
free_matrix_stack( struct gl_matrix_stack *stack )
{
GLuint i;
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;
_math_matrix_dtr(&stack->Stack[i]);
}
free(stack->Stack);
stack->Stack = stack->Top = NULL;
{
GLmatrix *Top; /**< points into Stack */
GLmatrix *Stack; /**< array [MaxDepth] of GLmatrix */
{
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 */
GLuint Depth; /**< 0 <= Depth < MaxDepth */
GLuint MaxDepth; /**< size of Stack[] array */
GLuint DirtyFlag; /**< _NEW_MODELVIEW or _NEW_PROJECTION, for example */