glsl: Refactor is_zero/one/negative_one into an is_value() method.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 6 Jan 2014 06:42:31 +0000 (22:42 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 7 Jan 2014 20:54:57 +0000 (12:54 -0800)
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@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/ir.cpp
src/glsl/ir.h

index 04a7b874a9d40310648a26806121be995cf2bac1..ba6903d8a3f1db2e3eb927999bbf9cbf10267174 100644 (file)
@@ -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
index 780959b731b2ea96c843b316f502cddd858b791d..4d863854bc647a5134c036a78f5fa3c65cb15671 100644 (file)
@@ -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;