Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/compiler/glsl/lower_mediump.cpp | 43 ++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/src/compiler/glsl/lower_mediump.cpp b/src/compiler/glsl/lower_mediump.cpp index 89eed8b294..0276e74d6e 100644 --- a/src/compiler/glsl/lower_mediump.cpp +++ b/src/compiler/glsl/lower_mediump.cpp @@ -67,6 +67,25 @@ refers_16_bit_float(const ir_rvalue *ir) return var->type->get_scalar_type()->base_type == GLSL_TYPE_FLOAT16; } +static bool +is_constant(const ir_rvalue *ir) +{ + if (ir->ir_type == ir_type_constant) + return true; + + if (ir->ir_type != ir_type_expression) + return false; + + const ir_expression *expr = (const ir_expression *)ir; + + for (unsigned i = 0; i < expr->num_operands; i++) { + if (!is_constant(expr->operands[i])) + return false; + } + + return true; +} + static ir_rvalue * convert(ir_rvalue *ir, enum ir_expression_operation op) { @@ -99,6 +118,7 @@ private: bool can_be_lowered(const ir_variable *var) const; void retype_to_float16(const glsl_type **t); + void retype_to_float16(ir_rvalue *ir); }; bool @@ -119,6 +139,22 @@ lower_mediump_visitor::retype_to_float16(const glsl_type **t) *t = mediump; } +void +lower_mediump_visitor::retype_to_float16(ir_rvalue *ir) +{ + retype_to_float16(&ir->type); + + if (ir->ir_type != ir_type_expression) + return; + + const ir_expression *expr = (const ir_expression *)ir; + + for (unsigned i = 0; i < expr->num_operands; i++) { + assert(is_constant(expr->operands[i])); + retype_to_float16(&expr->operands[i]->type); + } +} + ir_visitor_status lower_mediump_visitor::visit(ir_variable *ir) { @@ -228,7 +264,7 @@ 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 + else if (!is_constant(ir->operands[i])) has_32_bit_src = true; } @@ -240,6 +276,11 @@ lower_mediump_visitor::visit_leave(ir_expression *ir) */ if (!has_32_bit_src && ir->operation != ir_triop_lrp) { + for (unsigned i = 0; i < ir->num_operands; i++) { + if (is_constant(ir->operands[i])) + retype_to_float16(ir->operands[i]); + } + retype_to_float16(&ir->type); return visit_continue; } -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev