diff --git a/src/freedreno/registers/gen_header.py b/src/freedreno/registers/gen_header.py index 06c35578e2b..0fd58121264 100644 --- a/src/freedreno/registers/gen_header.py +++ b/src/freedreno/registers/gen_header.py @@ -193,7 +193,8 @@ class Bitset(object): if f.type == "waddress": print(" .bo_write = true,") print(" .bo_offset = fields.bo_offset,") - print(" .bo_shift = %d" % address.shr) + print(" .bo_shift = %d," % address.shr) + print(" .bo_low = %d," % address.low) print(" };\n}\n") diff --git a/src/freedreno/vulkan/tu_cs.h b/src/freedreno/vulkan/tu_cs.h index 4ba64da40f3..fb78f167223 100644 --- a/src/freedreno/vulkan/tu_cs.h +++ b/src/freedreno/vulkan/tu_cs.h @@ -457,6 +457,7 @@ struct tu_reg_value { bool bo_write; uint32_t bo_offset; uint32_t bo_shift; + uint32_t bo_low; }; #define fd_reg_pair tu_reg_value @@ -479,6 +480,7 @@ struct tu_reg_value { if (regs[i].bo) { \ uint64_t v = regs[i].bo->iova + regs[i].bo_offset; \ v >>= regs[i].bo_shift; \ + v <<= regs[i].bo_low; \ v |= regs[i].value; \ \ *p++ = v; \ diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_pack.h b/src/gallium/drivers/freedreno/a6xx/fd6_pack.h index f6d1fbf092a..752a3e2920d 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_pack.h +++ b/src/gallium/drivers/freedreno/a6xx/fd6_pack.h @@ -34,6 +34,7 @@ struct fd_reg_pair { bool bo_write; uint32_t bo_offset; uint32_t bo_shift; + uint32_t bo_low; }; #define __bo_type struct fd_bo * @@ -62,8 +63,9 @@ struct fd_reg_pair { __assert_eq(regs[0].reg + i, regs[i].reg); \ if (regs[i].bo) { \ uint64_t *p64 = (uint64_t *)p; \ - *p64 = __reloc_iova(regs[i].bo, regs[i].bo_offset, regs[i].value, \ - regs[i].bo_shift); \ + *p64 = (__reloc_iova(regs[i].bo, regs[i].bo_offset, 0, \ + -regs[i].bo_shift) << regs[i].bo_low) | \ + regs[i].value; \ p += 2; \ fd_ringbuffer_attach_bo(ring, regs[i].bo); \ } else { \