Implement ir_binop_vector_extract using NIR operations. Based on SPIR-V
to NIR approach.

This fixes:
dEQP-GLES3.functional.shaders.indexing.moredynamic.with_value_from_indexing_expression_fragment
Piglit's glsl-fs-vec4-indexing-8.shader_test

Signed-off-by: Juan A. Suarez Romero <jasua...@igalia.com>
---

Pending to verify that this also fixes 
https://bugs.freedesktop.org/show_bug.cgi?id=105438

 src/compiler/glsl/glsl_to_nir.cpp | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/compiler/glsl/glsl_to_nir.cpp 
b/src/compiler/glsl/glsl_to_nir.cpp
index 8e5e9c34912..5fc420d856f 100644
--- a/src/compiler/glsl/glsl_to_nir.cpp
+++ b/src/compiler/glsl/glsl_to_nir.cpp
@@ -1928,6 +1928,17 @@ nir_visitor::visit(ir_expression *ir)
             unreachable("not reached");
       }
       break;
+   case ir_binop_vector_extract: {
+      unsigned swiz[4] = { 0 };
+      result = nir_swizzle(&b, srcs[0], swiz, 1, true);
+      for (unsigned i = 1; i < ir->operands[0]->type->vector_elements; i++) {
+         swiz[0] = i;
+         nir_ssa_def *swizzled = nir_swizzle(&b, srcs[0], swiz, 1, true);
+         result = nir_bcsel(&b, nir_ieq(&b, srcs[1], nir_imm_int(&b, i)),
+                            swizzled, result);
+      }
+      break;
+   }
 
    case ir_binop_ldexp: result = nir_ldexp(&b, srcs[0], srcs[1]); break;
    case ir_triop_fma:
-- 
2.17.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to