From 01e008563753671c9076867c355d723932bc1b27 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 23 Jul 2020 18:41:28 -0400 Subject: [PATCH] glsl: don't create conversion opcodes for array types Instead, convert all elements one by one. This fixes piglit shaders@glsl-bug-110796. Reviewed-by: Rob Clark Part-of: --- src/compiler/glsl/lower_precision.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/compiler/glsl/lower_precision.cpp b/src/compiler/glsl/lower_precision.cpp index 97a91f8c440..f602c78878f 100644 --- a/src/compiler/glsl/lower_precision.cpp +++ b/src/compiler/glsl/lower_precision.cpp @@ -690,7 +690,7 @@ convert_precision(bool up, ir_rvalue *ir) unsigned op; if (up) { - switch (ir->type->without_array()->base_type) { + switch (ir->type->base_type) { case GLSL_TYPE_FLOAT16: op = ir_unop_f162f; break; @@ -705,7 +705,7 @@ convert_precision(bool up, ir_rvalue *ir) return NULL; } } else { - switch (ir->type->without_array()->base_type) { + switch (ir->type->base_type) { case GLSL_TYPE_FLOAT: op = ir_unop_f2fmp; break; @@ -1255,10 +1255,20 @@ void lower_variables_visitor::handle_rvalue(ir_rvalue **rvalue) if (var && _mesa_set_search(lower_vars, var) && deref->type->without_array()->is_32bit()) { + void *mem_ctx = ralloc_parent(ir); + + /* Create a 32-bit temporary variable. */ + ir_variable *new_var = + new(mem_ctx) ir_variable(deref->type, "lowerp", ir_var_temporary); + base_ir->insert_before(new_var); + + /* Fix types in dereferences. */ fix_types_in_deref_chain(deref); - /* Then convert the type up. Optimizations should eliminate this. */ - *rvalue = convert_precision(true, deref); + /* Convert to 32 bits for the rvalue. */ + convert_split_assignment(new(mem_ctx) ir_dereference_variable(new_var), + deref, true); + *rvalue = new(mem_ctx) ir_dereference_variable(new_var); } } } -- 2.30.2