summaryrefslogtreecommitdiff
path: root/src/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/README1
-rw-r--r--src/glsl/builtins/ir/any6
-rw-r--r--src/glsl/ir.cpp2
-rw-r--r--src/glsl/ir.h1
-rw-r--r--src/glsl/ir_constant_expression.cpp9
-rw-r--r--src/glsl/ir_validate.cpp5
6 files changed, 21 insertions, 3 deletions
diff --git a/src/glsl/README b/src/glsl/README
index 74520321b2..2e501d6206 100644
--- a/src/glsl/README
+++ b/src/glsl/README
@@ -180,6 +180,7 @@ ir.h (new enum)
ir.cpp:get_num_operands() (used for ir_reader)
ir.cpp:operator_strs (used for ir_reader)
ir_constant_expression.cpp (you probably want to be able to constant fold)
+ir_validate.cpp (check users have the right types)
You may also need to update the backends if they will see the new expr type:
diff --git a/src/glsl/builtins/ir/any b/src/glsl/builtins/ir/any
index f10e8a7b47..cc6038a315 100644
--- a/src/glsl/builtins/ir/any
+++ b/src/glsl/builtins/ir/any
@@ -2,15 +2,15 @@
(signature bool
(parameters
(declare (in) bvec2 arg0))
- ((return (expression bool || (swiz x (var_ref arg0))(swiz y (var_ref arg0))))))
+ ((return (expression bool any (var_ref arg0)))))
(signature bool
(parameters
(declare (in) bvec3 arg0))
- ((return (expression bool || (expression bool || (swiz x (var_ref arg0))(swiz y (var_ref arg0))) (swiz z (var_ref arg0))))))
+ ((return (expression bool any (var_ref arg0)))))
(signature bool
(parameters
(declare (in) bvec4 arg0))
- ((return (expression bool || (expression bool || (expression bool || (swiz x (var_ref arg0))(swiz y (var_ref arg0))) (swiz z (var_ref arg0))) (swiz w (var_ref arg0))))))
+ ((return (expression bool any (var_ref arg0)))))
))
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index ebb592792b..4622a1f939 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -184,6 +184,7 @@ ir_expression::get_num_operands(ir_expression_operation op)
1, /* ir_unop_i2b */
1, /* ir_unop_b2i */
1, /* ir_unop_u2f */
+ 1, /* ir_unop_any */
1, /* ir_unop_trunc */
1, /* ir_unop_ceil */
@@ -252,6 +253,7 @@ static const char *const operator_strs[] = {
"i2b",
"b2i",
"u2f",
+ "any",
"trunc",
"ceil",
"floor",
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index b04222893c..500b152408 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -604,6 +604,7 @@ enum ir_expression_operation {
ir_unop_i2b, /**< int-to-boolean conversion */
ir_unop_b2i, /**< Boolean-to-int conversion */
ir_unop_u2f, /**< Unsigned-to-float conversion. */
+ ir_unop_any,
/**
* \name Unary floating-point rounding operations.
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
index 54f14d1a54..942f198360 100644
--- a/src/glsl/ir_constant_expression.cpp
+++ b/src/glsl/ir_constant_expression.cpp
@@ -149,6 +149,15 @@ ir_expression::constant_expression_value()
}
break;
+ case ir_unop_any:
+ assert(op[0]->type->is_boolean());
+ data.b[0] = false;
+ for (unsigned c = 0; c < op[0]->type->components(); c++) {
+ if (op[0]->value.b[c])
+ data.b[0] = true;
+ }
+ break;
+
case ir_unop_trunc:
assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
for (unsigned c = 0; c < op[0]->type->components(); c++) {
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index 6e08fa4025..9ea11dd400 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -223,6 +223,11 @@ ir_validate::visit_leave(ir_expression *ir)
assert(ir->type->base_type == GLSL_TYPE_FLOAT);
break;
+ case ir_unop_any:
+ assert(ir->operands[0]->type->base_type == GLSL_TYPE_BOOL);
+ assert(ir->type == glsl_type::bool_type);
+ break;
+
case ir_unop_trunc:
case ir_unop_ceil:
case ir_unop_floor: