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

diff --git a/src/compiler/glsl/lower_mediump.cpp 
b/src/compiler/glsl/lower_mediump.cpp
index 094ab4e743..45cf75b53c 100644
--- a/src/compiler/glsl/lower_mediump.cpp
+++ b/src/compiler/glsl/lower_mediump.cpp
@@ -92,6 +92,20 @@ refers_16_bit_float(const ir_rvalue *ir)
 }
 
 static bool
+defers_input_varying(const ir_rvalue *ir)
+{
+   ir_variable *var = ir->variable_referenced();
+   if (!var)
+      return false;
+
+   if (var->data.mode != ir_var_shader_in)
+      return false;
+
+   return var->data.precision == ast_precision_low ||
+          var->data.precision == ast_precision_medium;
+}
+
+static bool
 is_constant(const ir_rvalue *ir)
 {
    if (ir->ir_type == ir_type_constant)
@@ -152,6 +166,13 @@ lower_mediump_visitor::can_be_lowered(const ir_variable 
*var) const
    if (!var->type->get_scalar_type()->is_float())
       return false;
 
+   /* TODO: Intel compiler backend isn't prepared for interpolated 16-bit
+    *       varyings. Input varyings are instead converted to 16-bits before
+    *       use.
+    */
+   if (var->data.mode == ir_var_shader_in)
+      return false;
+
    return var->data.precision == ast_precision_low ||
           var->data.precision == ast_precision_medium;
 }
@@ -309,7 +330,8 @@ lower_mediump_visitor::visit_leave(ir_expression *ir)
    for (unsigned i = 0; i < ir->num_operands; i++) {
       if (is_16_bit(ir->operands[i]))
          has_16_bit_src = true;
-      else if (!is_constant(ir->operands[i]))
+      else if (!is_constant(ir->operands[i]) &&
+               !defers_input_varying(ir->operands[i]))
          has_32_bit_src = true;
    }
 
@@ -324,6 +346,8 @@ lower_mediump_visitor::visit_leave(ir_expression *ir)
       for (unsigned i = 0; i < ir->num_operands; i++) {
          if (is_constant(ir->operands[i]))
             retype_to_float16(ir->operands[i]);
+         else if (defers_input_varying(ir->operands[i]))
+            ir->operands[i] = convert(ir->operands[i], ir_unop_f2h);
       }
 
       retype_to_float16(&ir->type);
-- 
2.11.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to