i965: Move up duplicated fields from stage-specific prog_data to brw_stage_prog_data.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 19 Feb 2014 14:14:02 +0000 (15:14 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 19 Feb 2014 15:27:22 +0000 (16:27 +0100)
There doesn't seem to be any reason for nr_params, nr_pull_params,
param, and pull_param to be duplicated in the stage-specific
subclasses of brw_stage_prog_data.  Moving their definition to the
common base class will allow some code sharing in a future commit, the
removal of brw_vec4_prog_data_compare and brw_*_prog_data_free, and
the simplification of the stage-specific brw_*_prog_data_compare.

Reviewed-by: Paul Berry <stereotype441@gmail.com>
24 files changed:
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_curbe.c
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs_fp.cpp
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/i965/brw_program.h
src/mesa/drivers/dri/i965/brw_state_cache.c
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_gs.c
src/mesa/drivers/dri/i965/brw_vec4_gs.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_vp.cpp
src/mesa/drivers/dri/i965/brw_vs.c
src/mesa/drivers/dri/i965/brw_vs.h
src/mesa/drivers/dri/i965/brw_vs_surface_state.c
src/mesa/drivers/dri/i965/brw_wm.c
src/mesa/drivers/dri/i965/brw_wm.h
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/i965/gen6_vs_state.c
src/mesa/drivers/dri/i965/gen6_wm_state.c
src/mesa/drivers/dri/i965/gen7_wm_state.c
src/mesa/drivers/dri/i965/gen8_ps_state.c

index c107683cb34bed600aa5bac03074b3b8e9a34730..bdbbc3d733d0eb4d6e75133d00463b8c28708bdc 100644 (file)
@@ -332,8 +332,7 @@ struct brw_shader {
 };
 
 /* Note: If adding fields that need anything besides a normal memcmp() for
- * comparing them, be sure to go fix the the stage-specific
- * prog_data_compare().
+ * comparing them, be sure to go fix brw_stage_prog_data_compare().
  */
 struct brw_stage_prog_data {
    struct {
@@ -351,6 +350,18 @@ struct brw_stage_prog_data {
       uint32_t shader_time_start;
       /** @} */
    } binding_table;
+
+   GLuint nr_params;       /**< number of float params/constants */
+   GLuint nr_pull_params;
+
+   /* Pointers to tracked values (only valid once
+    * _mesa_load_state_parameters has been called at runtime).
+    *
+    * These must be the last fields of the struct (see
+    * brw_stage_prog_data_compare()).
+    */
+   const float **param;
+   const float **pull_param;
 };
 
 /* Data about a particular attempt to compile a program.  Note that
@@ -381,8 +392,6 @@ struct brw_wm_prog_data {
       /** @} */
    } binding_table;
 
-   GLuint nr_params;       /**< number of float params/constants */
-   GLuint nr_pull_params;
    bool dual_src_blend;
    bool uses_pos_offset;
    bool uses_omask;
@@ -400,15 +409,6 @@ struct brw_wm_prog_data {
     * For varying slots that are not used by the FS, the value is -1.
     */
    int urb_setup[VARYING_SLOT_MAX];
-
-   /* Pointers to tracked values (only valid once
-    * _mesa_load_state_parameters has been called at runtime).
-    *
-    * These must be the last fields of the struct (see
-    * brw_wm_prog_data_compare()).
-    */
-   const float **param;
-   const float **pull_param;
 };
 
 /**
@@ -590,8 +590,6 @@ struct brw_vec4_prog_data {
    GLuint curb_read_length;
    GLuint urb_read_length;
    GLuint total_grf;
-   GLuint nr_params;       /**< number of float params/constants */
-   GLuint nr_pull_params; /**< number of dwords referenced by pull_param[] */
    GLuint total_scratch;
 
    /* Used for calculating urb partitions.  In the VS, this is the size of the
@@ -599,10 +597,6 @@ struct brw_vec4_prog_data {
     * is the size of the URB entry used for output.
     */
    GLuint urb_entry_size;
-
-   /* These pointers must appear last.  See brw_vec4_prog_data_compare(). */
-   const float **param;
-   const float **pull_param;
 };
 
 
index bb1c79784388c71b6d47d2acec4477fa5cb945dd..19544aa26d5a9690a8f2bbe3e0c3b3caaed2e988 100644 (file)
@@ -57,10 +57,10 @@ static void calculate_curbe_offsets( struct brw_context *brw )
 {
    struct gl_context *ctx = &brw->ctx;
    /* CACHE_NEW_WM_PROG */
-   const GLuint nr_fp_regs = (brw->wm.prog_data->nr_params + 15) / 16;
+   const GLuint nr_fp_regs = (brw->wm.prog_data->base.nr_params + 15) / 16;
 
    /* BRW_NEW_VERTEX_PROGRAM */
-   const GLuint nr_vp_regs = (brw->vs.prog_data->base.nr_params + 15) / 16;
+   const GLuint nr_vp_regs = (brw->vs.prog_data->base.base.nr_params + 15) / 16;
    GLuint nr_clip_regs = 0;
    GLuint total_regs;
 
@@ -199,8 +199,8 @@ brw_upload_constant_buffer(struct brw_context *brw)
       GLuint offset = brw->curbe.wm_start * 16;
 
       /* copy float constants */
-      for (i = 0; i < brw->wm.prog_data->nr_params; i++) {
-        buf[offset + i] = *brw->wm.prog_data->param[i];
+      for (i = 0; i < brw->wm.prog_data->base.nr_params; i++) {
+        buf[offset + i] = *brw->wm.prog_data->base.param[i];
       }
    }
 
@@ -237,8 +237,8 @@ brw_upload_constant_buffer(struct brw_context *brw)
    if (brw->curbe.vs_size) {
       GLuint offset = brw->curbe.vs_start * 16;
 
-      for (i = 0; i < brw->vs.prog_data->base.nr_params; i++) {
-         buf[offset + i] = *brw->vs.prog_data->base.param[i];
+      for (i = 0; i < brw->vs.prog_data->base.base.nr_params; i++) {
+         buf[offset + i] = *brw->vs.prog_data->base.base.param[i];
       }
    }
 
index d35928e7f0c1a79a4f57982f3e123c791596a6e3..76de9fd4fced55695355f832b991dbf8b8814abe 100644 (file)
@@ -912,7 +912,7 @@ fs_visitor::setup_uniform_values(ir_variable *ir)
     * order we'd walk the type, so walk the list of storage and find anything
     * with our name, or the prefix of a component that starts with our name.
     */
-   unsigned params_before = c->prog_data.nr_params;
+   unsigned params_before = stage_prog_data->nr_params;
    for (unsigned u = 0; u < shader_prog->NumUserUniformStorage; u++) {
       struct gl_uniform_storage *storage = &shader_prog->UniformStorage[u];
 
@@ -928,14 +928,14 @@ fs_visitor::setup_uniform_values(ir_variable *ir)
          slots *= storage->array_elements;
 
       for (unsigned i = 0; i < slots; i++) {
-         c->prog_data.param[c->prog_data.nr_params++] =
+         stage_prog_data->param[stage_prog_data->nr_params++] =
             &storage->storage[i].f;
       }
    }
 
    /* Make sure we actually initialized the right amount of stuff here. */
    assert(params_before + ir->type->component_slots() ==
-          c->prog_data.nr_params);
+          stage_prog_data->nr_params);
    (void)params_before;
 }
 
@@ -968,7 +968,7 @@ fs_visitor::setup_builtin_uniform_values(ir_variable *ir)
            break;
         last_swiz = swiz;
 
-        c->prog_data.param[c->prog_data.nr_params++] =
+        stage_prog_data->param[stage_prog_data->nr_params++] =
             &fp->Base.Parameters->ParameterValues[index][swiz].f;
       }
    }
@@ -1404,7 +1404,7 @@ fs_visitor::emit_math(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1)
 void
 fs_visitor::assign_curb_setup()
 {
-   c->prog_data.curb_read_length = ALIGN(c->prog_data.nr_params, 8) / 8;
+   c->prog_data.curb_read_length = ALIGN(stage_prog_data->nr_params, 8) / 8;
    if (dispatch_width == 8) {
       c->prog_data.first_curbe_grf = c->nr_payload_regs;
    } else {
@@ -1733,10 +1733,10 @@ bool
 fs_visitor::remove_dead_constants()
 {
    if (dispatch_width == 8) {
-      this->params_remap = ralloc_array(mem_ctx, int, c->prog_data.nr_params);
-      this->nr_params_remap = c->prog_data.nr_params;
+      this->params_remap = ralloc_array(mem_ctx, int, stage_prog_data->nr_params);
+      this->nr_params_remap = stage_prog_data->nr_params;
 
-      for (unsigned int i = 0; i < c->prog_data.nr_params; i++)
+      for (unsigned int i = 0; i < stage_prog_data->nr_params; i++)
         this->params_remap[i] = -1;
 
       /* Find which params are still in use. */
@@ -1754,7 +1754,8 @@ fs_visitor::remove_dead_constants()
             *     "Out-of-bounds reads return undefined values, which include
             *     values from other variables of the active program or zero."
             */
-           if (constant_nr < 0 || constant_nr >= (int)c->prog_data.nr_params) {
+           if (constant_nr < 0 ||
+                constant_nr >= (int)stage_prog_data->nr_params) {
               constant_nr = 0;
            }
 
@@ -1772,23 +1773,23 @@ fs_visitor::remove_dead_constants()
        * now we don't care.
        */
       unsigned int new_nr_params = 0;
-      for (unsigned int i = 0; i < c->prog_data.nr_params; i++) {
+      for (unsigned int i = 0; i < stage_prog_data->nr_params; i++) {
         if (this->params_remap[i] != -1) {
            this->params_remap[i] = new_nr_params++;
         }
       }
 
       /* Update the list of params to be uploaded to match our new numbering. */
-      for (unsigned int i = 0; i < c->prog_data.nr_params; i++) {
+      for (unsigned int i = 0; i < stage_prog_data->nr_params; i++) {
         int remapped = this->params_remap[i];
 
         if (remapped == -1)
            continue;
 
-        c->prog_data.param[remapped] = c->prog_data.param[i];
+        stage_prog_data->param[remapped] = stage_prog_data->param[i];
       }
 
-      c->prog_data.nr_params = new_nr_params;
+      stage_prog_data->nr_params = new_nr_params;
    } else {
       /* This should have been generated in the SIMD8 pass already. */
       assert(this->params_remap);
@@ -1832,9 +1833,9 @@ fs_visitor::remove_dead_constants()
 void
 fs_visitor::move_uniform_array_access_to_pull_constants()
 {
-   int pull_constant_loc[c->prog_data.nr_params];
+   int pull_constant_loc[stage_prog_data->nr_params];
 
-   for (unsigned int i = 0; i < c->prog_data.nr_params; i++) {
+   for (unsigned int i = 0; i < stage_prog_data->nr_params; i++) {
       pull_constant_loc[i] = -1;
    }
 
@@ -1857,14 +1858,14 @@ fs_visitor::move_uniform_array_access_to_pull_constants()
           * add it.
           */
          if (pull_constant_loc[uniform] == -1) {
-            const float **values = &c->prog_data.param[uniform];
+            const float **values = &stage_prog_data->param[uniform];
 
-            pull_constant_loc[uniform] = c->prog_data.nr_pull_params;
+            pull_constant_loc[uniform] = stage_prog_data->nr_pull_params;
 
             assert(param_size[uniform]);
 
             for (int j = 0; j < param_size[uniform]; j++) {
-               c->prog_data.pull_param[c->prog_data.nr_pull_params++] =
+               stage_prog_data->pull_param[stage_prog_data->nr_pull_params++] =
                   values[j];
             }
          }
@@ -1873,7 +1874,7 @@ fs_visitor::move_uniform_array_access_to_pull_constants()
          base_ir = inst->ir;
          current_annotation = inst->annotation;
 
-         fs_reg surf_index = fs_reg(c->prog_data.base.binding_table.pull_constants_start);
+         fs_reg surf_index(stage_prog_data->binding_table.pull_constants_start);
          fs_reg temp = fs_reg(this, glsl_type::float_type);
          exec_list list = VARYING_PULL_CONSTANT_LOAD(temp,
                                                      surf_index,
@@ -1905,7 +1906,7 @@ fs_visitor::setup_pull_constants()
 {
    /* Only allow 16 registers (128 uniform components) as push constants. */
    unsigned int max_uniform_components = 16 * 8;
-   if (c->prog_data.nr_params <= max_uniform_components)
+   if (stage_prog_data->nr_params <= max_uniform_components)
       return;
 
    if (dispatch_width == 16) {
@@ -1918,8 +1919,8 @@ fs_visitor::setup_pull_constants()
     */
    unsigned int pull_uniform_base = max_uniform_components;
 
-   int pull_constant_loc[c->prog_data.nr_params];
-   for (unsigned int i = 0; i < c->prog_data.nr_params; i++) {
+   int pull_constant_loc[stage_prog_data->nr_params];
+   for (unsigned int i = 0; i < stage_prog_data->nr_params; i++) {
       if (i < pull_uniform_base) {
          pull_constant_loc[i] = -1;
       } else {
@@ -1927,20 +1928,20 @@ fs_visitor::setup_pull_constants()
          /* If our constant is already being uploaded for reladdr purposes,
           * reuse it.
           */
-         for (unsigned int j = 0; j < c->prog_data.nr_pull_params; j++) {
-            if (c->prog_data.pull_param[j] == c->prog_data.param[i]) {
+         for (unsigned int j = 0; j < stage_prog_data->nr_pull_params; j++) {
+            if (stage_prog_data->pull_param[j] == stage_prog_data->param[i]) {
                pull_constant_loc[i] = j;
                break;
             }
          }
          if (pull_constant_loc[i] == -1) {
-            int pull_index = c->prog_data.nr_pull_params++;
-            c->prog_data.pull_param[pull_index] = c->prog_data.param[i];
-            pull_constant_loc[i] = pull_index;;
+            int pull_index = stage_prog_data->nr_pull_params++;
+            stage_prog_data->pull_param[pull_index] = stage_prog_data->param[i];
+            pull_constant_loc[i] = pull_index;
          }
       }
    }
-   c->prog_data.nr_params = pull_uniform_base;
+   stage_prog_data->nr_params = pull_uniform_base;
 
    foreach_list(node, &this->instructions) {
       fs_inst *inst = (fs_inst *)node;
@@ -1957,7 +1958,7 @@ fs_visitor::setup_pull_constants()
          assert(!inst->src[i].reladdr);
 
         fs_reg dst = fs_reg(this, glsl_type::float_type);
-        fs_reg index = fs_reg(c->prog_data.base.binding_table.pull_constants_start);
+        fs_reg index(stage_prog_data->binding_table.pull_constants_start);
         fs_reg offset = fs_reg((unsigned)(pull_index * 4) & ~15);
         fs_inst *pull =
             new(mem_ctx) fs_inst(FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD,
@@ -3314,7 +3315,7 @@ bool
 fs_visitor::run()
 {
    sanity_param_count = fp->Base.Parameters->NumParameters;
-   uint32_t orig_nr_params = c->prog_data.nr_params;
+   uint32_t orig_nr_params = stage_prog_data->nr_params;
    bool allocated_without_spills;
 
    assign_binding_table_offsets();
@@ -3464,7 +3465,7 @@ fs_visitor::run()
       c->prog_data.reg_blocks_16 = brw_register_blocks(grf_used);
 
       /* Make sure we didn't try to sneak in an extra uniform */
-      assert(orig_nr_params == c->prog_data.nr_params);
+      assert(orig_nr_params == stage_prog_data->nr_params);
       (void) orig_nr_params;
    }
 
@@ -3527,7 +3528,7 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c,
    exec_list *simd16_instructions = NULL;
    fs_visitor v2(brw, c, prog, fp, 16);
    if (brw->gen >= 5 && likely(!(INTEL_DEBUG & DEBUG_NO16))) {
-      if (c->prog_data.nr_pull_params == 0) {
+      if (c->prog_data.base.nr_pull_params == 0) {
          /* Try a SIMD16 compile */
          v2.import_uniforms(&v);
          if (!v2.run()) {
index 1d42f6b8975bb551aa43837325a604a1f468ff03..f5faac98957fff25291fd8172aab712bdffd90f5 100644 (file)
@@ -593,7 +593,7 @@ fs_visitor::setup_fp_regs()
       for (unsigned p = 0;
            p < prog->Parameters->NumParameters; p++) {
          for (unsigned int i = 0; i < 4; i++) {
-            c->prog_data.param[c->prog_data.nr_params++] =
+            stage_prog_data->param[stage_prog_data->nr_params++] =
                &prog->Parameters->ParameterValues[p][i].f;
          }
       }
index 70b7c663a8cd29ed227164a7caa2e0771c1b976d..9d8dfd91087d8c5961fe36480ae6477f661bfa41 100644 (file)
@@ -102,7 +102,7 @@ fs_visitor::visit(ir_variable *ir)
         }
       }
    } else if (ir->data.mode == ir_var_uniform) {
-      int param_index = c->prog_data.nr_params;
+      int param_index = stage_prog_data->nr_params;
 
       /* Thanks to the lower_ubo_reference pass, we will see only
        * ir_binop_ubo_load expressions and not ir_dereference_variable for UBO
@@ -1467,14 +1467,14 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
         return coordinate;
       }
 
-      scale_x = fs_reg(UNIFORM, c->prog_data.nr_params);
-      scale_y = fs_reg(UNIFORM, c->prog_data.nr_params + 1);
+      scale_x = fs_reg(UNIFORM, stage_prog_data->nr_params);
+      scale_y = fs_reg(UNIFORM, stage_prog_data->nr_params + 1);
 
       GLuint index = _mesa_add_state_reference(params,
                                               (gl_state_index *)tokens);
-      c->prog_data.param[c->prog_data.nr_params++] =
+      stage_prog_data->param[stage_prog_data->nr_params++] =
          &prog->Parameters->ParameterValues[index][0].f;
-      c->prog_data.param[c->prog_data.nr_params++] =
+      stage_prog_data->param[stage_prog_data->nr_params++] =
          &prog->Parameters->ParameterValues[index][1].f;
    }
 
index 1e35191a8ce13dc9348ca0804da4ec3599e9be61..f69c3129c011e246c40472a74cba9039bab56e72 100644 (file)
@@ -544,3 +544,29 @@ brw_destroy_shader_time(struct brw_context *brw)
    drm_intel_bo_unreference(brw->shader_time.bo);
    brw->shader_time.bo = NULL;
 }
+
+bool
+brw_stage_prog_data_compare(const struct brw_stage_prog_data *a,
+                            const struct brw_stage_prog_data *b)
+{
+   /* Compare all the struct up to the pointers. */
+   if (memcmp(a, b, offsetof(struct brw_stage_prog_data, param)))
+      return false;
+
+   if (memcmp(a->param, b->param, a->nr_params * sizeof(void *)))
+      return false;
+
+   if (memcmp(a->pull_param, b->pull_param, a->nr_pull_params * sizeof(void *)))
+      return false;
+
+   return true;
+}
+
+void
+brw_stage_prog_data_free(const void *p)
+{
+   struct brw_stage_prog_data *prog_data = (struct brw_stage_prog_data *)p;
+
+   ralloc_free(prog_data->param);
+   ralloc_free(prog_data->pull_param);
+}
index d7fbe9c64ee0f1185e2741c492c071cfb4160a23..36134de95daa3374ef0ba18363bd4ec01336245d 100644 (file)
@@ -76,6 +76,13 @@ bool brw_debug_recompile_sampler_key(struct brw_context *brw,
                                      const struct brw_sampler_prog_key_data *key);
 void brw_add_texrect_params(struct gl_program *prog);
 
+bool
+brw_stage_prog_data_compare(const struct brw_stage_prog_data *a,
+                            const struct brw_stage_prog_data *b);
+
+void
+brw_stage_prog_data_free(const void *prog_data);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
index af65a5d0f3d9affa5352a740277de5be8b77b5fb..b0986ea08fd4c3e347535ff843f148cb222b2745 100644 (file)
@@ -342,9 +342,9 @@ brw_init_caches(struct brw_context *brw)
    cache->aux_compare[BRW_VS_PROG] = brw_vs_prog_data_compare;
    cache->aux_compare[BRW_GS_PROG] = brw_gs_prog_data_compare;
    cache->aux_compare[BRW_WM_PROG] = brw_wm_prog_data_compare;
-   cache->aux_free[BRW_VS_PROG] = brw_vs_prog_data_free;
-   cache->aux_free[BRW_GS_PROG] = brw_gs_prog_data_free;
-   cache->aux_free[BRW_WM_PROG] = brw_wm_prog_data_free;
+   cache->aux_free[BRW_VS_PROG] = brw_stage_prog_data_free;
+   cache->aux_free[BRW_GS_PROG] = brw_stage_prog_data_free;
+   cache->aux_free[BRW_WM_PROG] = brw_stage_prog_data_free;
 }
 
 static void
index f041bac25e76bdca7d23a08a3c7437bf2ab991f5..53fb9ee222d86c954be7418554cd824f97cf9362 100644 (file)
@@ -443,8 +443,8 @@ vec4_visitor::pack_uniform_registers()
 
         /* Move the references to the data */
         for (int j = 0; j < size; j++) {
-           prog_data->param[dst * 4 + new_chan[src] + j] =
-              prog_data->param[src * 4 + j];
+           stage_prog_data->param[dst * 4 + new_chan[src] + j] =
+              stage_prog_data->param[src * 4 + j];
         }
 
         this->uniform_vector_size[dst] += size;
@@ -595,16 +595,16 @@ vec4_visitor::move_push_constants_to_pull_constants()
       pull_constant_loc[i / 4] = -1;
 
       if (i >= max_uniform_components) {
-        const float **values = &prog_data->param[i];
+        const float **values = &stage_prog_data->param[i];
 
         /* Try to find an existing copy of this uniform in the pull
          * constants if it was part of an array access already.
          */
-        for (unsigned int j = 0; j < prog_data->nr_pull_params; j += 4) {
+        for (unsigned int j = 0; j < stage_prog_data->nr_pull_params; j += 4) {
            int matches;
 
            for (matches = 0; matches < 4; matches++) {
-              if (prog_data->pull_param[j + matches] != values[matches])
+              if (stage_prog_data->pull_param[j + matches] != values[matches])
                  break;
            }
 
@@ -615,11 +615,12 @@ vec4_visitor::move_push_constants_to_pull_constants()
         }
 
         if (pull_constant_loc[i / 4] == -1) {
-           assert(prog_data->nr_pull_params % 4 == 0);
-           pull_constant_loc[i / 4] = prog_data->nr_pull_params / 4;
+           assert(stage_prog_data->nr_pull_params % 4 == 0);
+           pull_constant_loc[i / 4] = stage_prog_data->nr_pull_params / 4;
 
            for (int j = 0; j < 4; j++) {
-              prog_data->pull_param[prog_data->nr_pull_params++] = values[j];
+              stage_prog_data->pull_param[stage_prog_data->nr_pull_params++] =
+                  values[j];
            }
         }
       }
@@ -1403,11 +1404,12 @@ vec4_visitor::setup_uniforms(int reg)
    if (brw->gen < 6 && this->uniforms == 0) {
       this->uniform_vector_size[this->uniforms] = 1;
 
-      prog_data->param = reralloc(NULL, prog_data->param, const float *, 4);
+      stage_prog_data->param =
+         reralloc(NULL, stage_prog_data->param, const float *, 4);
       for (unsigned int i = 0; i < 4; i++) {
         unsigned int slot = this->uniforms * 4 + i;
         static float zero = 0.0;
-        prog_data->param[slot] = &zero;
+        stage_prog_data->param[slot] = &zero;
       }
 
       this->uniforms++;
@@ -1416,7 +1418,7 @@ vec4_visitor::setup_uniforms(int reg)
       reg += ALIGN(uniforms, 2) / 2;
    }
 
-   prog_data->nr_params = this->uniforms * 4;
+   stage_prog_data->nr_params = this->uniforms * 4;
 
    prog_data->curb_read_length = reg - prog_data->dispatch_grf_start_reg;
 
@@ -1731,31 +1733,4 @@ brw_vec4_setup_prog_key_for_precompile(struct gl_context *ctx,
    }
 }
 
-
-bool
-brw_vec4_prog_data_compare(const struct brw_vec4_prog_data *a,
-                           const struct brw_vec4_prog_data *b)
-{
-   /* Compare all the struct (including the base) up to the pointers. */
-   if (memcmp(a, b, offsetof(struct brw_vec4_prog_data, param)))
-      return false;
-
-   if (memcmp(a->param, b->param, a->nr_params * sizeof(void *)))
-      return false;
-
-   if (memcmp(a->pull_param, b->pull_param, a->nr_pull_params * sizeof(void *)))
-      return false;
-
-   return true;
-}
-
-
-void
-brw_vec4_prog_data_free(const struct brw_vec4_prog_data *prog_data)
-{
-   ralloc_free((void *)prog_data->param);
-   ralloc_free((void *)prog_data->pull_param);
-}
-
-
 } /* extern "C" */
index 84f9b0ac3b7c8877b33af40e10e907b594c0683d..9bbb6d823b8d13b8f21bcf0908341a3c0ceccf9e 100644 (file)
@@ -79,9 +79,6 @@ void
 brw_vec4_setup_prog_key_for_precompile(struct gl_context *ctx,
                                        struct brw_vec4_prog_key *key,
                                        GLuint id, struct gl_program *prog);
-bool brw_vec4_prog_data_compare(const struct brw_vec4_prog_data *a,
-                                const struct brw_vec4_prog_data *b);
-void brw_vec4_prog_data_free(const struct brw_vec4_prog_data *prog_data);
 
 #ifdef __cplusplus
 } /* extern "C" */
index abc181ba445d40616f304cb50e73aceee7621668..73a873354092deb7ce736a310fd2644c1c810916 100644 (file)
@@ -62,8 +62,10 @@ do_gs_prog(struct brw_context *brw,
    /* We also upload clip plane data as uniforms */
    param_count += MAX_CLIP_PLANES * 4;
 
-   c.prog_data.base.param = rzalloc_array(NULL, const float *, param_count);
-   c.prog_data.base.pull_param = rzalloc_array(NULL, const float *, param_count);
+   c.prog_data.base.base.param =
+      rzalloc_array(NULL, const float *, param_count);
+   c.prog_data.base.base.pull_param =
+      rzalloc_array(NULL, const float *, param_count);
 
    if (gp->program.OutputType == GL_POINTS) {
       /* When the output type is points, the geometry shader may output data
@@ -360,12 +362,12 @@ brw_gs_prog_data_compare(const void *in_a, const void *in_b)
    const struct brw_gs_prog_data *a = in_a;
    const struct brw_gs_prog_data *b = in_b;
 
-   /* Compare the base vec4 structure. */
-   if (!brw_vec4_prog_data_compare(&a->base, &b->base))
+   /* Compare the base structure. */
+   if (!brw_stage_prog_data_compare(&a->base.base, &b->base.base))
       return false;
 
    /* Compare the rest of the struct. */
-   const unsigned offset = sizeof(struct brw_vec4_prog_data);
+   const unsigned offset = sizeof(struct brw_stage_prog_data);
    if (memcmp(((char *) a) + offset, ((char *) b) + offset,
               sizeof(struct brw_gs_prog_data) - offset)) {
       return false;
@@ -373,12 +375,3 @@ brw_gs_prog_data_compare(const void *in_a, const void *in_b)
 
    return true;
 }
-
-
-void
-brw_gs_prog_data_free(const void *in_prog_data)
-{
-   const struct brw_gs_prog_data *prog_data = in_prog_data;
-
-   brw_vec4_prog_data_free(&prog_data->base);
-}
index b209d80c96e4fc46491e88a612b1ac855f9b2582..5d4244edf8588b34be59076c937b481ceed3fed9 100644 (file)
@@ -35,7 +35,6 @@ struct gl_shader_program;
 
 bool brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
 bool brw_gs_prog_data_compare(const void *a, const void *b);
-void brw_gs_prog_data_free(const void *in_prog_data);
 
 #ifdef __cplusplus
 } /* extern "C" */
index 3bdb2423215e43b116a9d8cdecf491809781e150..1448a61f31500872a8add102aa654e5601a5057a 100644 (file)
@@ -667,12 +667,12 @@ vec4_visitor::setup_uniform_values(ir_variable *ir)
 
          int i;
          for (i = 0; i < uniform_vector_size[uniforms]; i++) {
-            prog_data->param[uniforms * 4 + i] = &components->f;
+            stage_prog_data->param[uniforms * 4 + i] = &components->f;
             components++;
          }
          for (; i < 4; i++) {
             static float zero = 0;
-            prog_data->param[uniforms * 4 + i] = &zero;
+            stage_prog_data->param[uniforms * 4 + i] = &zero;
          }
 
          uniforms++;
@@ -690,7 +690,7 @@ vec4_visitor::setup_uniform_clipplane_values()
       this->userplane[i] = dst_reg(UNIFORM, this->uniforms);
       this->userplane[i].type = BRW_REGISTER_TYPE_F;
       for (int j = 0; j < 4; ++j) {
-         prog_data->param[this->uniforms * 4 + j] = &clip_planes[i][j];
+         stage_prog_data->param[this->uniforms * 4 + j] = &clip_planes[i][j];
       }
       ++this->uniforms;
    }
@@ -725,7 +725,7 @@ vec4_visitor::setup_builtin_uniform_values(ir_variable *ir)
         int swiz = GET_SWZ(slots[i].swizzle, j);
         last_swiz = swiz;
 
-        prog_data->param[this->uniforms * 4 + j] = &values[swiz];
+        stage_prog_data->param[this->uniforms * 4 + j] = &values[swiz];
         if (swiz <= last_swiz)
            this->uniform_vector_size[this->uniforms]++;
       }
@@ -3265,12 +3265,12 @@ vec4_visitor::move_uniform_array_access_to_pull_constants()
          * add it.
          */
         if (pull_constant_loc[uniform] == -1) {
-           const float **values = &prog_data->param[uniform * 4];
+           const float **values = &stage_prog_data->param[uniform * 4];
 
-           pull_constant_loc[uniform] = prog_data->nr_pull_params / 4;
+           pull_constant_loc[uniform] = stage_prog_data->nr_pull_params / 4;
 
            for (int j = 0; j < uniform_size[uniform] * 4; j++) {
-              prog_data->pull_param[prog_data->nr_pull_params++]
+              stage_prog_data->pull_param[stage_prog_data->nr_pull_params++]
                   = values[j];
            }
         }
index d98bad18c3cf07bef870485526d610c86aa2c1f7..0ec37c17a7c2783bb6a90b4921b95f57a5bb3890 100644 (file)
@@ -415,10 +415,10 @@ vec4_vs_visitor::emit_program_code()
          vs_compile->vp->program.Base.Parameters;
       unsigned i;
       for (i = 0; i < params->NumParameters * 4; i++) {
-         prog_data->pull_param[i] =
+         stage_prog_data->pull_param[i] =
             &params->ParameterValues[i / 4][i % 4].f;
       }
-      prog_data->nr_pull_params = i;
+      stage_prog_data->nr_pull_params = i;
    }
 }
 
@@ -446,7 +446,7 @@ vec4_vs_visitor::setup_vp_regs()
       this->uniform_size[this->uniforms] = 1; /* 1 vec4 */
       this->uniform_vector_size[this->uniforms] = components;
       for (unsigned i = 0; i < 4; i++) {
-         prog_data->param[this->uniforms * 4 + i] = i >= components
+         stage_prog_data->param[this->uniforms * 4 + i] = i >= components
             ? 0 : &plist->ParameterValues[p][i].f;
       }
       this->uniforms++; /* counted in vec4 units */
index 092d53af3f59b839353cf5476b6c770762b6a978..3e319a650b81e177d7ad52d5e65fce41bb73bcf7 100644 (file)
@@ -182,12 +182,12 @@ brw_vs_prog_data_compare(const void *in_a, const void *in_b)
    const struct brw_vs_prog_data *a = in_a;
    const struct brw_vs_prog_data *b = in_b;
 
-   /* Compare the base vec4 structure. */
-   if (!brw_vec4_prog_data_compare(&a->base, &b->base))
+   /* Compare the base structure. */
+   if (!brw_stage_prog_data_compare(&a->base.base, &b->base.base))
       return false;
 
    /* Compare the rest of the struct. */
-   const unsigned offset = sizeof(struct brw_vec4_prog_data);
+   const unsigned offset = sizeof(struct brw_stage_prog_data);
    if (memcmp(((char *) a) + offset, ((char *) b) + offset,
               sizeof(struct brw_vs_prog_data) - offset)) {
       return false;
@@ -206,6 +206,7 @@ do_vs_prog(struct brw_context *brw,
    const GLuint *program;
    struct brw_vs_compile c;
    struct brw_vs_prog_data prog_data;
+   struct brw_stage_prog_data *stage_prog_data = &prog_data.base.base;
    void *mem_ctx;
    int i;
    struct gl_shader *vs = NULL;
@@ -241,8 +242,8 @@ do_vs_prog(struct brw_context *brw,
     */
    param_count += c.key.base.nr_userclip_plane_consts * 4;
 
-   prog_data.base.param = rzalloc_array(NULL, const float *, param_count);
-   prog_data.base.pull_param = rzalloc_array(NULL, const float *, param_count);
+   stage_prog_data->param = rzalloc_array(NULL, const float *, param_count);
+   stage_prog_data->pull_param = rzalloc_array(NULL, const float *, param_count);
 
    GLbitfield64 outputs_written = vp->program.Base.OutputsWritten;
    prog_data.inputs_read = vp->program.Base.InputsRead;
@@ -545,12 +546,3 @@ brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
 
    return success;
 }
-
-
-void
-brw_vs_prog_data_free(const void *in_prog_data)
-{
-   const struct brw_vs_prog_data *prog_data = in_prog_data;
-
-   brw_vec4_prog_data_free(&prog_data->base);
-}
index a1738d720ca214872f189a1151a3c9d7067d70d8..207cd5c94d006bbc3fb71a722df055af23646d22 100644 (file)
@@ -94,7 +94,6 @@ void brw_vs_debug_recompile(struct brw_context *brw,
                             struct gl_shader_program *prog,
                             const struct brw_vs_prog_key *key);
 bool brw_vs_prog_data_compare(const void *a, const void *b);
-void brw_vs_prog_data_free(const void *in_prog_data);
 
 #ifdef __cplusplus
 } /* extern "C" */
index bb56d7a500751f219aef0976baa57a37c725d3b3..82c19c75831333cff924cb8cabf23da6f4fcd736 100644 (file)
@@ -51,7 +51,7 @@ brw_upload_vec4_pull_constants(struct brw_context *brw,
     */
    _mesa_load_state_parameters(&brw->ctx, prog->Parameters);
 
-   if (!prog_data->nr_pull_params) {
+   if (!prog_data->base.nr_pull_params) {
       if (stage_state->const_bo) {
         drm_intel_bo_unreference(stage_state->const_bo);
         stage_state->const_bo = NULL;
@@ -63,20 +63,20 @@ brw_upload_vec4_pull_constants(struct brw_context *brw,
 
    /* _NEW_PROGRAM_CONSTANTS */
    drm_intel_bo_unreference(stage_state->const_bo);
-   uint32_t size = prog_data->nr_pull_params * 4;
+   uint32_t size = prog_data->base.nr_pull_params * 4;
    stage_state->const_bo = drm_intel_bo_alloc(brw->bufmgr, "vec4_const_buffer",
                                            size, 64);
 
    drm_intel_gem_bo_map_gtt(stage_state->const_bo);
 
-   for (i = 0; i < prog_data->nr_pull_params; i++) {
+   for (i = 0; i < prog_data->base.nr_pull_params; i++) {
       memcpy(stage_state->const_bo->virtual + i * 4,
-            prog_data->pull_param[i],
+            prog_data->base.pull_param[i],
             4);
    }
 
    if (0) {
-      for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) {
+      for (i = 0; i < ALIGN(prog_data->base.nr_pull_params, 4) / 4; i++) {
         float *row = (float *)stage_state->const_bo->virtual + i * 4;
         printf("const surface %3d: %4.3f %4.3f %4.3f %4.3f\n",
                i, row[0], row[1], row[2], row[3]);
index 7eccbcb07e18eb0f1bf8dd42bce5afb0f30da097..31c68f4c3f421308efc32b1093ba21b407693cb5 100644 (file)
@@ -122,28 +122,19 @@ brw_wm_prog_data_compare(const void *in_a, const void *in_b)
    const struct brw_wm_prog_data *a = in_a;
    const struct brw_wm_prog_data *b = in_b;
 
-   /* Compare all the struct (including the base) up to the pointers. */
-   if (memcmp(a, b, offsetof(struct brw_wm_prog_data, param)))
+   /* Compare the base structure. */
+   if (!brw_stage_prog_data_compare(&a->base, &b->base))
       return false;
 
-   if (memcmp(a->param, b->param, a->nr_params * sizeof(void *)))
-      return false;
-
-   if (memcmp(a->pull_param, b->pull_param, a->nr_pull_params * sizeof(void *)))
+   /* Compare the rest of the structure. */
+   const unsigned offset = sizeof(struct brw_stage_prog_data);
+   if (memcmp(((char *) a) + offset, ((char *) b) + offset,
+              sizeof(struct brw_wm_prog_data) - offset))
       return false;
 
    return true;
 }
 
-void
-brw_wm_prog_data_free(const void *in_prog_data)
-{
-   const struct brw_wm_prog_data *prog_data = in_prog_data;
-
-   ralloc_free((void *)prog_data->param);
-   ralloc_free((void *)prog_data->pull_param);
-}
-
 /**
  * All Mesa program -> GPU code generation goes through this function.
  * Depending on the instructions used (i.e. flow control instructions)
@@ -177,8 +168,9 @@ bool do_wm_prog(struct brw_context *brw,
    }
    /* The backend also sometimes adds params for texture size. */
    param_count += 2 * ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
-   c->prog_data.param = rzalloc_array(NULL, const float *, param_count);
-   c->prog_data.pull_param = rzalloc_array(NULL, const float *, param_count);
+   c->prog_data.base.param = rzalloc_array(NULL, const float *, param_count);
+   c->prog_data.base.pull_param =
+      rzalloc_array(NULL, const float *, param_count);
 
    memcpy(&c->key, key, sizeof(*key));
 
index 14a4b8bb5a6c5720dfb7ab20fa6c63393120f801..9dfb23b5e61963559ffe19cd40e88622db48daf7 100644 (file)
@@ -122,6 +122,5 @@ void brw_wm_debug_recompile(struct brw_context *brw,
                             struct gl_shader_program *prog,
                             const struct brw_wm_prog_key *key);
 bool brw_wm_prog_data_compare(const void *a, const void *b);
-void brw_wm_prog_data_free(const void *in_prog_data);
 
 #endif
index d16953f9db0f41308e24678401929cca3e13026e..303b5cb966241a32f5c1935dd07eaa57ee1a20ed 100644 (file)
@@ -464,7 +464,7 @@ brw_upload_wm_pull_constants(struct brw_context *brw)
    struct brw_fragment_program *fp =
       (struct brw_fragment_program *) brw->fragment_program;
    struct gl_program_parameter_list *params = fp->program.Base.Parameters;
-   const int size = brw->wm.prog_data->nr_pull_params * sizeof(float);
+   const int size = brw->wm.prog_data->base.nr_pull_params * sizeof(float);
    const int surf_index =
       brw->wm.prog_data->base.binding_table.pull_constants_start;
    float *constants;
@@ -473,7 +473,7 @@ brw_upload_wm_pull_constants(struct brw_context *brw)
    _mesa_load_state_parameters(ctx, params);
 
    /* CACHE_NEW_WM_PROG */
-   if (brw->wm.prog_data->nr_pull_params == 0) {
+   if (brw->wm.prog_data->base.nr_pull_params == 0) {
       if (brw->wm.base.const_bo) {
         drm_intel_bo_unreference(brw->wm.base.const_bo);
         brw->wm.base.const_bo = NULL;
@@ -490,8 +490,8 @@ brw_upload_wm_pull_constants(struct brw_context *brw)
    /* _NEW_PROGRAM_CONSTANTS */
    drm_intel_gem_bo_map_gtt(brw->wm.base.const_bo);
    constants = brw->wm.base.const_bo->virtual;
-   for (i = 0; i < brw->wm.prog_data->nr_pull_params; i++) {
-      constants[i] = *brw->wm.prog_data->pull_param[i];
+   for (i = 0; i < brw->wm.prog_data->base.nr_pull_params; i++) {
+      constants[i] = *brw->wm.prog_data->base.pull_param[i];
    }
    drm_intel_gem_bo_unmap_gtt(brw->wm.base.const_bo);
 
index 6c6f73979cbc706b43f6c0dab3784f379dddfe2c..5974ba7a8f11a2fc0fe6680ee3928e2eb9707499 100644 (file)
@@ -48,7 +48,7 @@ gen6_upload_vec4_push_constants(struct brw_context *brw,
    /* XXX: Should this happen somewhere before to get our state flag set? */
    _mesa_load_state_parameters(ctx, prog->Parameters);
 
-   if (prog_data->nr_params == 0) {
+   if (prog_data->base.nr_params == 0) {
       stage_state->push_const_size = 0;
    } else {
       int params_uploaded;
@@ -56,7 +56,7 @@ gen6_upload_vec4_push_constants(struct brw_context *brw,
       int i;
 
       param = brw_state_batch(brw, type,
-                             prog_data->nr_params * sizeof(float),
+                             prog_data->base.nr_params * sizeof(float),
                              32, &stage_state->push_const_offset);
 
       /* _NEW_PROGRAM_CONSTANTS
@@ -65,10 +65,10 @@ gen6_upload_vec4_push_constants(struct brw_context *brw,
        * side effect of dereferencing uniforms, so _NEW_PROGRAM_CONSTANTS
        * wouldn't be set for them.
       */
-      for (i = 0; i < prog_data->nr_params; i++) {
-         param[i] = *prog_data->param[i];
+      for (i = 0; i < prog_data->base.nr_params; i++) {
+         param[i] = *prog_data->base.param[i];
       }
-      params_uploaded = prog_data->nr_params / 4;
+      params_uploaded = prog_data->base.nr_params / 4;
 
       if (0) {
         printf("Constant buffer:\n");
index 3d63ae7c7d6e37beb0855358dc9d9536b1b48605..4071f6b2f10846c3fe8d4e54e16168893b7b8628 100644 (file)
@@ -51,23 +51,23 @@ gen6_upload_wm_push_constants(struct brw_context *brw)
    /* XXX: Should this happen somewhere before to get our state flag set? */
    _mesa_load_state_parameters(ctx, fp->program.Base.Parameters);
 
-   if (prog_data->nr_params == 0) {
+   if (prog_data->base.nr_params == 0) {
       brw->wm.base.push_const_size = 0;
    } else {
       float *constants;
       unsigned int i;
 
       constants = brw_state_batch(brw, AUB_TRACE_WM_CONSTANTS,
-                                 prog_data->nr_params * sizeof(float),
+                                 prog_data->base.nr_params * sizeof(float),
                                  32, &brw->wm.base.push_const_offset);
 
-      for (i = 0; i < prog_data->nr_params; i++) {
-        constants[i] = *prog_data->param[i];
+      for (i = 0; i < prog_data->base.nr_params; i++) {
+        constants[i] = *prog_data->base.param[i];
       }
 
       if (0) {
         printf("WM constants:\n");
-        for (i = 0; i < prog_data->nr_params; i++) {
+        for (i = 0; i < prog_data->base.nr_params; i++) {
            if ((i & 7) == 0)
               printf("g%d: ", prog_data->first_curbe_grf + i / 8);
            printf("%8f ", constants[i]);
@@ -79,7 +79,7 @@ gen6_upload_wm_push_constants(struct brw_context *brw)
         printf("\n");
       }
 
-      brw->wm.base.push_const_size = ALIGN(prog_data->nr_params, 8) / 8;
+      brw->wm.base.push_const_size = ALIGN(prog_data->base.nr_params, 8) / 8;
    }
 }
 
@@ -105,7 +105,7 @@ upload_wm_state(struct brw_context *brw)
    bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
 
     /* CACHE_NEW_WM_PROG */
-   if (brw->wm.prog_data->nr_params == 0) {
+   if (brw->wm.prog_data->base.nr_params == 0) {
       /* Disable the push constant buffers. */
       BEGIN_BATCH(5);
       OUT_BATCH(_3DSTATE_CONSTANT_PS << 16 | (5 - 2));
index 68eb240dde3e79fc92f9e614a553978ccf53a068..38067e60c8ba5b5086c6d268d8b12ca503690778 100644 (file)
@@ -186,7 +186,7 @@ upload_ps_state(struct brw_context *brw)
    dw4 |= (brw->max_wm_threads - 1) << max_threads_shift;
 
    /* CACHE_NEW_WM_PROG */
-   if (brw->wm.prog_data->nr_params > 0)
+   if (brw->wm.prog_data->base.nr_params > 0)
       dw4 |= GEN7_PS_PUSH_CONSTANT_ENABLE;
 
    /* From the IVB PRM, volume 2 part 1, page 287:
index b45da8f721eca188882134eaff875f4cb9fb6a90..63612e7544000c72239eeb20d01d71b79f4c0049 100644 (file)
@@ -163,7 +163,7 @@ upload_ps_state(struct brw_context *brw)
    dw6 |= (brw->max_wm_threads - 2) << HSW_PS_MAX_THREADS_SHIFT;
 
    /* CACHE_NEW_WM_PROG */
-   if (brw->wm.prog_data->nr_params > 0)
+   if (brw->wm.prog_data->base.nr_params > 0)
       dw6 |= GEN7_PS_PUSH_CONSTANT_ENABLE;
 
    dw6 |= GEN7_PS_8_DISPATCH_ENABLE;