+ nir_shader *nir = glsl_to_nir(st->ctx, shader_program, stage, options);
+
+ /* Set the next shader stage hint for VS and TES. */
+ if (!nir->info.separate_shader &&
+ (nir->info.stage == MESA_SHADER_VERTEX ||
+ nir->info.stage == MESA_SHADER_TESS_EVAL)) {
+
+ unsigned prev_stages = (1 << (prog->info.stage + 1)) - 1;
+ unsigned stages_mask =
+ ~prev_stages & shader_program->data->linked_stages;
+
+ nir->info.next_stage = stages_mask ?
+ (gl_shader_stage) u_bit_scan(&stages_mask) : MESA_SHADER_FRAGMENT;
+ } else {
+ nir->info.next_stage = MESA_SHADER_FRAGMENT;
+ }
+
+ nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
+ nir_shader *softfp64 = NULL;
+ if (nir->info.uses_64bit &&
+ (options->lower_doubles_options & nir_lower_fp64_full_software) != 0) {
+ softfp64 = glsl_float64_funcs_to_nir(st->ctx, options);
+ ralloc_steal(ralloc_parent(nir), softfp64);
+ }
+
+ nir_variable_mode mask =
+ (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out);
+ nir_remove_dead_variables(nir, mask);
+
+ if (options->lower_all_io_to_temps ||
+ nir->info.stage == MESA_SHADER_VERTEX ||
+ nir->info.stage == MESA_SHADER_GEOMETRY) {
+ NIR_PASS_V(nir, nir_lower_io_to_temporaries,
+ nir_shader_get_entrypoint(nir),
+ true, true);
+ } else if (nir->info.stage == MESA_SHADER_FRAGMENT) {
+ NIR_PASS_V(nir, nir_lower_io_to_temporaries,
+ nir_shader_get_entrypoint(nir),
+ true, false);
+ }
+
+ NIR_PASS_V(nir, nir_lower_global_vars_to_local);
+ NIR_PASS_V(nir, nir_split_var_copies);
+ NIR_PASS_V(nir, nir_lower_var_copies);
+
+ if (is_scalar) {
+ NIR_PASS_V(nir, nir_lower_alu_to_scalar);
+ }
+
+ /* before buffers and vars_to_ssa */
+ NIR_PASS_V(nir, gl_nir_lower_bindless_images);
+ st_nir_opts(nir, is_scalar);