Module: Mesa
Branch: main
Commit: 8f0177b3345f8bcc3673b8a2a7c36ea36cbaa029
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8f0177b3345f8bcc3673b8a2a7c36ea36cbaa029

Author: Danylo Piliaiev <[email protected]>
Date:   Thu Dec  1 14:14:23 2022 +0100

ir3: Reduce the maximum allowed imm offset for shared var load/store

STL/LDL have 13 bits to store imm offset. However the most significant
bit in the offset is a sign bit, so the positive offset is limited by
12 bits.

nir_opt_offsets only has the upper limit and doesn't deal with
negative offsets, so shared_max should be changed to `(1 << 12) - 1`.

The issue was found in "Monster Hunter: World".

Fixes: 0b2da9d795610df15346a594384c39a096be338f
("ir3: Limit the maximum imm offset in nir_opt_offset for shared vars")

Signed-off-by: Danylo Piliaiev <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20100>

---

 src/freedreno/ir3/ir3_nir.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c
index ef4ad88c9a0..4c68b30e03c 100644
--- a/src/freedreno/ir3/ir3_nir.c
+++ b/src/freedreno/ir3/ir3_nir.c
@@ -134,7 +134,10 @@ ir3_optimize_loop(struct ir3_compiler *compiler, 
nir_shader *s)
           */
          .uniform_max = (1 << 9) - 1,
 
-         .shared_max = (1 << 13) - 1,
+         /* STL/LDL have 13b for offset with MSB being a sign bit, but this opt
+          * doesn't deal with negative offsets.
+          */
+         .shared_max = (1 << 12) - 1,
 
          .buffer_max = ~0,
       };

Reply via email to