From 77c7198d760d4335b3d7ed9ee0e1e18ae4f629a7 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 30 Mar 2023 08:50:48 -0400 Subject: [PATCH] zink: fix quads emulation gs with array variables this was broken for e.g., gl_ClipDistance, which uses explicit array types and therefore cannot be directly read/written Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 4bc175afcff..691296eaa22 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -978,9 +978,23 @@ zink_create_quads_emulation_gs(const nir_shader_compiler_options *options, continue; } /* no need to use copy_var to save a lower pass */ - nir_ssa_def *value = nir_load_array_var(&b, in_vars[j], idx); - nir_store_var(&b, out_vars[j], value, - (1u << value->num_components) - 1); + nir_deref_instr *deref_var = nir_build_deref_var(&b, in_vars[j]); + nir_deref_instr *deref_array = nir_build_deref_array(&b, deref_var, idx); + if (glsl_type_is_array(deref_array->type)) { + nir_deref_instr *deref_out = nir_build_deref_var(&b, out_vars[j]); + for (unsigned k = 0; k < glsl_array_size(deref_array->type); k++) { + nir_deref_instr *deref_arr_arr = nir_build_deref_array_imm(&b, deref_array, k); + nir_deref_instr *deref_arr_out = nir_build_deref_array_imm(&b, deref_out, k); + assert(glsl_type_is_vector_or_scalar(deref_arr_arr->type)); + nir_ssa_def *value = nir_load_deref(&b, deref_arr_arr); + nir_store_deref(&b, deref_arr_out, value, + (1u << value->num_components) - 1); + } + } else { + nir_ssa_def *value = nir_load_deref(&b, deref_array); + nir_store_var(&b, out_vars[j], value, + (1u << value->num_components) - 1); + } } nir_emit_vertex(&b, 0); if (i == 2)