intel/fs: Fix horiz_offset() to handle FIXED_GRFs with non-trivial 2D regions.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 8 Aug 2022 21:04:06 +0000 (14:04 -0700)
committerMarge Bot <emma+marge@anholt.net>
Tue, 23 Aug 2022 19:52:38 +0000 (19:52 +0000)
Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18157>

src/intel/compiler/brw_ir_fs.h

index 063f183..1089edb 100644 (file)
@@ -121,8 +121,16 @@ horiz_offset(const fs_reg &reg, unsigned delta)
       if (reg.is_null()) {
          return reg;
       } else {
-         const unsigned stride = reg.hstride ? 1 << (reg.hstride - 1) : 0;
-         return byte_offset(reg, delta * stride * type_sz(reg.type));
+         const unsigned hstride = reg.hstride ? 1 << (reg.hstride - 1) : 0;
+         const unsigned vstride = reg.vstride ? 1 << (reg.vstride - 1) : 0;
+         const unsigned width = 1 << reg.width;
+
+         if (delta % width == 0) {
+            return byte_offset(reg, delta / width * vstride * type_sz(reg.type));
+         } else {
+            assert(vstride == hstride * width);
+            return byte_offset(reg, delta * hstride * type_sz(reg.type));
+         }
       }
    }
    unreachable("Invalid register file");