[Mesa-dev] [PATCH 2/4] i965: Get a ralloc context into brw_compile.

Kenneth Graunke kenneth at whitecape.org
Mon May 16 15:09:44 PDT 2011


This would be so much easier if we were using C++; we could simply use
constructors and destructors.  Instead, we have to update all the
callers.

While we're at it, ralloc various brw_wm_compile fields rather than
explicitly calloc/free'ing them.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/i965/brw_clip.c |    8 +++++++-
 src/mesa/drivers/dri/i965/brw_eu.c   |    5 ++++-
 src/mesa/drivers/dri/i965/brw_eu.h   |    5 ++++-
 src/mesa/drivers/dri/i965/brw_gs.c   |    8 ++++++--
 src/mesa/drivers/dri/i965/brw_sf.c   |    7 ++++++-
 src/mesa/drivers/dri/i965/brw_vs.c   |    8 ++++++--
 src/mesa/drivers/dri/i965/brw_vtbl.c |   10 +++-------
 src/mesa/drivers/dri/i965/brw_wm.c   |   15 ++++++++-------
 8 files changed, 44 insertions(+), 22 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c
index 3c17551..c7d428b 100644
--- a/src/mesa/drivers/dri/i965/brw_clip.c
+++ b/src/mesa/drivers/dri/i965/brw_clip.c
@@ -42,6 +42,8 @@
 #include "brw_state.h"
 #include "brw_clip.h"
 
+#include "../glsl/ralloc.h"
+
 #define FRONT_UNFILLED_BIT  0x1
 #define BACK_UNFILLED_BIT   0x2
 
@@ -52,16 +54,19 @@ static void compile_clip_prog( struct brw_context *brw,
    struct intel_context *intel = &brw->intel;
    struct brw_clip_compile c;
    const GLuint *program;
+   void *mem_ctx;
    GLuint program_size;
    GLuint delta;
    GLuint i;
    GLuint header_regs;
 
    memset(&c, 0, sizeof(c));
+
+   mem_ctx = ralloc_context(NULL);
    
    /* Begin the compilation:
     */
-   brw_init_compile(brw, &c.func);
+   brw_init_compile(brw, &c.func, mem_ctx);
 
    c.func.single_program_flow = 1;
 
@@ -150,6 +155,7 @@ static void compile_clip_prog( struct brw_context *brw,
 					program, program_size,
 					&c.prog_data, sizeof(c.prog_data),
 					&brw->clip.prog_data);
+   ralloc_free(mem_ctx);
 }
 
 /* Calculate interpolants for triangle and line rasterization.
diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c
index 18f6a4d..aa3f878 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.c
+++ b/src/mesa/drivers/dri/i965/brw_eu.c
@@ -166,7 +166,8 @@ void brw_pop_insn_state( struct brw_compile *p )
 
 /***********************************************************************
  */
-void brw_init_compile( struct brw_context *brw, struct brw_compile *p )
+void
+brw_init_compile(struct brw_context *brw, struct brw_compile *p, void *mem_ctx)
 {
    p->brw = brw;
    p->nr_insn = 0;
@@ -174,6 +175,8 @@ void brw_init_compile( struct brw_context *brw, struct brw_compile *p )
    p->compressed = false;
    memset(p->current, 0, sizeof(p->current[0]));
 
+   p->mem_ctx = mem_ctx;
+
    /* Some defaults?
     */
    brw_set_mask_control(p, BRW_MASK_ENABLE); /* what does this do? */
diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
index 3243fdf..a0ac17a 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.h
+++ b/src/mesa/drivers/dri/i965/brw_eu.h
@@ -104,6 +104,8 @@ struct brw_compile {
    struct brw_instruction store[BRW_EU_MAX_INSN];
    GLuint nr_insn;
 
+   void *mem_ctx;
+
    /* Allow clients to push/pop instruction state:
     */
    struct brw_instruction stack[BRW_EU_MAX_INSN_STACK];
@@ -784,7 +786,8 @@ void brw_set_predicate_inverse(struct brw_compile *p, bool predicate_inverse);
 void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional );
 void brw_set_acc_write_control(struct brw_compile *p, GLuint value);
 
-void brw_init_compile( struct brw_context *, struct brw_compile *p );
+void brw_init_compile(struct brw_context *, struct brw_compile *p,
+		      void *mem_ctx);
 const GLuint *brw_get_program( struct brw_compile *p, GLuint *sz );
 
 
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index c6d3a09..aaffe94 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -42,7 +42,7 @@
 #include "brw_state.h"
 #include "brw_gs.h"
 
-
+#include "../glsl/ralloc.h"
 
 static void compile_gs_prog( struct brw_context *brw,
 			     struct brw_gs_prog_key *key )
@@ -50,6 +50,7 @@ static void compile_gs_prog( struct brw_context *brw,
    struct intel_context *intel = &brw->intel;
    struct brw_gs_compile c;
    const GLuint *program;
+   void *mem_ctx;
    GLuint program_size;
 
    /* Gen6: VF has already converted into polygon, and LINELOOP is
@@ -73,10 +74,11 @@ static void compile_gs_prog( struct brw_context *brw,
 
    c.nr_bytes = c.nr_regs * REG_SIZE;
 
+   mem_ctx = NULL;
    
    /* Begin the compilation:
     */
-   brw_init_compile(brw, &c.func);
+   brw_init_compile(brw, &c.func, mem_ctx);
 
    c.func.single_program_flow = 1;
 
@@ -101,6 +103,7 @@ static void compile_gs_prog( struct brw_context *brw,
       brw_gs_lines( &c );
       break;
    default:
+      ralloc_free(mem_ctx);
       return;
    }
 
@@ -126,6 +129,7 @@ static void compile_gs_prog( struct brw_context *brw,
 				      program, program_size,
 				      &c.prog_data, sizeof(c.prog_data),
 				      &brw->gs.prog_data);
+   ralloc_free(mem_ctx);
 }
 
 static const GLenum gs_prim[GL_POLYGON+1] = {  
diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
index 5a03851..9b82fe1 100644
--- a/src/mesa/drivers/dri/i965/brw_sf.c
+++ b/src/mesa/drivers/dri/i965/brw_sf.c
@@ -43,20 +43,24 @@
 #include "brw_sf.h"
 #include "brw_state.h"
 
+#include "../glsl/ralloc.h"
+
 static void compile_sf_prog( struct brw_context *brw,
 			     struct brw_sf_prog_key *key )
 {
    struct intel_context *intel = &brw->intel;
    struct brw_sf_compile c;
    const GLuint *program;
+   void *mem_ctx;
    GLuint program_size;
    GLuint i, idx;
 
    memset(&c, 0, sizeof(c));
 
+   mem_ctx = ralloc_context(NULL);
    /* Begin the compilation:
     */
-   brw_init_compile(brw, &c.func);
+   brw_init_compile(brw, &c.func, mem_ctx);
 
    c.key = *key;
    c.nr_attrs = brw_count_bits(c.key.attrs);
@@ -124,6 +128,7 @@ static void compile_sf_prog( struct brw_context *brw,
 				      program, program_size,
 				      &c.prog_data, sizeof(c.prog_data),
 				      &brw->sf.prog_data);
+   ralloc_free(mem_ctx);
 }
 
 /* Calculate interpolants for triangle and line rasterization.
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 31a2b51..d6a5399 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -37,7 +37,7 @@
 #include "program/prog_print.h"
 #include "program/prog_parameter.h"
 
-
+#include "../glsl/ralloc.h"
 
 static void do_vs_prog( struct brw_context *brw, 
 			struct brw_vertex_program *vp,
@@ -47,13 +47,16 @@ static void do_vs_prog( struct brw_context *brw,
    GLuint program_size;
    const GLuint *program;
    struct brw_vs_compile c;
+   void *mem_ctx;
    int aux_size;
    int i;
 
    memset(&c, 0, sizeof(c));
    memcpy(&c.key, key, sizeof(*key));
 
-   brw_init_compile(brw, &c.func);
+   mem_ctx = ralloc_context(NULL);
+
+   brw_init_compile(brw, &c.func, mem_ctx);
    c.vp = vp;
 
    c.prog_data.outputs_written = vp->program.Base.OutputsWritten;
@@ -108,6 +111,7 @@ static void do_vs_prog( struct brw_context *brw,
 				      program, program_size,
 				      &c.prog_data, aux_size,
 				      &brw->vs.prog_data);
+   ralloc_free(mem_ctx);
 }
 
 
diff --git a/src/mesa/drivers/dri/i965/brw_vtbl.c b/src/mesa/drivers/dri/i965/brw_vtbl.c
index f2c417d..28d5f62 100644
--- a/src/mesa/drivers/dri/i965/brw_vtbl.c
+++ b/src/mesa/drivers/dri/i965/brw_vtbl.c
@@ -46,6 +46,8 @@
 #include "brw_vs.h"
 #include "brw_wm.h"
 
+#include "../glsl/ralloc.h"
+
 static void
 dri_bo_release(drm_intel_bo **bo)
 {
@@ -64,13 +66,7 @@ static void brw_destroy_context( struct intel_context *intel )
    brw_destroy_state(brw);
    brw_draw_destroy( brw );
    brw_clear_validated_bos(brw);
-   if (brw->wm.compile_data) {
-      free(brw->wm.compile_data->instruction);
-      free(brw->wm.compile_data->vreg);
-      free(brw->wm.compile_data->refs);
-      free(brw->wm.compile_data->prog_instructions);
-      free(brw->wm.compile_data);
-   }
+   ralloc_free(brw->wm.compile_data);
 
    intel_region_release(&brw->state.depth_region);
 
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 06512de..40589b0 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -35,6 +35,8 @@
 #include "main/formats.h"
 #include "main/samplerobj.h"
 
+#include "../glsl/ralloc.h"
+
 /** Return number of src args for given instruction */
 GLuint brw_wm_nr_args( GLuint opcode )
 {
@@ -193,7 +195,7 @@ static void do_wm_prog( struct brw_context *brw,
 
    c = brw->wm.compile_data;
    if (c == NULL) {
-      brw->wm.compile_data = calloc(1, sizeof(*brw->wm.compile_data));
+      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
@@ -202,11 +204,10 @@ static void do_wm_prog( struct brw_context *brw,
           */
          return;
       }
-      c->instruction = calloc(1, BRW_WM_MAX_INSN * sizeof(*c->instruction));
-      c->prog_instructions = calloc(1, BRW_WM_MAX_INSN *
-					  sizeof(*c->prog_instructions));
-      c->vreg = calloc(1, BRW_WM_MAX_VREG * sizeof(*c->vreg));
-      c->refs = calloc(1, BRW_WM_MAX_REF * sizeof(*c->refs));
+      c->instruction = rzalloc_array(c, struct brw_wm_instruction, BRW_WM_MAX_INSN);
+      c->prog_instructions = rzalloc_array(c, struct prog_instruction, BRW_WM_MAX_INSN);
+      c->vreg = rzalloc_array(c, struct brw_wm_value, BRW_WM_MAX_VREG);
+      c->refs = rzalloc_array(c, struct brw_wm_ref, BRW_WM_MAX_REF);
    } else {
       void *instruction = c->instruction;
       void *prog_instructions = c->prog_instructions;
@@ -223,7 +224,7 @@ static void do_wm_prog( struct brw_context *brw,
    c->fp = fp;
    c->env_param = brw->intel.ctx.FragmentProgram.Parameters;
 
-   brw_init_compile(brw, &c->func);
+   brw_init_compile(brw, &c->func, c);
 
    if (!brw_wm_fs_emit(brw, c)) {
       /* Fallback for fixed function and ARB_fp shaders. */
-- 
1.7.4.4



More information about the mesa-dev mailing list