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