diff --git a/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c b/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c deleted file mode 100644 index ae2038c911a..00000000000 --- a/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2017 Advanced Micro Devices, Inc. - * - * SPDX-License-Identifier: MIT - */ - -#include "si_pipe.h" -#include "si_query.h" -#include "si_shader_internal.h" - -static bool gfx10_ngg_writes_user_edgeflags(struct si_shader *shader) -{ - return gfx10_has_variable_edgeflags(shader) && - shader->selector->info.writes_edgeflag; -} - -bool gfx10_ngg_export_prim_early(struct si_shader *shader) -{ - struct si_shader_selector *sel = shader->selector; - - assert(shader->key.ge.as_ngg && !shader->key.ge.as_es); - - return sel->stage != MESA_SHADER_GEOMETRY && - !gfx10_ngg_writes_user_edgeflags(shader) && - sel->screen->info.gfx_level < GFX11; -} - -/** - * Determine subgroup information like maximum number of vertices and prims. - * - * This happens before the shader is uploaded, since LDS relocations during - * upload depend on the subgroup size. - */ -bool gfx10_ngg_calculate_subgroup_info(struct si_shader *shader) -{ - const struct si_shader_selector *gs_sel = shader->selector; - const struct si_shader_selector *es_sel = - shader->previous_stage_sel ? shader->previous_stage_sel : gs_sel; - const gl_shader_stage gs_stage = gs_sel->stage; - const unsigned input_prim = si_get_input_prim(gs_sel, &shader->key, false); - unsigned gs_vertices_out = gs_stage == MESA_SHADER_GEOMETRY ? gs_sel->info.base.gs.vertices_out : 0; - unsigned gs_invocations = gs_stage == MESA_SHADER_GEOMETRY ? gs_sel->info.base.gs.invocations : 0; - - return ac_ngg_compute_subgroup_info(gs_sel->screen->info.gfx_level, es_sel->stage, - gs_sel->stage == MESA_SHADER_GEOMETRY, - input_prim, gs_vertices_out, gs_invocations, - si_get_max_workgroup_size(shader), shader->wave_size, - es_sel->info.esgs_vertex_stride, shader->info.ngg_lds_vertex_size, - shader->info.ngg_lds_scratch_size, gs_sel->tess_turns_off_ngg, - &shader->ngg.info); -} diff --git a/src/gallium/drivers/radeonsi/meson.build b/src/gallium/drivers/radeonsi/meson.build index 7c649cf4d09..608e1e911db 100644 --- a/src/gallium/drivers/radeonsi/meson.build +++ b/src/gallium/drivers/radeonsi/meson.build @@ -21,7 +21,6 @@ idep_si_tracepoints = declare_dependency( files_libradeonsi = files( 'driinfo_radeonsi.h', - 'gfx10_shader_ngg.c', 'gfx11_query.c', 'si_barrier.c', 'si_blit.c', diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index a54c8323da8..739b99be44a 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1106,6 +1106,23 @@ static bool si_lower_io_to_mem(struct si_shader *shader, nir_shader *nir) return false; } +static bool gfx10_ngg_writes_user_edgeflags(struct si_shader *shader) +{ + return gfx10_has_variable_edgeflags(shader) && + shader->selector->info.writes_edgeflag; +} + +bool gfx10_ngg_export_prim_early(struct si_shader *shader) +{ + struct si_shader_selector *sel = shader->selector; + + assert(shader->key.ge.as_ngg && !shader->key.ge.as_es); + + return sel->stage != MESA_SHADER_GEOMETRY && + !gfx10_ngg_writes_user_edgeflags(shader) && + sel->screen->info.gfx_level < GFX11; +} + static void si_lower_ngg(struct si_shader *shader, nir_shader *nir, struct si_temp_shader_variant_info *temp_info) { @@ -2569,7 +2586,20 @@ bool si_create_shader_variant(struct si_screen *sscreen, struct ac_llvm_compiler if (sel->stage <= MESA_SHADER_GEOMETRY && shader->key.ge.as_ngg) { assert(!shader->key.ge.as_es && !shader->key.ge.as_ls); - if (!gfx10_ngg_calculate_subgroup_info(shader)) { + const struct si_shader_selector *gs_sel = shader->selector; + const struct si_shader_selector *es_sel = + shader->previous_stage_sel ? shader->previous_stage_sel : gs_sel; + const unsigned input_prim = si_get_input_prim(gs_sel, &shader->key, false); + unsigned gs_vertices_out = gs_sel->stage == MESA_SHADER_GEOMETRY ? gs_sel->info.base.gs.vertices_out : 0; + unsigned gs_invocations = gs_sel->stage == MESA_SHADER_GEOMETRY ? gs_sel->info.base.gs.invocations : 0; + + if (!ac_ngg_compute_subgroup_info(gs_sel->screen->info.gfx_level, es_sel->stage, + gs_sel->stage == MESA_SHADER_GEOMETRY, + input_prim, gs_vertices_out, gs_invocations, + si_get_max_workgroup_size(shader), shader->wave_size, + es_sel->info.esgs_vertex_stride, shader->info.ngg_lds_vertex_size, + shader->info.ngg_lds_scratch_size, gs_sel->tess_turns_off_ngg, + &shader->ngg.info)) { mesa_loge("Failed to compute subgroup info"); return false; } diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 35a6b107a7a..3c876f10054 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -95,6 +95,7 @@ bool si_is_merged_shader(struct si_shader *shader); unsigned si_get_max_workgroup_size(const struct si_shader *shader); enum ac_hw_stage si_select_hw_stage(const gl_shader_stage stage, const union si_shader_key *const key, const enum amd_gfx_level gfx_level); +bool gfx10_ngg_export_prim_early(struct si_shader *shader); /* si_shader_args.c */ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args, @@ -107,10 +108,6 @@ void si_get_ps_epilog_args(struct si_shader_args *args, struct ac_arg *depth, struct ac_arg *stencil, struct ac_arg *sample_mask); -/* gfx10_shader_ngg.c */ -bool gfx10_ngg_export_prim_early(struct si_shader *shader); -bool gfx10_ngg_calculate_subgroup_info(struct si_shader *shader); - struct nir_def; typedef struct nir_def nir_def;