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 <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6073>
This commit is contained in:
Marek Olšák
2020-07-23 18:41:28 -04:00
committed by Marge Bot
parent 5020403c70
commit 01e0085637

View File

@@ -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);
}
}
}