From 88f380a2ddbdeda6e83725403b12ee0070f1f0f3 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Thu, 26 May 2016 23:53:31 -0700 Subject: [PATCH] i965/fs: Teach regions_overlap() about COMPR4 MRF regions. Cc: "12.0" Reviewed-by: Jason Ekstrand --- src/mesa/drivers/dri/i965/brw_ir_fs.h | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h index 7b1ec68..f214483 100644 --- a/src/mesa/drivers/dri/i965/brw_ir_fs.h +++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h @@ -204,9 +204,23 @@ reg_offset(const fs_reg &r) static inline bool regions_overlap(const fs_reg &r, unsigned dr, const fs_reg &s, unsigned ds) { - return reg_space(r) == reg_space(s) && - !(reg_offset(r) + dr <= reg_offset(s) || - reg_offset(s) + ds <= reg_offset(r)); + if (r.file == MRF && (r.nr & BRW_MRF_COMPR4)) { + fs_reg t = r; + t.nr &= ~BRW_MRF_COMPR4; + /* COMPR4 regions are translated by the hardware during decompression + * into two separate half-regions 4 MRFs apart from each other. + */ + return regions_overlap(t, dr / 2, s, ds) || + regions_overlap(byte_offset(t, 4 * REG_SIZE), dr / 2, s, ds); + + } else if (s.file == MRF && (s.nr & BRW_MRF_COMPR4)) { + return regions_overlap(s, ds, r, dr); + + } else { + return reg_space(r) == reg_space(s) && + !(reg_offset(r) + dr <= reg_offset(s) || + reg_offset(s) + ds <= reg_offset(r)); + } } /** -- 2.7.4