diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 60da95285ed..542bd3d37dc 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1442,12 +1442,17 @@ assign_consumer_var_io(gl_shader_stage stage, nir_variable *var, unsigned *reser slot -= VARYING_SLOT_PATCH0; } if (slot_map[slot] == (unsigned char)-1) { - if (stage != MESA_SHADER_TESS_CTRL && !is_texcoord(stage, var)) + /* texcoords can't be eliminated in fs due to GL_COORD_REPLACE, + * so keep for now and eliminate later + */ + if (is_texcoord(stage, var)) { + var->data.driver_location = -1; + return true; + } + if (stage != MESA_SHADER_TESS_CTRL) /* dead io */ return false; - /* - texcoords can't be eliminated in fs due to GL_COORD_REPLACE - * - patch variables may be read in the workgroup - */ + /* patch variables may be read in the workgroup */ slot_map[slot] = (*reserved)++; } var->data.driver_location = slot_map[slot]; @@ -1456,6 +1461,25 @@ assign_consumer_var_io(gl_shader_stage stage, nir_variable *var, unsigned *reser } +static bool +rewrite_read_as_0(nir_builder *b, nir_instr *instr, void *data) +{ + nir_variable *var = data; + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + if (intr->intrinsic != nir_intrinsic_load_deref) + return false; + nir_variable *deref_var = nir_intrinsic_get_var(intr, 0); + if (deref_var != var) + return false; + b->cursor = nir_before_instr(instr); + nir_ssa_def *zero = nir_imm_zero(b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest)); + nir_ssa_def_rewrite_uses(&intr->dest.ssa, zero); + return true; +} + static bool rewrite_and_discard_read(nir_builder *b, nir_instr *instr, void *data) { @@ -2144,6 +2168,15 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL); need_optimize = true; } + nir_foreach_shader_in_variable_safe(var, nir) { + if (!is_texcoord(MESA_SHADER_FRAGMENT, var) || var->data.driver_location != -1) + continue; + nir_shader_instructions_pass(nir, rewrite_read_as_0, nir_metadata_dominance, var); + var->data.mode = nir_var_shader_temp; + nir_fixup_deref_modes(nir); + NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL); + need_optimize = true; + } break; default: break; }