[Mesa-dev] [PATCH 18/21] i965/fs: Allow specifying arbitrary execution sizes up to 32 to FIND_LIVE_CHANNEL.

Jason Ekstrand jason at jlekstrand.net
Tue May 24 22:52:37 UTC 2016


On Tue, May 24, 2016 at 12:18 AM, Francisco Jerez <currojerez at riseup.net>
wrote:

> Due to a Gen7-specific hardware bug native 32-wide instructions get
> the lower 16 bits of the execution mask applied incorrectly to both
> halves of the instruction, so the MOV trick we currently use wouldn't
> work.  Instead emit multiple 16-wide MOV instructions in 32-wide mode
> in order to cover the whole execution mask.
> ---
>  src/mesa/drivers/dri/i965/brw_eu_emit.c | 25 +++++++++++++++++--------
>  1 file changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> index af7caed..d36877c 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> @@ -3330,6 +3330,7 @@ void
>  brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst)
>  {
>     const struct brw_device_info *devinfo = p->devinfo;
> +   const unsigned exec_size = 1 << brw_inst_exec_size(devinfo,
> p->current);
>     brw_inst *inst;
>
>     assert(devinfo->gen >= 7);
> @@ -3359,15 +3360,23 @@ brw_find_live_channel(struct brw_codegen *p,
> struct brw_reg dst)
>
>           brw_MOV(p, flag, brw_imm_ud(0));
>
> -         /* Run a 16-wide instruction returning zero with execution
> masking
> -          * and a conditional modifier enabled in order to get the current
> -          * execution mask in f1.0.
> +         /* Run enough instructions returning zero with execution masking
> and
> +          * a conditional modifier enabled in order to get the full
> execution
> +          * mask in f1.0.  We could use a single 32-wide move here if it
> +          * weren't because of the hardware bug that causes channel
> enables to
> +          * be applied incorrectly to the second half of 32-wide
> instructions
> +          * on Gen7.
>            */
> -         inst = brw_MOV(p, brw_null_reg(), brw_imm_ud(0));
> -         brw_inst_set_exec_size(devinfo, inst, BRW_EXECUTE_16);
> -         brw_inst_set_mask_control(devinfo, inst, BRW_MASK_ENABLE);
> -         brw_inst_set_cond_modifier(devinfo, inst, BRW_CONDITIONAL_Z);
> -         brw_inst_set_flag_reg_nr(devinfo, inst, 1);
> +         const unsigned lower_size = MIN2(16, exec_size);
> +         for (unsigned i = 0; i < exec_size / lower_size; i++) {
> +            inst = brw_MOV(p, retype(brw_null_reg(),
> BRW_REGISTER_TYPE_UW),
> +                           brw_imm_uw(0));
>

Is there a reason this is changing from D to UW?


> +            brw_inst_set_mask_control(devinfo, inst, BRW_MASK_ENABLE);
> +            brw_inst_set_group(devinfo, inst, lower_size * i);
> +            brw_inst_set_cond_modifier(devinfo, inst, BRW_CONDITIONAL_Z);
> +            brw_inst_set_flag_reg_nr(devinfo, inst, 1);
> +            brw_inst_set_exec_size(devinfo, inst, cvt(lower_size) - 1);
> +         }
>
>           brw_FBL(p, vec1(dst), flag);
>        }
> --
> 2.7.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160524/4ad8ac7c/attachment.html>


More information about the mesa-dev mailing list