[Mesa-dev] [PATCH 1/2] glsl: Refactor is_zero/one/negative_one into an is_value() method.

Kenneth Graunke kenneth at whitecape.org
Mon Jan 6 14:07:41 PST 2014


This patch creates a new generic is_value() method, which checks if an
ir_constant has a particular value.  (For vectors, it must have the
single value repeated across all components.)

It then rewrites the is_zero/is_one/is_negative_one methods to use this
generic helper.  All three were basically identical except for the value
they checked for.  The other difference is that is_negative_one rejects
boolean types.  The new is_value function maintains this behavior, only
allowing boolean types when checking for 0 or 1.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/glsl/ir.cpp | 85 ++++++++++++---------------------------------------------
 src/glsl/ir.h   |  6 ++++
 2 files changed, 23 insertions(+), 68 deletions(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 04a7b87..ba6903d 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1122,27 +1122,31 @@ ir_constant::has_value(const ir_constant *c) const
 }
 
 bool
-ir_constant::is_zero() const
+ir_constant::is_value(float f, int i) const
 {
    if (!this->type->is_scalar() && !this->type->is_vector())
       return false;
 
+   /* Only accept boolean values for 0/1. */
+   if (int(bool(i)) != i && this->type->is_boolean())
+      return false;
+
    for (unsigned c = 0; c < this->type->vector_elements; c++) {
       switch (this->type->base_type) {
       case GLSL_TYPE_FLOAT:
-	 if (this->value.f[c] != 0.0)
+	 if (this->value.f[c] != f)
 	    return false;
 	 break;
       case GLSL_TYPE_INT:
-	 if (this->value.i[c] != 0)
+	 if (this->value.i[c] != i)
 	    return false;
 	 break;
       case GLSL_TYPE_UINT:
-	 if (this->value.u[c] != 0)
+	 if (this->value.u[c] != unsigned(i))
 	    return false;
 	 break;
       case GLSL_TYPE_BOOL:
-	 if (this->value.b[c] != false)
+	 if (this->value.b[c] != bool(i))
 	    return false;
 	 break;
       default:
@@ -1159,76 +1163,21 @@ ir_constant::is_zero() const
 }
 
 bool
-ir_constant::is_one() const
+ir_constant::is_zero() const
 {
-   if (!this->type->is_scalar() && !this->type->is_vector())
-      return false;
-
-   for (unsigned c = 0; c < this->type->vector_elements; c++) {
-      switch (this->type->base_type) {
-      case GLSL_TYPE_FLOAT:
-	 if (this->value.f[c] != 1.0)
-	    return false;
-	 break;
-      case GLSL_TYPE_INT:
-	 if (this->value.i[c] != 1)
-	    return false;
-	 break;
-      case GLSL_TYPE_UINT:
-	 if (this->value.u[c] != 1)
-	    return false;
-	 break;
-      case GLSL_TYPE_BOOL:
-	 if (this->value.b[c] != true)
-	    return false;
-	 break;
-      default:
-	 /* The only other base types are structures, arrays, and samplers.
-	  * Samplers cannot be constants, and the others should have been
-	  * filtered out above.
-	  */
-	 assert(!"Should not get here.");
-	 return false;
-      }
-   }
+   return is_value(0.0, 0);
+}
 
-   return true;
+bool
+ir_constant::is_one() const
+{
+   return is_value(1.0, 1);
 }
 
 bool
 ir_constant::is_negative_one() const
 {
-   if (!this->type->is_scalar() && !this->type->is_vector())
-      return false;
-
-   if (this->type->is_boolean())
-      return false;
-
-   for (unsigned c = 0; c < this->type->vector_elements; c++) {
-      switch (this->type->base_type) {
-      case GLSL_TYPE_FLOAT:
-	 if (this->value.f[c] != -1.0)
-	    return false;
-	 break;
-      case GLSL_TYPE_INT:
-	 if (this->value.i[c] != -1)
-	    return false;
-	 break;
-      case GLSL_TYPE_UINT:
-	 if (int(this->value.u[c]) != -1)
-	    return false;
-	 break;
-      default:
-	 /* The only other base types are structures, arrays, samplers, and
-	  * booleans.  Samplers cannot be constants, and the others should
-	  * have been filtered out above.
-	  */
-	 assert(!"Should not get here.");
-	 return false;
-      }
-   }
-
-   return true;
+   return is_value(-1.0, -1);
 }
 
 bool
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 780959b..4d86385 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -2186,6 +2186,12 @@ public:
     */
    bool has_value(const ir_constant *) const;
 
+   /**
+    * Return true if this ir_constant represents the given value.
+    *
+    * For vectors, this checks that each component is the given value.
+    */
+   virtual bool is_value(float f, int i) const;
    virtual bool is_zero() const;
    virtual bool is_one() const;
    virtual bool is_negative_one() const;
-- 
1.8.5.2



More information about the mesa-dev mailing list