[Mesa-dev] [PATCH 1/6] glsl: Move common code to constant_util

Thomas Helland thomashelland90 at gmail.com
Wed Oct 29 18:11:16 PDT 2014


This will be used later on in opt_minmax

Signed-off-by: Thomas Helland <thomashelland90 at gmail.com>
---
 src/glsl/ir_constant_util.h | 103 ++++++++++++++++++++++++++++++++++++++++++++
 src/glsl/opt_algebraic.cpp  |  95 ++--------------------------------------
 src/glsl/opt_minmax.cpp     |  19 ++------
 3 files changed, 109 insertions(+), 108 deletions(-)
 create mode 100644 src/glsl/ir_constant_util.h

diff --git a/src/glsl/ir_constant_util.h b/src/glsl/ir_constant_util.h
new file mode 100644
index 0000000..b3b9a19
--- /dev/null
+++ b/src/glsl/ir_constant_util.h
@@ -0,0 +1,103 @@
+/*
+ * ir_constant_util.h
+ *
+ *  Created on: 13. okt. 2014
+ *      Author: helland
+ */
+
+#ifndef IR_CONSTANT_UTIL_H_
+#define IR_CONSTANT_UTIL_H_
+
+#include "main/macros.h"
+#include "ir_builder.h"
+#include "program/prog_instruction.h"
+
+using namespace ir_builder;
+
+/* 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.
+ */
+static ir_rvalue *
+swizzle_if_required(ir_expression *expr,
+                 ir_rvalue *operand)
+{
+   if (expr->type->is_vector() && operand->type->is_scalar()) {
+      return swizzle(operand, SWIZZLE_XXXX, expr->type->vector_elements);
+   } else
+      return operand;
+}
+
+static inline bool
+is_vec_zero(ir_constant *ir)
+{
+   return (ir == NULL) ? false : ir->is_zero();
+}
+
+static inline bool
+is_vec_one(ir_constant *ir)
+{
+   return (ir == NULL) ? false : ir->is_one();
+}
+
+static inline bool
+is_vec_two(ir_constant *ir)
+{
+   return (ir == NULL) ? false : ir->is_value(2.0, 2);
+}
+
+static inline bool
+is_vec_negative_one(ir_constant *ir)
+{
+   return (ir == NULL) ? false : ir->is_negative_one();
+}
+
+static inline bool
+is_vec_basis(ir_constant *ir)
+{
+   return (ir == NULL) ? false : ir->is_basis();
+}
+
+static inline bool
+is_valid_vec_const(ir_constant *ir)
+{
+   if (ir == NULL)
+      return false;
+
+   if (!ir->type->is_scalar() && !ir->type->is_vector())
+      return false;
+
+   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 0cdb8ec..8392017 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -29,13 +29,13 @@
  */
 
 #include "ir.h"
-#include "ir_visitor.h"
+//#include "ir_visitor.h"
 #include "ir_rvalue_visitor.h"
 #include "ir_optimization.h"
-#include "ir_builder.h"
 #include "glsl_types.h"
+#include "ir_constant_util.h"
+
 
-using namespace ir_builder;
 
 namespace {
 
@@ -68,8 +68,6 @@ public:
 			     int op1,
 			     ir_expression *ir2,
 			     int op2);
-   ir_rvalue *swizzle_if_required(ir_expression *expr,
-				  ir_rvalue *operand);
 
    const struct gl_shader_compiler_options *options;
    void *mem_ctx;
@@ -80,78 +78,6 @@ public:
 
 } /* unnamed namespace */
 
-static inline bool
-is_vec_zero(ir_constant *ir)
-{
-   return (ir == NULL) ? false : ir->is_zero();
-}
-
-static inline bool
-is_vec_one(ir_constant *ir)
-{
-   return (ir == NULL) ? false : ir->is_one();
-}
-
-static inline bool
-is_vec_two(ir_constant *ir)
-{
-   return (ir == NULL) ? false : ir->is_value(2.0, 2);
-}
-
-static inline bool
-is_vec_negative_one(ir_constant *ir)
-{
-   return (ir == NULL) ? false : ir->is_negative_one();
-}
-
-static inline bool
-is_vec_basis(ir_constant *ir)
-{
-   return (ir == NULL) ? false : ir->is_basis();
-}
-
-static inline bool
-is_valid_vec_const(ir_constant *ir)
-{
-   if (ir == NULL)
-      return false;
-
-   if (!ir->type->is_scalar() && !ir->type->is_vector())
-      return false;
-
-   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);
-}
-
 static void
 update_type(ir_expression *ir)
 {
@@ -270,21 +196,6 @@ ir_algebraic_visitor::reassociate_constant(ir_expression *ir1, int const_index,
    return 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.
- */
-ir_rvalue *
-ir_algebraic_visitor::swizzle_if_required(ir_expression *expr,
-					  ir_rvalue *operand)
-{
-   if (expr->type->is_vector() && operand->type->is_scalar()) {
-      return new(mem_ctx) ir_swizzle(operand, 0, 0, 0, 0,
-				     expr->type->vector_elements);
-   } else
-      return operand;
-}
-
 ir_rvalue *
 ir_algebraic_visitor::handle_expression(ir_expression *ir)
 {
diff --git a/src/glsl/opt_minmax.cpp b/src/glsl/opt_minmax.cpp
index 32fb2d7..e4141bc 100644
--- a/src/glsl/opt_minmax.cpp
+++ b/src/glsl/opt_minmax.cpp
@@ -31,15 +31,10 @@
  */
 
 #include "ir.h"
-#include "ir_visitor.h"
 #include "ir_rvalue_visitor.h"
 #include "ir_optimization.h"
-#include "ir_builder.h"
-#include "program/prog_instruction.h"
 #include "glsl_types.h"
-#include "main/macros.h"
-
-using namespace ir_builder;
+#include "ir_constant_util.h"
 
 namespace {
 
@@ -215,6 +210,7 @@ larger_constant(ir_constant *a, ir_constant *b)
       return a;
 }
 
+
 /* Combines two ranges by doing an element-wise min() / max() depending on the
  * operation.
  */
@@ -288,6 +284,7 @@ get_range(ir_rvalue *rval)
    return minmax_range();
 }
 
+
 /**
  * Prunes a min/max expression considering the base range of the parent
  * min/max expression.
@@ -429,16 +426,6 @@ ir_minmax_visitor::prune_expression(ir_expression *expr, minmax_range baserange)
    return expr;
 }
 
-static ir_rvalue *
-swizzle_if_required(ir_expression *expr, ir_rvalue *rval)
-{
-   if (expr->type->is_vector() && rval->type->is_scalar()) {
-      return swizzle(rval, SWIZZLE_XXXX, expr->type->vector_elements);
-   } else {
-      return rval;
-   }
-}
-
 void
 ir_minmax_visitor::handle_rvalue(ir_rvalue **rvalue)
 {
-- 
2.0.3



More information about the mesa-dev mailing list