Like the VEC4 back-end does. It will make dynamic allocation of the param_size array easier in a future commit. --- src/mesa/drivers/dri/i965/brw_fs.cpp | 51 +++++++++++++--------------- src/mesa/drivers/dri/i965/brw_fs.h | 3 ++ src/mesa/drivers/dri/i965/brw_fs_fp.cpp | 2 +- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 11 +++--- 4 files changed, 34 insertions(+), 33 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index eecde62..bc66e4a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -883,7 +883,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 = uniforms; for (unsigned u = 0; u < shader_prog->NumUserUniformStorage; u++) { struct gl_uniform_storage *storage = &shader_prog->UniformStorage[u]; @@ -899,14 +899,13 @@ 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++] = + c->prog_data.param[uniforms++] = &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); + assert(params_before + ir->type->component_slots() == uniforms); (void)params_before; } @@ -939,7 +938,7 @@ fs_visitor::setup_builtin_uniform_values(ir_variable *ir) break; last_swiz = swiz; - c->prog_data.param[c->prog_data.nr_params++] = + c->prog_data.param[uniforms++] = &fp->Base.Parameters->ParameterValues[index][swiz].f; } } @@ -1368,13 +1367,17 @@ 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; if (dispatch_width == 8) { c->prog_data.first_curbe_grf = c->nr_payload_regs; + c->prog_data.nr_params = uniforms; } else { c->prog_data.first_curbe_grf_16 = c->nr_payload_regs; + /* Make sure we didn't try to sneak in an extra uniform */ + assert(uniforms == 0); } + c->prog_data.curb_read_length = ALIGN(c->prog_data.nr_params, 8) / 8; + /* Map the offsets in the UNIFORM file to fixed HW regs. */ foreach_list(node, &this->instructions) { fs_inst *inst = (fs_inst *)node; @@ -1695,10 +1698,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, uniforms); + this->nr_params_remap = uniforms; - for (unsigned int i = 0; i < c->prog_data.nr_params; i++) + for (unsigned int i = 0; i < uniforms; i++) this->params_remap[i] = -1; /* Find which params are still in use. */ @@ -1716,7 +1719,7 @@ 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)uniforms) { constant_nr = 0; } @@ -1734,14 +1737,14 @@ 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 < uniforms; 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 < uniforms; i++) { int remapped = this->params_remap[i]; if (remapped == -1) @@ -1750,7 +1753,7 @@ fs_visitor::remove_dead_constants() c->prog_data.param[remapped] = c->prog_data.param[i]; } - c->prog_data.nr_params = new_nr_params; + uniforms = new_nr_params; } else { /* This should have been generated in the 8-wide pass already. */ assert(this->params_remap); @@ -1794,9 +1797,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[uniforms]; - for (unsigned int i = 0; i < c->prog_data.nr_params; i++) { + for (unsigned int i = 0; i < uniforms; i++) { pull_constant_loc[i] = -1; } @@ -1867,7 +1870,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 (uniforms <= max_uniform_components) return; if (dispatch_width == 16) { @@ -1880,8 +1883,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[uniforms]; + for (unsigned int i = 0; i < uniforms; i++) { if (i < pull_uniform_base) { pull_constant_loc[i] = -1; } else { @@ -1902,7 +1905,7 @@ fs_visitor::setup_pull_constants() } } } - c->prog_data.nr_params = pull_uniform_base; + uniforms = pull_uniform_base; foreach_list(node, &this->instructions) { fs_inst *inst = (fs_inst *)node; @@ -3194,7 +3197,6 @@ bool fs_visitor::run() { sanity_param_count = fp->Base.Parameters->NumParameters; - uint32_t orig_nr_params = c->prog_data.nr_params; bool allocated_without_spills; assign_binding_table_offsets(); @@ -3336,16 +3338,11 @@ fs_visitor::run() if (!allocated_without_spills) schedule_instructions(SCHEDULE_POST); - if (dispatch_width == 8) { + if (dispatch_width == 8) c->prog_data.reg_blocks = brw_register_blocks(grf_used); - } else { + else 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); - (void) orig_nr_params; - } - /* If any state parameters were appended, then ParameterValues could have * been realloced, in which case the driver uniform storage set up by * _mesa_associate_uniform_storage() would point to freed memory. Make diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 7991b87..9f4a1be 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -441,6 +441,9 @@ public: int *virtual_grf_end; brw::fs_live_variables *live_intervals; + /** Number of uniform variable components visited. */ + unsigned uniforms; + /* This is the map from UNIFORM hw_reg + reg_offset as generated by * the visitor to the packed uniform number after * remove_dead_constants() that represents the actual uploaded diff --git a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp index 1ebaa4f..d51e679 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp @@ -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++] = + c->prog_data.param[uniforms++] = &prog->Parameters->ParameterValues[p][i].f; } } diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 3b08f6f..a045100 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -102,7 +102,7 @@ fs_visitor::visit(ir_variable *ir) } } } else if (ir->mode == ir_var_uniform) { - int param_index = c->prog_data.nr_params; + int param_index = uniforms; /* Thanks to the lower_ubo_reference pass, we will see only * ir_binop_ubo_load expressions and not ir_dereference_variable for UBO @@ -1447,14 +1447,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, uniforms); + scale_y = fs_reg(UNIFORM, uniforms + 1); GLuint index = _mesa_add_state_reference(params, (gl_state_index *)tokens); - c->prog_data.param[c->prog_data.nr_params++] = + c->prog_data.param[uniforms++] = &prog->Parameters->ParameterValues[index][0].f; - c->prog_data.param[c->prog_data.nr_params++] = + c->prog_data.param[uniforms++] = &prog->Parameters->ParameterValues[index][1].f; } @@ -2917,6 +2917,7 @@ fs_visitor::fs_visitor(struct brw_context *brw, this->virtual_grf_end = NULL; this->live_intervals = NULL; + this->uniforms = 0; this->params_remap = NULL; this->nr_params_remap = 0; -- 1.8.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev