[Mesa-dev] [PATCH 03/22] glsl: Add a IS_CONSTANT macro

Thomas Helland thomashelland90 at gmail.com
Sat Jan 3 11:18:08 PST 2015


Change opt_algebraic to use the new macro.
Remove the old less than / greater than functions.
---
 src/glsl/ir_constant_util.h | 49 ++++++++++++++++++---------------------------
 src/glsl/opt_algebraic.cpp  |  8 ++++----
 2 files changed, 23 insertions(+), 34 deletions(-)

diff --git a/src/glsl/ir_constant_util.h b/src/glsl/ir_constant_util.h
index d4048f3..4a54898 100644
--- a/src/glsl/ir_constant_util.h
+++ b/src/glsl/ir_constant_util.h
@@ -33,6 +33,25 @@
 #include "main/macros.h"
 #include "program/prog_instruction.h"
 
+#define IS_CONSTANT(ir, operator, operand)                       \
+   (is_valid_vec_const(ir) ?                                     \
+       ((ir->type->vector_elements == 4) ?                       \
+          ir->get_float_component(0) operator operand &&         \
+          ir->get_float_component(1) operator operand &&         \
+          ir->get_float_component(2) operator operand &&         \
+          ir->get_float_component(3) operator operand :          \
+          ((ir->type->vector_elements == 3) ?                    \
+             ir->get_float_component(0) operator operand &&      \
+             ir->get_float_component(1) operator operand &&      \
+             ir->get_float_component(2) operator operand :       \
+             ((ir->type->vector_elements == 2) ?                 \
+                ir->get_float_component(0) operator operand &&   \
+                ir->get_float_component(1) operator operand :    \
+                ((ir->type->vector_elements == 1) ?              \
+                   ir->get_float_component(0) operator operand : \
+                   false))))                                     \
+       : false)
+
 /* When eliminating an expression and just returning one of its operands,
  * we may need to swizzle that operand out to a vector if the expression was
  * vector type.
@@ -88,34 +107,4 @@ is_valid_vec_const(ir_constant *ir)
    return true;
 }
 
-static inline bool
-is_less_than_one(ir_constant *ir)
-{
-   if (!is_valid_vec_const(ir))
-      return false;
-
-   unsigned component = 0;
-   for (int c = 0; c < ir->type->vector_elements; c++) {
-      if (ir->get_float_component(c) < 1.0f)
-         component++;
-   }
-
-   return (component == ir->type->vector_elements);
-}
-
-static inline bool
-is_greater_than_zero(ir_constant *ir)
-{
-   if (!is_valid_vec_const(ir))
-      return false;
-
-   unsigned component = 0;
-   for (int c = 0; c < ir->type->vector_elements; c++) {
-      if (ir->get_float_component(c) > 0.0f)
-         component++;
-   }
-
-   return (component == ir->type->vector_elements);
-}
-
 #endif /* IR_CONSTANT_UTIL_H_ */
diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index b1243c2..9ee6c9a 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -639,21 +639,21 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
             /* Found a {min|max} ({max|min} (x, 0.0), b) where b < 1.0
              * and its variations
              */
-            if (is_less_than_one(outer_const) && inner_val_b->is_zero())
+            if (IS_CONSTANT(outer_const, <, 1.0f) && inner_val_b->is_zero())
                return expr(ir_binop_min, saturate(inner_val_a), outer_const);
 
             if (!inner_val_b->as_constant())
                continue;
 
-            if (is_less_than_one(inner_val_b->as_constant()) && outer_const->is_zero())
+            if (IS_CONSTANT(inner_val_b->as_constant(), <, 1.0f) && outer_const->is_zero())
                return expr(ir_binop_min, saturate(inner_val_a), inner_val_b);
 
             /* Found a {min|max} ({max|min} (x, b), 1.0), where b > 0.0
              * and its variations
              */
-            if (outer_const->is_one() && is_greater_than_zero(inner_val_b->as_constant()))
+            if (outer_const->is_one() && IS_CONSTANT(inner_val_b->as_constant(), >, 0.0f))
                return expr(ir_binop_max, saturate(inner_val_a), inner_val_b);
-            if (inner_val_b->as_constant()->is_one() && is_greater_than_zero(outer_const))
+            if (inner_val_b->as_constant()->is_one() && IS_CONSTANT(outer_const, >, 0.0f))
                return expr(ir_binop_max, saturate(inner_val_a), outer_const);
          }
       }
-- 
2.2.1



More information about the mesa-dev mailing list