radeonsi: move gfx10_shader_ngg.c contents into si_shader.c

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Acked-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35529>
This commit is contained in:
Marek Olšák 2025-05-31 08:41:41 -04:00 committed by Marge Bot
parent d3c1c638c4
commit cc497fd0e4
4 changed files with 32 additions and 57 deletions

View file

@ -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);
}

View file

@ -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',

View file

@ -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;
}

View file

@ -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;