[Mesa-dev] [PATCH 18/23] i965/fs: add SHUFFLE_32BIT_DATA_FOR_64BIT_WRITE helper

Kenneth Graunke kenneth at whitecape.org
Tue May 10 19:43:18 UTC 2016


On Tuesday, May 3, 2016 2:22:07 PM PDT Samuel Iglesias Gonsálvez wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
> 
> This does the inverse operation of SHUFFLE_32BIT_LOAD_RESULT_TO_64BIT_DATA
> and we will use it when we need to write 64-bit data in the layout expected
> by untyped write messages.
> 
> Again, this needs to operate with WE_all set for the same reasons as the
> inverse operation.
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 42 ++++++++++++++++++++++++++++++
++++++
>  src/mesa/drivers/dri/i965/brw_fs.h   |  5 +++++
>  2 files changed, 47 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/
i965/brw_fs.cpp
> index 709e4b8..80803a6 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -285,6 +285,48 @@ 
fs_visitor::SHUFFLE_32BIT_LOAD_RESULT_TO_64BIT_DATA(const fs_builder &bld,
>  }
>  
>  /**
> + * This helper does the inverse operation of
> + * SHUFFLE_32BIT_LOAD_RESULT_TO_64BIT_DATA.
> + *
> + * We need to do this when we are going to use untyped write messsages that
> + * operate with 32-bit components in order to arrange our 64-bit data i to 
be
> + * in the expected layout.
> + */
> +void
> +fs_visitor::SHUFFLE_32BIT_DATA_FOR_64BIT_WRITE(const fs_builder &bld,
> +                                               const fs_reg dst,
> +                                               const fs_reg src,
> +                                               uint32_t components)
> +{
> +   int multiplier = bld.dispatch_width() / 8;
> +
> +   /* A temporary that we will use to shuffle the 64-bit data of each
> +    * component in the vector into 32-bit data that we can write.
> +    */
> +   fs_reg tmp =
> +      fs_reg(VGRF, alloc.allocate(2 * multiplier), BRW_REGISTER_TYPE_F);
> +
> +   /* We are going to operate the source in units of 32-bit */
> +   fs_reg src_data = retype(src, BRW_REGISTER_TYPE_F);
> +
> +   /* We are going to operate on the dst in units of 64-bit */
> +   fs_reg dst_data = retype(dst, BRW_REGISTER_TYPE_DF);
> +

   const fs_builder nomask_bld = bld.exec_all();

> +   /* Shuffle the data */
> +   for (unsigned i = 0; i < components; i++) {
> +      fs_reg component_i = horiz_offset(src_data, multiplier * 16 * i);
> +
> +      bld.MOV(tmp, stride(component_i, 2))->force_writemask_all = true;
> +      bld.MOV(horiz_offset(tmp, 8 * multiplier),
> +              stride(horiz_offset(component_i, 1), 2))
> +                 ->force_writemask_all = true;
> +
> +      bld.MOV(horiz_offset(dst_data, multiplier * 8 * i),
> +              retype(tmp, BRW_REGISTER_TYPE_DF))->force_writemask_all = 
true;

    nomask_bld.MOV(...);

> +   }
> +}
> +
> +/**
>   * A helper for MOV generation for fixing up broken hardware SEND 
dependency
>   * handling.
>   */
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/
brw_fs.h
> index 1e78f0c..9178347 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -111,6 +111,11 @@ public:
>                                                  const fs_reg src,
>                                                  uint32_t components);
>  
> +   void SHUFFLE_32BIT_DATA_FOR_64BIT_WRITE(const brw::fs_builder &bld,
> +                                           const fs_reg dst,
> +                                           const fs_reg src,
> +                                           uint32_t components);
> +
>     void do_untyped_vector_read(const brw::fs_builder &bld,
>                                 const fs_reg surf_index,
>                                 const fs_reg offset_reg,
> 

-------------- 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/20160510/382eb105/attachment.sig>


More information about the mesa-dev mailing list