i965: Fix several memory leaks on exit.
authorEric Anholt <eric@anholt.net>
Sat, 21 Nov 2009 12:33:21 +0000 (13:33 +0100)
committerEric Anholt <eric@anholt.net>
Sat, 21 Nov 2009 12:33:57 +0000 (13:33 +0100)
Bug #25194.

src/mesa/drivers/dri/i965/brw_state.h
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_vtbl.c
src/mesa/drivers/dri/i965/brw_wm.c

index ab6f1580806fc83ec298b6826045e6cb069d5e0a..b129b1f1c3f529545ba1ae1a456930b3d583dda2 100644 (file)
@@ -112,6 +112,7 @@ void brw_validate_state(struct brw_context *brw);
 void brw_upload_state(struct brw_context *brw);
 void brw_init_state(struct brw_context *brw);
 void brw_destroy_state(struct brw_context *brw);
+void brw_clear_validated_bos(struct brw_context *brw);
 
 /***********************************************************************
  * brw_state_cache.c
index f4283bda1b30cd0cbb2335edf3b62b0424dfa4af..af8dfb4c15c20366c8d5be1a69edf2655343e58a 100644 (file)
@@ -143,7 +143,7 @@ static void xor_states( struct brw_state_flags *result,
    result->cache = a->cache ^ b->cache;
 }
 
-static void
+void
 brw_clear_validated_bos(struct brw_context *brw)
 {
    int i;
index 114e6bd018093cb8aa3fc90e7941cecb683b788f..34aaea373606dc209d6fb7a6426d7058ebd28644 100644 (file)
@@ -46,7 +46,7 @@
 #include "brw_state.h"
 #include "brw_fallback.h"
 #include "brw_vs.h"
-
+#include "brw_wm.h"
 
 static void
 dri_bo_release(dri_bo **bo)
@@ -66,8 +66,14 @@ static void brw_destroy_context( struct intel_context *intel )
 
    brw_destroy_state(brw);
    brw_draw_destroy( brw );
-
-   _mesa_free(brw->wm.compile_data);
+   brw_clear_validated_bos(brw);
+   if (brw->wm.compile_data) {
+      _mesa_free(brw->wm.compile_data->instruction);
+      _mesa_free(brw->wm.compile_data->vreg);
+      _mesa_free(brw->wm.compile_data->refs);
+      _mesa_free(brw->wm.compile_data->prog_instructions);
+      _mesa_free(brw->wm.compile_data);
+   }
 
    for (i = 0; i < brw->state.nr_color_regions; i++)
       intel_region_release(&brw->state.color_regions[i]);
index 77e3b2c32af03042a13bade88be45094fba23b0e..6895f644104a6e0be24507fa6447aebbce2c5625 100644 (file)
@@ -157,7 +157,6 @@ static void do_wm_prog( struct brw_context *brw,
                                          sizeof(*c->prog_instructions));
       c->vreg = _mesa_calloc(BRW_WM_MAX_VREG * sizeof(*c->vreg));
       c->refs = _mesa_calloc(BRW_WM_MAX_REF * sizeof(*c->refs));
-      c->vreg = _mesa_calloc(BRW_WM_MAX_VREG * sizeof(*c->vreg));
    } else {
       void *instruction = c->instruction;
       void *prog_instructions = c->prog_instructions;