[Mesa-dev] [PATCH 29/57] i965/fs: Fix bogus sub-MRF offset calculation in compute-to-mrf.

Iago Toral itoral at igalia.com
Fri Sep 9 09:20:52 UTC 2016


On Wed, 2016-09-07 at 18:48 -0700, Francisco Jerez wrote:
> The 'scan_inst->dst.offset % REG_SIZE' term in the final
> 'scan_inst->dst.offset' calculation is obviously bogus.  The offset
> from the start of the copy destination register 'inst->dst' where the
> destination of the generating instruction 'scan_inst' would be
> written
> to (before compute-to-mrf runs) is just the offset of 'scan_inst-
> >dst'
> relative to the source of the copy instruction (AKA rel_offset in the
> code below).
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 5b7ca98..703340b 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -2797,15 +2797,15 @@ fs_visitor::compute_to_mrf()
>                 inst->src[0], scan_inst->dst, DIV_ROUND_UP(scan_inst-
> >size_written,
>                                                            REG_SIZE))
> ;
>  
> -            const unsigned rel_offset = (reg_offset(scan_inst->dst)
> -
> -                                         reg_offset(inst->src[0])) /
> REG_SIZE;
> +            const unsigned rel_offset = reg_offset(scan_inst->dst) -
> +                                        reg_offset(inst->src[0]);
>  
>              if (inst->dst.nr & BRW_MRF_COMPR4) {
>                 /* Apply the same address transformation done by the
> hardware
>                  * for COMPR4 MRF writes.
>                  */
> -               assert(rel_offset < 2);
> -               scan_inst->dst.nr = inst->dst.nr + rel_offset * 4;
> +               assert(rel_offset < 2 * REG_SIZE);
> +               scan_inst->dst.nr = inst->dst.nr + rel_offset /
> REG_SIZE * 4;
>  
>                 /* Clear the COMPR4 bit if the generating instruction
> is not
>                  * compressed.
> @@ -2817,11 +2817,11 @@ fs_visitor::compute_to_mrf()
>                 /* Calculate the MRF number the result of this
> instruction is
>                  * ultimately written to.
>                  */
> -               scan_inst->dst.nr = inst->dst.nr + rel_offset;
> +               scan_inst->dst.nr = inst->dst.nr + rel_offset /
> REG_SIZE;
>              }
>  
>              scan_inst->dst.file = MRF;
> -            scan_inst->dst.offset = inst->dst.offset + scan_inst-
> >dst.offset % REG_SIZE;
> +            scan_inst->dst.offset = inst->dst.offset + rel_offset %
> REG_SIZE;
>              scan_inst->saturate |= inst->saturate;
>              if (!regs_left)
>                 break;

Ok, this makes a lot more sense :), maybe squash this and the previous
one together? I found the previous one quite confusing because it seems
to be doing something wrong that is then fixed here.


More information about the mesa-dev mailing list