tnl: Delay results allocation until we actually need them.
authorEric Anholt <eric@anholt.net>
Thu, 22 Sep 2011 18:28:19 +0000 (11:28 -0700)
committerEric Anholt <eric@anholt.net>
Sun, 2 Oct 2011 05:16:06 +0000 (22:16 -0700)
Decreases i965 peak memory allocation for a trivial shader program
from 23,483,048B to 21,932,128B, since we never actually use tnl for
rendering.

src/mesa/tnl/t_vb_program.c

index 3e0c80d89903f338b19083a8e2cabeea43278f48..cc5e85634c409e4e355202efeaab85b725559589 100644 (file)
@@ -336,6 +336,11 @@ run_vp( struct gl_context *ctx, struct tnl_pipeline_stage *stage )
    for (i = 0; i < VERT_RESULT_MAX; i++) {
       if (program->Base.OutputsWritten & BITFIELD64_BIT(i)) {
          outputs[numOutputs++] = i;
+
+        if (!store->results[i].data) {
+           _mesa_vector4f_alloc( &store->results[i], 0, VB->Size, 32 );
+           store->results[i].size = 4;
+        }
       }
    }
 
@@ -504,19 +509,12 @@ init_vp(struct gl_context *ctx, struct tnl_pipeline_stage *stage)
    struct vertex_buffer *VB = &(tnl->vb);
    struct vp_stage_data *store;
    const GLuint size = VB->Size;
-   GLuint i;
 
    stage->privatePtr = CALLOC(sizeof(*store));
    store = VP_STAGE_DATA(stage);
    if (!store)
       return GL_FALSE;
 
-   /* Allocate arrays of vertex output values */
-   for (i = 0; i < VERT_RESULT_MAX; i++) {
-      _mesa_vector4f_alloc( &store->results[i], 0, size, 32 );
-      store->results[i].size = 4;
-   }
-
    /* a few other misc allocations */
    _mesa_vector4f_alloc( &store->ndcCoords, 0, size, 32 );
    store->clipmask = (GLubyte *) _mesa_align_malloc(sizeof(GLubyte)*size, 32 );