[Mesa-dev] [RFC 06/16] glsl: Add support for half floats in optimization passes

Topi Pohjolainen topi.pohjolainen at intel.com
Fri May 15 02:39:33 PDT 2015


Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 src/glsl/ir_print_visitor.cpp         |  1 +
 src/glsl/opt_algebraic.cpp            | 11 ++++++++---
 src/glsl/opt_constant_propagation.cpp |  1 +
 src/glsl/opt_minmax.cpp               |  2 ++
 4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
index 01f52e8..1727855 100644
--- a/src/glsl/ir_print_visitor.cpp
+++ b/src/glsl/ir_print_visitor.cpp
@@ -424,6 +424,7 @@ void ir_print_visitor::visit(ir_constant *ir)
 	 switch (ir->type->base_type) {
 	 case GLSL_TYPE_UINT:  fprintf(f, "%u", ir->value.u[i]); break;
 	 case GLSL_TYPE_INT:   fprintf(f, "%d", ir->value.i[i]); break;
+	 case GLSL_TYPE_HALF:
 	 case GLSL_TYPE_FLOAT:
             if (ir->value.f[i] == 0.0f)
                /* 0.0 == -0.0, so print with %f to get the proper sign. */
diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index fa5db70..8555d00 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -125,7 +125,8 @@ is_valid_vec_const(ir_constant *ir)
 static inline bool
 is_less_than_one(ir_constant *ir)
 {
-   assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+   assert(ir->type->base_type == GLSL_TYPE_HALF ||
+          ir->type->base_type == GLSL_TYPE_FLOAT);
 
    if (!is_valid_vec_const(ir))
       return false;
@@ -142,7 +143,8 @@ is_less_than_one(ir_constant *ir)
 static inline bool
 is_greater_than_zero(ir_constant *ir)
 {
-   assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+   assert(ir->type->base_type == GLSL_TYPE_HALF ||
+          ir->type->base_type == GLSL_TYPE_FLOAT);
 
    if (!is_valid_vec_const(ir))
       return false;
@@ -602,6 +604,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
 
    case ir_binop_div:
       if (is_vec_one(op_const[0]) && (
+                ir->type->base_type == GLSL_TYPE_HALF ||
                 ir->type->base_type == GLSL_TYPE_FLOAT ||
                 ir->type->base_type == GLSL_TYPE_DOUBLE)) {
 	 return new(mem_ctx) ir_expression(ir_unop_rcp,
@@ -798,7 +801,8 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
 
    case ir_binop_min:
    case ir_binop_max:
-      if (ir->type->base_type != GLSL_TYPE_FLOAT || options->EmitNoSat)
+      if ((ir->type->base_type != GLSL_TYPE_HALF &&
+           ir->type->base_type != GLSL_TYPE_FLOAT) || options->EmitNoSat)
          break;
 
       /* Replace min(max) operations and its commutative combinations with
@@ -920,6 +924,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
          ir_constant *one;
 
          switch (ir->type->base_type) {
+         case GLSL_TYPE_HALF:
          case GLSL_TYPE_FLOAT:
             one = new(mem_ctx) ir_constant(1.0f, op2_components);
             break;
diff --git a/src/glsl/opt_constant_propagation.cpp b/src/glsl/opt_constant_propagation.cpp
index 90cc0c8..e81a288 100644
--- a/src/glsl/opt_constant_propagation.cpp
+++ b/src/glsl/opt_constant_propagation.cpp
@@ -191,6 +191,7 @@ ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue)
       }
 
       switch (type->base_type) {
+      case GLSL_TYPE_HALF:
       case GLSL_TYPE_FLOAT:
 	 data.f[i] = found->constant->value.f[rhs_channel];
 	 break;
diff --git a/src/glsl/opt_minmax.cpp b/src/glsl/opt_minmax.cpp
index 23d0b10..6295d0c 100644
--- a/src/glsl/opt_minmax.cpp
+++ b/src/glsl/opt_minmax.cpp
@@ -125,6 +125,7 @@ compare_components(ir_constant *a, ir_constant *b)
          else
             foundequal = true;
          break;
+      case GLSL_TYPE_HALF:
       case GLSL_TYPE_FLOAT:
          if (a->value.f[c0] < b->value.f[c1])
             foundless = true;
@@ -181,6 +182,7 @@ combine_constant(bool ismin, ir_constant *a, ir_constant *b)
              (!ismin && b->value.i[i] > c->value.i[i]))
             c->value.i[i] = b->value.i[i];
          break;
+      case GLSL_TYPE_HALF:
       case GLSL_TYPE_FLOAT:
          if ((ismin && b->value.f[i] < c->value.f[i]) ||
              (!ismin && b->value.f[i] > c->value.f[i]))
-- 
1.9.3



More information about the mesa-dev mailing list