From: Francisco Jerez Date: Fri, 27 May 2016 23:41:35 +0000 (-0700) Subject: i965/fs: Fix compute-to-mrf VGRF region coverage condition. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4b0ec9f4759bab68b51e2f410e9305e39c1e1e7f;p=mesa.git i965/fs: Fix compute-to-mrf VGRF region coverage condition. Compute-to-mrf was checking whether the destination of scan_inst is more than one component (making assumptions about the instruction data type) in order to find out whether the result is being fully copied into the MRF destination, which is rather inaccurate in cases where a single-component instruction is only partially contained in the source region, or when the execution size of the copy and scan_inst instructions differ. Instead check whether the destination region of the instruction is really contained within the bounds of the source region of the copy. Cc: "12.0" Reviewed-by: Jason Ekstrand --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 172182a3b62..b521f905e1c 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2816,10 +2816,13 @@ fs_visitor::compute_to_mrf() if (scan_inst->is_partial_write()) break; - /* Things returning more than one register would need us to - * understand coalescing out more than one MOV at a time. + /* Handling things not fully contained in the source of the copy + * would need us to understand coalescing out more than one MOV at + * a time. */ - if (scan_inst->regs_written > scan_inst->exec_size / 8) + if (scan_inst->dst.reg_offset < inst->src[0].reg_offset || + scan_inst->dst.reg_offset + scan_inst->regs_written > + inst->src[0].reg_offset + inst->regs_read(0)) break; /* SEND instructions can't have MRF as a destination. */