diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index ab40b80d4ac..0d3222b5d1e 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3495,6 +3495,7 @@ typedef struct nir_shader_compiler_options { * for IO purposes and would prefer loads/stores be vectorized. */ bool vectorize_io; + bool vectorize_tess_levels; bool lower_to_scalar; nir_instr_filter_cb lower_to_scalar_filter; diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 9db94540be6..868f4371d01 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -598,6 +598,11 @@ st_nir_vectorize_io(nir_shader *producer, nir_shader *consumer) return; NIR_PASS_V(producer, nir_lower_io_to_vector, nir_var_shader_out); + + if (producer->info.stage == MESA_SHADER_TESS_CTRL && + producer->options->vectorize_tess_levels) + NIR_PASS_V(producer, nir_vectorize_tess_levels); + NIR_PASS_V(producer, nir_opt_combine_stores, nir_var_shader_out); if ((producer)->info.stage != MESA_SHADER_TESS_CTRL) {