This allows you to match on an unknown value but only if it is of a given type. 90% of the uses of this are for matching only booleans, but adding the generality of arbitrary types is no more complex.
nir_algebraic.py doesn't handle this yet but that's ok because the C language will ensure that the default type on all variables is void. --- src/glsl/nir/nir_search.c | 11 +++++++++++ src/glsl/nir/nir_search.h | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/glsl/nir/nir_search.c b/src/glsl/nir/nir_search.c index ec89817..35eb7e2 100644 --- a/src/glsl/nir/nir_search.c +++ b/src/glsl/nir/nir_search.c @@ -82,6 +82,17 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src, instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const) return false; + if (var->type != nir_type_void) { + if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_alu) + return false; + + nir_alu_instr *src_alu = + nir_instr_as_alu(instr->src[src].src.ssa->parent_instr); + + if (nir_op_infos[src_alu->op].output_type != var->type) + return false; + } + state->variables_seen |= (1 << var->variable); state->variables[var->variable].src = instr->src[src].src; state->variables[var->variable].abs = false; diff --git a/src/glsl/nir/nir_search.h b/src/glsl/nir/nir_search.h index 18aa28d..7d47792 100644 --- a/src/glsl/nir/nir_search.h +++ b/src/glsl/nir/nir_search.h @@ -54,6 +54,18 @@ typedef struct { * given variable is only allowed to match constant values. */ bool is_constant; + + /** Indicates that the given variable must have a certain type + * + * This is only allowed in search expressions and indicates that the + * given variable is only allowed to match values that come from an ALU + * instruction with the given output type. A type of nir_type_void + * means it can match any type. + * + * Note: A variable that is both constant and has a non-void type will + * never match anything. + */ + nir_alu_type type; } nir_search_variable; typedef struct { -- 2.2.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev