diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 84ce94831b8..5fca6b63bc8 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -789,8 +789,11 @@ nir_visitor::visit(ir_return *ir) nir_build_deref_cast(&b, nir_load_param(&b, 0), nir_var_function_temp, ir->value->type, 0); - nir_def *val = evaluate_rvalue(ir->value); - nir_store_deref(&b, ret_deref, val, ~0); + if (glsl_type_is_vector_or_scalar(ir->value->type)) { + nir_store_deref(&b, ret_deref, evaluate_rvalue(ir->value), ~0); + } else { + nir_copy_deref(&b, ret_deref, evaluate_deref(ir->value)); + } } nir_jump_instr *instr = nir_jump_instr_create(this->shader, nir_jump_return); @@ -1564,8 +1567,14 @@ nir_visitor::visit(ir_call *ir) } - if (ir->return_deref) - nir_store_deref(&b, evaluate_deref(ir->return_deref), nir_load_deref(&b, ret_deref), ~0); + if (ir->return_deref) { + if (glsl_type_is_vector_or_scalar(ir->return_deref->type)) { + nir_store_deref(&b, evaluate_deref(ir->return_deref), + nir_load_deref(&b, ret_deref), ~0); + } else { + nir_copy_deref(&b, evaluate_deref(ir->return_deref), ret_deref); + } + } } void diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 67a016553c3..27073067d6a 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2633,12 +2633,6 @@ public: } } - if (!glsl_type_is_vector_or_scalar(ir->return_type) && - !glsl_type_is_void(ir->return_type)) { - unsupported = true; - return visit_stop; - } - return visit_continue; }