From 17decd940c1e105506db74e8539a77db271adbc5 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 6 Apr 2016 10:27:14 +0200 Subject: [PATCH] i965/fs: fix subreg_offset overflow in byte_offset() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This can happen if the register already has a non-zero subreg_offset when byte_offset() is called. v2 (Sam): - Refactor byte_offset() (Jordan). Signed-off-by: Samuel Iglesias Gonsálvez Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_ir_fs.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h index 86acdb236a4..305d91cd4c2 100644 --- a/src/mesa/drivers/dri/i965/brw_ir_fs.h +++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h @@ -80,19 +80,21 @@ retype(fs_reg reg, enum brw_reg_type type) static inline fs_reg byte_offset(fs_reg reg, unsigned delta) { + reg.subreg_offset += delta; + switch (reg.file) { case BAD_FILE: break; case VGRF: case ATTR: - reg.reg_offset += delta / 32; + reg.reg_offset += reg.subreg_offset / 32; break; case MRF: reg.nr += delta / 32; break; case UNIFORM: - reg.reg_offset += delta / 4; - reg.subreg_offset += delta % 4; + reg.reg_offset += reg.subreg_offset / 4; + reg.subreg_offset %= 4; return reg; case ARF: case FIXED_GRF: @@ -100,7 +102,7 @@ byte_offset(fs_reg reg, unsigned delta) default: assert(delta == 0); } - reg.subreg_offset += delta % 32; + reg.subreg_offset %= 32; return reg; }