i965: Assert array index on access to vec4_visitor's arrays.
authorPetri Latvala <petri.latvala@intel.com>
Thu, 27 Feb 2014 14:15:05 +0000 (16:15 +0200)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 28 Feb 2014 23:05:38 +0000 (15:05 -0800)
v2: vec4_visitor::pack_uniform_registers(): Use correct comparison in the
  assert, this->uniforms is already adjusted. Compare the actual value used to
  index uniform_size and uniform_vector_size instead.

Signed-off-by: Petri Latvala <petri.latvala@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index fcb7365c5d11decfd7771921782629cf9f510f2a..c30afaecda6a1f1cfe035aacc93e3c4939856b04 100644 (file)
@@ -422,6 +422,7 @@ vec4_visitor::pack_uniform_registers()
     * push constants.
     */
    for (int src = 0; src < uniforms; src++) {
+      assert(src < uniform_array_size);
       int size = this->uniform_vector_size[src];
 
       if (!uniform_used[src]) {
@@ -1404,6 +1405,7 @@ vec4_visitor::setup_uniforms(int reg)
     * matter what, or the GPU would hang.
     */
    if (brw->gen < 6 && this->uniforms == 0) {
+      assert(this->uniforms < this->uniform_array_size);
       this->uniform_vector_size[this->uniforms] = 1;
 
       stage_prog_data->param =
index cc92a8acc8967ad82eac4dd9cb72cceb4fdc6e87..88ee929e27ca30b4cb34949861c1d66244636362 100644 (file)
@@ -664,6 +664,7 @@ vec4_visitor::setup_uniform_values(ir_variable *ir)
                                storage->type->matrix_columns);
 
       for (unsigned s = 0; s < vector_count; s++) {
+         assert(uniforms < uniform_array_size);
          uniform_vector_size[uniforms] = storage->type->vector_elements;
 
          int i;
@@ -687,6 +688,7 @@ vec4_visitor::setup_uniform_clipplane_values()
    gl_clip_plane *clip_planes = brw_select_clip_planes(ctx);
 
    for (int i = 0; i < key->nr_userclip_plane_consts; ++i) {
+      assert(this->uniforms < uniform_array_size);
       this->uniform_vector_size[this->uniforms] = 4;
       this->userplane[i] = dst_reg(UNIFORM, this->uniforms);
       this->userplane[i].type = BRW_REGISTER_TYPE_F;
@@ -717,6 +719,7 @@ vec4_visitor::setup_builtin_uniform_values(ir_variable *ir)
                                            (gl_state_index *)slots[i].tokens);
       float *values = &this->prog->Parameters->ParameterValues[index][0].f;
 
+      assert(this->uniforms < uniform_array_size);
       this->uniform_vector_size[this->uniforms] = 0;
       /* Add each of the unique swizzled channels of the element.
        * This will end up matching the size of the glsl_type of this field.
@@ -727,6 +730,7 @@ vec4_visitor::setup_builtin_uniform_values(ir_variable *ir)
         last_swiz = swiz;
 
         stage_prog_data->param[this->uniforms * 4 + j] = &values[swiz];
+        assert(this->uniforms < uniform_array_size);
         if (swiz <= last_swiz)
            this->uniform_vector_size[this->uniforms]++;
       }
@@ -976,6 +980,7 @@ vec4_visitor::visit(ir_variable *ir)
       /* Track how big the whole uniform variable is, in case we need to put a
        * copy of its data into pull constants for array access.
        */
+      assert(this->uniforms < uniform_array_size);
       this->uniform_size[this->uniforms] = type_size(ir->type);
 
       if (!strncmp(ir->name, "gl_", 3)) {
@@ -3302,6 +3307,7 @@ vec4_visitor::move_uniform_array_access_to_pull_constants()
 
            pull_constant_loc[uniform] = stage_prog_data->nr_pull_params / 4;
 
+           assert(uniform < uniform_array_size);
            for (int j = 0; j < uniform_size[uniform] * 4; j++) {
               stage_prog_data->pull_param[stage_prog_data->nr_pull_params++]
                   = values[j];