[Mesa-dev] [PATCH 11/57] i965/vec4: Replace vec4_instruction::regs_read with ::size_read using byte units.
Iago Toral
itoral at igalia.com
Thu Sep 8 09:27:00 UTC 2016
On Wed, 2016-09-07 at 18:48 -0700, Francisco Jerez wrote:
> The previous regs_read value can be recovered by rewriting each
> reference of regs_read() like 'x = i.regs_read(j)' to 'x =
> DIV_ROUND_UP(i.size_read(j), reg_unit)'.
>
> For the same reason as in the previous patches, this doesn't attempt
> to be particularly clever about simplifying the result in the
> interest
> of keeping the rather lengthy patch as obvious as possible. I'll
> come
> back later to clean up any ugliness introduced here.
> ---
> src/mesa/drivers/dri/i965/brw_ir_vec4.h | 6 +++--
> src/mesa/drivers/dri/i965/brw_vec4.cpp | 30
> ++++++++++++++--------
> .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 2 +-
> 3 files changed, 25 insertions(+), 13 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> index 5a79062..2fd5441 100644
> --- a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> @@ -167,7 +167,7 @@ public:
> unsigned sol_vertex; /**< gen6: used for setting dst index in SVB
> header */
>
> bool is_send_from_grf();
> - unsigned regs_read(unsigned arg) const;
> + unsigned size_read(unsigned arg) const;
> bool can_reswizzle(const struct gen_device_info *devinfo, int
> dst_writemask,
> int swizzle, int swizzle_mask);
> void reswizzle(int dst_writemask, int swizzle);
> @@ -278,7 +278,9 @@ inline unsigned
> regs_read(const vec4_instruction *inst, unsigned i)
> {
> /* XXX - Take into account register-misaligned offsets correctly.
> */
> - return inst->regs_read(i);
> + const unsigned reg_size =
> + inst->src[i].file == UNIFORM || inst->src[i].file == IMM ? 16
> : REG_SIZE;
> + return DIV_ROUND_UP(inst->size_read(i), reg_size);
> }
>
> } /* namespace brw */
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index bdd6e59..561170c 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -199,11 +199,8 @@
> vec4_instruction::has_source_and_destination_hazard() const
> }
>
> unsigned
> -vec4_instruction::regs_read(unsigned arg) const
> +vec4_instruction::size_read(unsigned arg) const
> {
> - if (src[arg].file == BAD_FILE)
> - return 0;
> -
> switch (opcode) {
> case SHADER_OPCODE_SHADER_TIME_ADD:
> case SHADER_OPCODE_UNTYPED_ATOMIC:
> @@ -213,13 +210,26 @@ vec4_instruction::regs_read(unsigned arg) const
> case SHADER_OPCODE_TYPED_SURFACE_READ:
> case SHADER_OPCODE_TYPED_SURFACE_WRITE:
> case TCS_OPCODE_URB_WRITE:
> - return arg == 0 ? mlen : 1;
> -
> + if (arg == 0)
> + return mlen * REG_SIZE;
> + break;
> case VS_OPCODE_PULL_CONSTANT_LOAD_GEN7:
> - return arg == 1 ? mlen : 1;
> + if (arg == 1)
> + return mlen * REG_SIZE;
> + break;
> + default:
> + break;
> + }
>
> + switch (src[arg].file) {
> + case BAD_FILE:
> + return 0;
> + case IMM:
> + case UNIFORM:
> + return 4 * type_sz(src[arg].type);
> default:
> - return 1;
> + /* XXX - Represent actual execution size and vertical stride.
> */
> + return 8 * type_sz(src[arg].type);
> }
> }
>
> @@ -1188,7 +1198,7 @@ vec4_visitor::opt_register_coalesce()
> bool interfered = false;
> for (int i = 0; i < 3; i++) {
> if (inst->src[0].in_range(scan_inst->src[i],
> - scan_inst->regs_read(i)))
> + DIV_ROUND_UP(scan_inst-
> >size_read(i), REG_SIZE)))
Why not just swap scan_inst->regs_read(i) with regs_read(scan_inst, i)
instead?
> interfered = true;
> }
> if (interfered)
> @@ -1214,7 +1224,7 @@ vec4_visitor::opt_register_coalesce()
> } else {
> for (int i = 0; i < 3; i++) {
> if (inst->dst.in_range(scan_inst->src[i],
> - scan_inst->regs_read(i)))
> + DIV_ROUND_UP(scan_inst-
> >size_read(i), REG_SIZE)))
Same here.
> interfered = true;
> }
> if (interfered)
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> index f98c7ac..777d252 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
> @@ -437,7 +437,7 @@ vec4_visitor::opt_copy_propagation(bool
> do_constant_prop)
> continue;
>
> /* We only handle single-register copies. */
> - if (inst->regs_read(i) != 1)
> + if (inst->size_read(i) != REG_SIZE)
> continue;
>
> const unsigned reg = (alloc.offsets[inst->src[i].nr] +
More information about the mesa-dev
mailing list