[Mesa-dev] [PATCH 19/27] i965/fs/nir: Append nir_intrinsic_load_ubo entries to the gather table

Pohjolainen, Topi topi.pohjolainen at intel.com
Thu May 7 08:40:13 PDT 2015


On Tue, Apr 28, 2015 at 11:08:16PM +0300, Abdiel Janulgue wrote:
> When the const block and offset are immediate values. Otherwise just
> fall-back to the previous method of uploading the UBO constant data to
> GRF using pull constants.
> 
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_fs.h       |  2 ++
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 59 ++++++++++++++++++++++++++++++++
>  2 files changed, 61 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index a48b2bb..5247fa1 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -418,6 +418,8 @@ public:
>     void setup_builtin_uniform_values(ir_variable *ir);
>     int implied_mrf_writes(fs_inst *inst);
>     bool generate_ubo_gather_table(ir_expression* ir);
> +   bool nir_generate_ubo_gather_table(nir_intrinsic_instr *instr, fs_reg &dest,
> +                                      bool has_indirect);
>  
>     virtual void dump_instructions();
>     virtual void dump_instructions(const char *name);
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 3972581..b68f221 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -1377,6 +1377,9 @@ fs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>        has_indirect = true;
>        /* fallthrough */
>     case nir_intrinsic_load_ubo: {
> +      if (nir_generate_ubo_gather_table(instr, dest, has_indirect))
> +         break;
> +
>        nir_const_value *const_index = nir_src_as_const_value(instr->src[0]);
>        fs_reg surf_index;
>  
> @@ -1774,3 +1777,59 @@ fs_visitor::nir_emit_jump(nir_jump_instr *instr)
>        unreachable("unknown jump");
>     }
>  }
> +
> +bool
> +fs_visitor::nir_generate_ubo_gather_table(nir_intrinsic_instr *instr, fs_reg &dest,
> +                                          bool has_indirect)
> +{
> +   nir_const_value *const_index = nir_src_as_const_value(instr->src[0]);

Used only for reading, const.

> +
> +   if (!const_index || has_indirect || !brw->fs_ubo_gather || !brw->has_resource_streamer)

Wrap this line.

> +      return false;
> +
> +   /* Only allow 16 registers (128 uniform components) as push constants.
> +    */
> +   unsigned int max_push_components = 16 * 8;
> +   unsigned param_index = uniforms + ubo_uniforms;

These would be nicer as constants.

> +   if ((MAX2(param_index, num_direct_uniforms) +
> +        instr->num_components) > max_push_components)
> +      return false;
> +
> +   fs_reg uniform_reg;
> +   if (dispatch_width == 16) {
> +      for (int i = 0; i < (int) this->nr_ubo_gather_table; i++) {

Extra space.

> +         if ((this->ubo_gather_table[i].const_block ==
> +              const_index->u[0]) &&
> +             (this->ubo_gather_table[i].const_offset ==
> +              (unsigned) instr->const_index[0])) {

Here also.

> +            uniform_reg = fs_reg(UNIFORM, this->ubo_gather_table[i].reg);
> +            break;
> +         }
> +      }
> +      if (uniform_reg.file != UNIFORM) {
> +         /* Unlikely but this means that SIMD8 wasn't able to allocate push constant

Wrap this line.

> +          * registers for this ubo load. Fall back to pull-constant method.
> +          */
> +         return false;
> +      }
> +   }
> +
> +   if (uniform_reg.file != UNIFORM) {
> +      uniform_reg = fs_reg(UNIFORM, param_index);
> +      int gather = this->nr_ubo_gather_table++;
> +
> +      assert(instr->num_components <= 4);
> +      ubo_uniforms += instr->num_components;
> +      this->ubo_gather_table[gather].reg = uniform_reg.reg;
> +      this->ubo_gather_table[gather].const_block = const_index->u[0];
> +      this->ubo_gather_table[gather].const_offset = instr->const_index[0];
> +   }
> +
> +   for (unsigned j = 0; j < instr->num_components; j++) {
> +      fs_reg src = offset(retype(uniform_reg, dest.type), j);
> +      emit(MOV(dest, src));
> +      dest = offset(dest, 1);
> +   }
> +
> +   return true;
> +}
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list