[Mesa-dev] [PATCH 46/51] glsl: Lower float conversions to mediump

Topi Pohjolainen topi.pohjolainen at gmail.com
Fri Nov 24 12:27:13 UTC 2017


Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 src/compiler/glsl/lower_mediump.cpp | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/src/compiler/glsl/lower_mediump.cpp b/src/compiler/glsl/lower_mediump.cpp
index 0276e74d6e..07f1f1ba9d 100644
--- a/src/compiler/glsl/lower_mediump.cpp
+++ b/src/compiler/glsl/lower_mediump.cpp
@@ -55,6 +55,30 @@ is_16_bit(const ir_rvalue *ir)
    return ir->type->get_scalar_type()->base_type == GLSL_TYPE_FLOAT16;
 }
 
+static void
+retype_x2f_x2f16(ir_rvalue *ir)
+{
+   if (ir->ir_type != ir_type_expression)
+      return;
+
+   ir_expression *expr = (ir_expression *)ir;
+   switch (expr->operation) {
+   case ir_unop_i2f:
+      expr->operation = ir_unop_i2h;
+      break;
+   case ir_unop_b2f:
+      expr->operation = ir_unop_b2h;
+      break;
+   case ir_unop_u2f:
+      expr->operation = ir_unop_u2h;
+      break;
+   default:
+      return;
+   }
+
+   ir->type = get_mediump(ir->type);
+}
+
 static bool
 refers_16_bit_float(const ir_rvalue *ir)
 {
@@ -259,6 +283,8 @@ lower_mediump_visitor::visit_leave(ir_expression *ir)
 {
    ir_rvalue_visitor::visit_leave(ir);
 
+   retype_x2f_x2f16(ir);
+
    bool has_32_bit_src = false;
    bool has_16_bit_src = false;
    for (unsigned i = 0; i < ir->num_operands; i++) {
-- 
2.11.0



More information about the mesa-dev mailing list