radeonsi: aco compile support merged mono shader
authorQiang Yu <yuq825@gmail.com>
Thu, 6 Jul 2023 02:27:02 +0000 (10:27 +0800)
committerMarge Bot <emma+marge@anholt.net>
Mon, 24 Jul 2023 01:49:21 +0000 (01:49 +0000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24204>

src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader_aco.c

index a095199..12b33d3 100644 (file)
@@ -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);
 
index 3bd6a33..fc063bf 100644 (file)
@@ -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;
 }