glsl: introduce ir_binop_all_equal and ir_binop_any_equal, allow vector cmps
Currently GLSL IR forbids any vector comparisons, and defines "ir_binop_equal" and "ir_binop_nequal" to compare all elements and give a single bool. This is highly unintuitive and prevents generation of optimal Mesa IR. Hence, first rename "ir_binop_equal" to "ir_binop_all_equal" and "ir_binop_nequal" to "ir_binop_any_nequal". Second, readd "ir_binop_equal" and "ir_binop_nequal" with the same semantics as less, lequal, etc. Third, allow all comparisons to acts on vectors. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:

committed by
Ian Romanick

parent
2cdbced10d
commit
4dfb89904c
@@ -210,6 +210,8 @@ ir_expression::get_num_operands(ir_expression_operation op)
|
||||
2, /* ir_binop_gequal */
|
||||
2, /* ir_binop_equal */
|
||||
2, /* ir_binop_nequal */
|
||||
2, /* ir_binop_all_equal */
|
||||
2, /* ir_binop_any_nequal */
|
||||
|
||||
2, /* ir_binop_lshift */
|
||||
2, /* ir_binop_rshift */
|
||||
@@ -275,6 +277,8 @@ static const char *const operator_strs[] = {
|
||||
">=",
|
||||
"==",
|
||||
"!=",
|
||||
"all_equal",
|
||||
"any_nequal",
|
||||
"<<",
|
||||
">>",
|
||||
"&",
|
||||
@@ -293,6 +297,7 @@ static const char *const operator_strs[] = {
|
||||
const char *ir_expression::operator_string(ir_expression_operation op)
|
||||
{
|
||||
assert((unsigned int) op < Elements(operator_strs));
|
||||
assert(Elements(operator_strs) == (ir_binop_pow + 1));
|
||||
return operator_strs[op];
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user