i965: Fix slow leak of brw->wm.compile_data->store
authorEric Anholt <eric@anholt.net>
Tue, 6 Nov 2012 17:48:51 +0000 (09:48 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 8 Nov 2012 22:50:32 +0000 (14:50 -0800)
We were successfully freeing our compile data at context destroy, but until
then we were allocating a new store every compile without freeing it.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56019
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_vtbl.c
src/mesa/drivers/dri/i965/brw_wm.c

index 97556cbd2c820700453b4ab5c9acd55b1022a48c..5520ca8508c3910692caa5980fbaf696e04ad50e 100644 (file)
@@ -977,7 +977,6 @@ struct brw_context
 
    struct {
       struct brw_wm_prog_data *prog_data;
-      struct brw_wm_compile *compile_data;
 
       /** Input sizes, calculated from active vertex program.
        * One bit per fragment program input attribute.
index 3709777a10780953a1d56fce8c31ee1d3472cf52..0da6070ec1c9f5e9b70119cae6c68215161e6c63 100644 (file)
@@ -72,8 +72,6 @@ static void brw_destroy_context( struct intel_context *intel )
    brw_destroy_state(brw);
    brw_draw_destroy( brw );
 
-   ralloc_free(brw->wm.compile_data);
-
    dri_bo_release(&brw->curbe.curbe_bo);
    dri_bo_release(&brw->vs.const_bo);
    dri_bo_release(&brw->wm.const_bo);
index c273cd8888c18f82ec698096d66aa1570bb0d58d..2c9a6a07fbc2ce687f417c9d00e838fe9e420db6 100644 (file)
@@ -215,20 +215,7 @@ bool do_wm_prog(struct brw_context *brw,
    if (prog)
       fs = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
 
-   c = brw->wm.compile_data;
-   if (c == NULL) {
-      brw->wm.compile_data = rzalloc(NULL, struct brw_wm_compile);
-      c = brw->wm.compile_data;
-      if (c == NULL) {
-         /* Ouch - big out of memory problem.  Can't continue
-          * without triggering a segfault, no way to signal,
-          * so just return.
-          */
-         return false;
-      }
-   } else {
-      memset(c, 0, sizeof(*brw->wm.compile_data));
-   }
+   c = rzalloc(NULL, struct brw_wm_compile);
 
    /* Allocate the references to the uniforms that will end up in the
     * prog_data associated with the compiled program, and which will be freed
@@ -239,14 +226,14 @@ bool do_wm_prog(struct brw_context *brw,
       /* The backend also sometimes adds params for texture size. */
       param_count += 2 * BRW_MAX_TEX_UNIT;
 
-      c->prog_data.param = rzalloc_array(c, const float *, param_count);
-      c->prog_data.pull_param = rzalloc_array(c, const float *, param_count);
+      c->prog_data.param = rzalloc_array(NULL, const float *, param_count);
+      c->prog_data.pull_param = rzalloc_array(NULL, const float *, param_count);
    } else {
       /* brw_wm_pass0.c will also add references to 0.0 and 1.0 which are
        * uploaded as push parameters.
        */
       int param_count = (fp->program.Base.Parameters->NumParameters + 2) * 4;
-      c->prog_data.param = rzalloc_array(c, const float *, param_count);
+      c->prog_data.param = rzalloc_array(NULL, const float *, param_count);
       /* The old backend never does pull constants. */
       c->prog_data.pull_param = NULL;
    }
@@ -288,6 +275,8 @@ bool do_wm_prog(struct brw_context *brw,
                    &c->prog_data, sizeof(c->prog_data),
                    &brw->wm.prog_offset, &brw->wm.prog_data);
 
+   ralloc_free(c);
+
    return true;
 }