[Mesa-dev] [PATCH 04/13] i965: Mask out unused Align16 components in brw_untyped_atomic.
Pohjolainen, Topi
topi.pohjolainen at intel.com
Thu Mar 12 10:13:40 PDT 2015
On Fri, Feb 27, 2015 at 05:34:47PM +0200, Francisco Jerez wrote:
> This is currently not a problem because the vec4 visitor happens to
> mask out unused components from the destination, but it might become
> an issue when we start using atomics without writeback message. In
> any case it seems sensible to set it again here because the
> consequences of setting the wrong writemask (random graphics memory
> corruption) are difficult to debug and can easily go unnoticed.
> ---
> src/mesa/drivers/dri/i965/brw_eu_emit.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> index 2b1d6ff..0b655d4 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> @@ -2799,16 +2799,25 @@ brw_untyped_atomic(struct brw_compile *p,
> bool response_expected)
> {
> const struct brw_context *brw = p->brw;
> + const bool align1 = (brw_inst_access_mode(brw, p->current) == BRW_ALIGN_1);
Most of the code in the backend does not use the extra ().
> + /* Mask out unused components -- This is especially important in Align16
> + * mode on generations that don't have native support for SIMD4x2 atomics,
> + * because unused but enabled components will cause the dataport to perform
> + * additional atomic operations on the addresses that happen to be in the
> + * uninitialized Y, Z and W coordinates of the payload.
> + */
> + const unsigned mask = (align1 ? WRITEMASK_XYZW : WRITEMASK_X);
Same here.
> brw_inst *insn = brw_next_insn(p, BRW_OPCODE_SEND);
>
> - brw_set_dest(p, insn, retype(dest, BRW_REGISTER_TYPE_UD));
> + brw_set_dest(p, insn, retype(brw_writemask(dest, mask),
> + BRW_REGISTER_TYPE_UD));
> brw_set_src0(p, insn, retype(payload, BRW_REGISTER_TYPE_UD));
> brw_set_src1(p, insn, brw_imm_d(0));
> brw_set_dp_untyped_atomic_message(
> p, insn, atomic_op, bind_table_index, msg_length,
> brw_surface_payload_size(p, response_expected,
> brw->gen >= 8 || brw->is_haswell, true),
> - brw_inst_access_mode(brw, insn) == BRW_ALIGN_1);
> + align1);
> }
>
> static void
> --
> 2.1.3
>
> _______________________________________________
> 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