lima: fix vector const src referenced multiple times
authorErico Nunes <nunes.erico@gmail.com>
Sun, 3 Apr 2022 16:28:19 +0000 (18:28 +0200)
committerErico Nunes <nunes.erico@gmail.com>
Tue, 12 Apr 2022 20:07:32 +0000 (20:07 +0000)
It can happen that a single vector constant is referenced multiple times
by the same node, with different swizzles.
This needs to be taken into account by checking and updating the
swizzles for all the srcs of a target node when inserting the const
node to the same instruction.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15726>

src/gallium/drivers/lima/ci/lima-fails.txt
src/gallium/drivers/lima/ir/pp/instr.c

index 2dc2dc3..8d9fe64 100644 (file)
@@ -391,7 +391,6 @@ spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-index-col-row-wr,F
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-index-col-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-index-row-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-index-wr,Fail
-spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-row-rd,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-row-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat2-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat3-col-row-wr,Fail
@@ -412,7 +411,6 @@ spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat4-row-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-array-mat4-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-mat2-col-row-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-mat2-col-wr,Fail
-spec@glsl-1.10@execution@variable-indexing@fs-temp-mat2-row-rd,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-mat2-row-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-mat2-wr,Fail
 spec@glsl-1.10@execution@variable-indexing@fs-temp-mat3-col-row-wr,Fail
@@ -482,7 +480,6 @@ spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-index-col-row-wr,F
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-index-col-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-index-row-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-index-wr,Fail
-spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-row-rd,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-row-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat2-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat3-col-row-wr,Fail
@@ -503,7 +500,6 @@ spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat4-row-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-array-mat4-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-mat2-col-row-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-mat2-col-wr,Fail
-spec@glsl-1.20@execution@variable-indexing@fs-temp-mat2-row-rd,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-mat2-row-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-mat2-wr,Fail
 spec@glsl-1.20@execution@variable-indexing@fs-temp-mat3-col-row-wr,Fail
index 19d53cd..707055c 100644 (file)
@@ -186,19 +186,17 @@ bool ppir_instr_insert_node(ppir_instr *instr, ppir_node *node)
          uint8_t swizzle[4] = {0};
 
          if (ppir_instr_insert_const(&ic, nc, swizzle)) {
+            instr->constant[i] = ic;
             ppir_node *succ = ppir_node_first_succ(node);
-            ppir_src *src = NULL;
             for (int s = 0; s < ppir_node_get_src_num(succ); s++) {
-               src = ppir_node_get_src(succ, s);
-               if (src->node == node)
-                  break;
-            }
-            assert(src);
-            assert(src->node == node);
+               ppir_src *src = ppir_node_get_src(succ, s);
+               assert(src);
+               if (src->node != node)
+                  continue;
 
-            instr->constant[i] = ic;
-            ppir_update_src_pipeline(ppir_pipeline_reg_const0 + i, src,
-                                     &c->dest, swizzle);
+               ppir_update_src_pipeline(ppir_pipeline_reg_const0 + i, src,
+                                        &c->dest, swizzle);
+            }
             break;
          }
       }