diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index a09519984f8..12b33d38872 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3461,6 +3461,7 @@ nir_shader *si_get_prev_stage_nir_shader(struct si_shader *shader, */ prev_shader->key.ge.opt.kill_outputs = 0; prev_shader->is_monolithic = true; + prev_shader->use_aco = shader->use_aco; si_init_shader_args(prev_shader, args); diff --git a/src/gallium/drivers/radeonsi/si_shader_aco.c b/src/gallium/drivers/radeonsi/si_shader_aco.c index 3bd6a33ee6a..fc063bf133f 100644 --- a/src/gallium/drivers/radeonsi/si_shader_aco.c +++ b/src/gallium/drivers/radeonsi/si_shader_aco.c @@ -145,9 +145,33 @@ si_aco_compile_shader(struct si_shader *shader, struct aco_shader_info info = {0}; si_fill_aco_shader_info(shader, &info); - aco_compile_shader(&options, &info, 1, &nir, &args->ac, + nir_shader *shaders[2]; + unsigned num_shaders = 0; + + bool free_nir = false; + struct si_shader prev_shader = {}; + struct si_shader_args prev_args; + + const struct si_shader_selector *sel = shader->selector; + + /* For merged shader stage. */ + if (shader->is_monolithic && sel->screen->info.gfx_level >= GFX9 && + (sel->stage == MESA_SHADER_TESS_CTRL || sel->stage == MESA_SHADER_GEOMETRY)) { + + shaders[num_shaders++] = + si_get_prev_stage_nir_shader(shader, &prev_shader, &prev_args, &free_nir); + + args = &prev_args; + } + + shaders[num_shaders++] = nir; + + aco_compile_shader(&options, &info, num_shaders, shaders, &args->ac, si_aco_build_shader_binary, (void **)shader); + if (free_nir) + ralloc_free(shaders[0]); + return true; }