[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