[Mesa-dev] [PATCH 23/59] i965/fs: use the NIR bit size when creating registers

Kenneth Graunke kenneth at whitecape.org
Sat Apr 30 07:26:30 UTC 2016


On Friday, April 29, 2016 1:29:20 PM PDT Samuel Iglesias Gonsálvez wrote:
> From: Connor Abbott <connor.w.abbott at intel.com>
> 
> v2 (Iago):
>   - Squashed bits from 'support double precission constant operands for
>     the implementation of 64-bit emit_load_const'.
>   - Do not use BRW_REGISTER_TYPE_D for all 32-bit registers since that 
breaks
>     asserts and functionality for some piglit tests. Just keep 32-bit types
>     untouched and add 64-bit support.
>   - Use DF instead of Q for 64-bit registers. Otherwise the code we generate
>     will use Q sometimes and DF others and we hit unwanted DF/Q conversions,
>     so always use DF.
> 
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> Signed-off-by: Tapani Palli <tapani.palli at intel.com>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue at linux.intel.com>
> Signed-off-by: Iago Toral Quiroga <itoral at igalia.com>
> ---
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 33 +++++++++++++++++++++++
+--------
>  1 file changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/
dri/i965/brw_fs_nir.cpp
> index 360e2c9..333ca2b 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -365,7 +365,9 @@ fs_visitor::nir_emit_impl(nir_function_impl *impl)
>        unsigned array_elems =
>           reg->num_array_elems == 0 ? 1 : reg->num_array_elems;
>        unsigned size = array_elems * reg->num_components;
> -      nir_locals[reg->index] = bld.vgrf(BRW_REGISTER_TYPE_F, size);
> +      brw_reg_type reg_type =
> +         reg->bit_size == 32 ? BRW_REGISTER_TYPE_F : BRW_REGISTER_TYPE_DF;
> +      nir_locals[reg->index] = bld.vgrf(reg_type, size);
>     }
>  
>     nir_ssa_values = reralloc(mem_ctx, nir_ssa_values, fs_reg,
> @@ -1201,10 +1203,21 @@ void
>  fs_visitor::nir_emit_load_const(const fs_builder &bld,
>                                  nir_load_const_instr *instr)
>  {
> -   fs_reg reg = bld.vgrf(BRW_REGISTER_TYPE_D, instr->def.num_components);
> +   brw_reg_type reg_type =
> +      instr->def.bit_size == 32 ? BRW_REGISTER_TYPE_D : 
BRW_REGISTER_TYPE_DF;
> +   fs_reg reg = bld.vgrf(reg_type, instr->def.num_components);
>  
> -   for (unsigned i = 0; i < instr->def.num_components; i++)
> -      bld.MOV(offset(reg, bld, i), brw_imm_d(instr->value.i32[i]));
> +   switch (instr->def.bit_size) {
> +   case 32:
> +      for (unsigned i = 0; i < instr->def.num_components; i++)
> +         bld.MOV(offset(reg, bld, i), brw_imm_d(instr->value.i32[i]));
> +      break;
> +
> +   case 64:
> +      for (unsigned i = 0; i < instr->def.num_components; i++)
> +         bld.MOV(offset(reg, bld, i), brw_imm_df(instr->value.f64[i]));
> +      break;

How about adding:

   default:
      unreachable("Invalid bit size")

Either way is fine.

> +   }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160430/1434780d/attachment.sig>


More information about the mesa-dev mailing list