mesa: Make the register allocator allocation take a ralloc context.
authorEric Anholt <eric@anholt.net>
Thu, 12 Jan 2012 20:51:34 +0000 (12:51 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 18 Jan 2012 17:59:11 +0000 (09:59 -0800)
This fixes a memory leak on i965 context destruction.

NOTE: This is a candidate for the 8.0 branch.

src/gallium/drivers/r300/compiler/radeon_pair_regalloc.c
src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp
src/mesa/program/register_allocate.c
src/mesa/program/register_allocate.h

index 30716a3484307aeadb473cf10887207abbda968d..bb5b43f2f9523c90640437765c2b82b134a54ff1 100644 (file)
@@ -547,7 +547,7 @@ static void do_advanced_regalloc(struct regalloc_state * s)
        struct ra_graph * graph;
 
        /* Allocate the main ra data structure */
-       regs = ra_alloc_reg_set(s->C->max_temp_regs * RC_MASK_XYZW);
+       regs = ra_alloc_reg_set(NULL, s->C->max_temp_regs * RC_MASK_XYZW);
 
        /* Get list of program variables */
        variables = rc_get_variables(s->C);
index 3f875cc63d93bbeca944184004ab1dead3db5a59..d4dd1240b70864afc5f9d9e90a6397d0eb564039 100644 (file)
@@ -88,7 +88,7 @@ brw_alloc_reg_set_for_classes(struct brw_context *brw,
    ralloc_free(brw->wm.ra_reg_to_grf);
    brw->wm.ra_reg_to_grf = ralloc_array(brw, uint8_t, ra_reg_count);
    ralloc_free(brw->wm.regs);
-   brw->wm.regs = ra_alloc_reg_set(ra_reg_count);
+   brw->wm.regs = ra_alloc_reg_set(brw, ra_reg_count);
    ralloc_free(brw->wm.classes);
    brw->wm.classes = ralloc_array(brw, int, class_count + 1);
 
index 1ace91fafef5c46f3e00a6f19a59a1d54094f731..2efe235bff9640aaa64da2ec0e000e0468ca31f7 100644 (file)
@@ -108,7 +108,7 @@ brw_alloc_reg_set_for_classes(struct brw_context *brw,
    ralloc_free(brw->vs.ra_reg_to_grf);
    brw->vs.ra_reg_to_grf = ralloc_array(brw, uint8_t, ra_reg_count);
    ralloc_free(brw->vs.regs);
-   brw->vs.regs = ra_alloc_reg_set(ra_reg_count);
+   brw->vs.regs = ra_alloc_reg_set(brw, ra_reg_count);
    ralloc_free(brw->vs.classes);
    brw->vs.classes = ralloc_array(brw, int, class_count + 1);
 
index f5b5174fc185e3aaefda741e41a33d4e6f940b50..f08c9d28d6b3ad1ef5f2613830abb0d4dda480c6 100644 (file)
@@ -154,13 +154,19 @@ struct ra_graph {
    unsigned int stack_count;
 };
 
+/**
+ * Creates a set of registers for the allocator.
+ *
+ * mem_ctx is a ralloc context for the allocator.  The reg set may be freed
+ * using ralloc_free().
+ */
 struct ra_regs *
-ra_alloc_reg_set(unsigned int count)
+ra_alloc_reg_set(void *mem_ctx, unsigned int count)
 {
    unsigned int i;
    struct ra_regs *regs;
 
-   regs = rzalloc(NULL, struct ra_regs);
+   regs = rzalloc(mem_ctx, struct ra_regs);
    regs->count = count;
    regs->regs = rzalloc_array(regs, struct ra_reg, count);
 
index ee2e58a4756428610ec8f154ae267bb0f5543c6d..00b851ec21b97d103d24d61d8bc2b92bbac8fb1c 100644 (file)
@@ -36,7 +36,7 @@ struct ra_regs;
  * registers, such as aligned register pairs that conflict with the
  * two real registers from which they are composed.
  */
-struct ra_regs *ra_alloc_reg_set(unsigned int count);
+struct ra_regs *ra_alloc_reg_set(void *mem_ctx, unsigned int count);
 unsigned int ra_alloc_reg_class(struct ra_regs *regs);
 void ra_add_reg_conflict(struct ra_regs *regs,
                         unsigned int r1, unsigned int r2);