mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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:
parent
d3c1c638c4
commit
cc497fd0e4
4 changed files with 32 additions and 57 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue