mesa: Delay s_texcombine.c memory allocation until it's used.
authorEric Anholt <eric@anholt.net>
Thu, 22 Sep 2011 19:52:43 +0000 (12:52 -0700)
committerEric Anholt <eric@anholt.net>
Sun, 2 Oct 2011 05:16:06 +0000 (22:16 -0700)
Generally we're using fragment programs in all our drivers, so wasting
4MB for code that's never called is pretty lame.  Reduces i965 memory
allocation for a short shader program from 21,932,128B to 17,737,816B.

src/mesa/swrast/s_context.c
src/mesa/swrast/s_texcombine.c

index a4acac2..5287671 100644 (file)
@@ -780,17 +780,6 @@ _swrast_CreateContext( struct gl_context *ctx )
    swrast->PointSpan.facing = 0;
    swrast->PointSpan.array = swrast->SpanArrays;
 
-   /* TexelBuffer is also global and normally shared by all SWspan instances;
-    * when running with multiple threads, create one per thread.
-    */
-   swrast->TexelBuffer = (GLfloat *) MALLOC(ctx->Const.MaxTextureImageUnits * maxThreads *
-                                           MAX_WIDTH * 4 * sizeof(GLfloat));
-   if (!swrast->TexelBuffer) {
-      FREE(swrast->SpanArrays);
-      FREE(swrast);
-      return GL_FALSE;
-   }
-
    init_program_native_limits(&ctx->Const.VertexProgram);
    init_program_native_limits(&ctx->Const.GeometryProgram);
    init_program_native_limits(&ctx->Const.FragmentProgram);
index 6944edf..de15772 100644 (file)
@@ -93,6 +93,26 @@ texture_combine( struct gl_context *ctx, GLuint unit, GLuint n,
    float4_array ccolor[4], rgba;
    GLuint i, term;
 
+   if (!swrast->TexelBuffer) {
+#ifdef _OPENMP
+      const GLint maxThreads = omp_get_max_threads();
+#else
+      const GLint maxThreads = 1;
+#endif
+
+      /* TexelBuffer is also global and normally shared by all SWspan
+       * instances; when running with multiple threads, create one per
+       * thread.
+       */
+      swrast->TexelBuffer =
+        (GLfloat *) MALLOC(ctx->Const.MaxTextureImageUnits * maxThreads *
+                           MAX_WIDTH * 4 * sizeof(GLfloat));
+      if (!swrast->TexelBuffer) {
+        _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture_combine");
+        return;
+      }
+   }
+
    /* alloc temp pixel buffers */
    rgba = (float4_array) malloc(4 * n * sizeof(GLfloat));
    if (!rgba) {