From 4b0ec9f4759bab68b51e2f410e9305e39c1e1e7f Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Fri, 27 May 2016 16:41:35 -0700 Subject: [PATCH] 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 --- src/mesa/drivers/dri/i965/brw_fs.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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. */ -- 2.30.2