Mesa (master): glsl: Add a helper function for determining if an rvalue could be a saturate.

Eric Anholt anholt at kemper.freedesktop.org
Sat Nov 20 03:16:27 UTC 2010


Module: Mesa
Branch: master
Commit: 02939d643f878ce3a3dcd2e7b2c6f035c64ecda7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=02939d643f878ce3a3dcd2e7b2c6f035c64ecda7

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Nov 19 18:27:41 2010 +0800

glsl: Add a helper function for determining if an rvalue could be a saturate.

Hardware pretty commonly has saturate modifiers on instructions, and
this can be used in codegen to produce those, without everyone else
needing to understand clamping other than min and max.

---

 src/glsl/ir.cpp |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/glsl/ir.h   |    2 +
 2 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 741e3cb..2abb953 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1335,3 +1335,59 @@ reparent_ir(exec_list *list, void *mem_ctx)
       visit_tree((ir_instruction *) node, steal_memory, mem_ctx);
    }
 }
+
+
+static ir_rvalue *
+try_min_one(ir_rvalue *ir)
+{
+   ir_expression *expr = ir->as_expression();
+
+   if (!expr || expr->operation != ir_binop_min)
+      return NULL;
+
+   if (expr->operands[0]->is_one())
+      return expr->operands[1];
+
+   if (expr->operands[1]->is_one())
+      return expr->operands[0];
+
+   return NULL;
+}
+
+static ir_rvalue *
+try_max_zero(ir_rvalue *ir)
+{
+   ir_expression *expr = ir->as_expression();
+
+   if (!expr || expr->operation != ir_binop_max)
+      return NULL;
+
+   if (expr->operands[0]->is_zero())
+      return expr->operands[1];
+
+   if (expr->operands[1]->is_zero())
+      return expr->operands[0];
+
+   return NULL;
+}
+
+ir_rvalue *
+ir_rvalue::as_rvalue_to_saturate()
+{
+   ir_expression *expr = this->as_expression();
+
+   if (!expr)
+      return NULL;
+
+   ir_rvalue *max_zero = try_max_zero(expr);
+   if (max_zero) {
+      return try_min_one(max_zero);
+   } else {
+      ir_rvalue *min_one = try_min_one(expr);
+      if (min_one) {
+	 return try_max_zero(min_one);
+      }
+   }
+
+   return NULL;
+}
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index be0da07..850033b 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -144,6 +144,8 @@ public:
       return this;
    }
 
+   ir_rvalue *as_rvalue_to_saturate();
+
    virtual bool is_lvalue()
    {
       return false;




More information about the mesa-commit mailing list