nir,ac/nir/ngg,radv: split shader_query_enabled_amd

For used by different counter.

Vulkan:
1. VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT,
   sum generated primitives of all 4 streams when GS.
2. VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT, count generated
   primitives for all 4 streams when VS/TES/GS.
3. VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT, count generated
   and streamout primitives for all 4 streams when VS/TES/GS.

OpenGL:
1. GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB, sum generated
   primitives for all 4 streams when GS.
2. GL_PRIMITIVES_GENERATED, count generated primitives for all 4
   streams when VS/TES/GS.
3. GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, count streamout
   primitives for all 4 streams when VS/TES/GS.

pipeline_stat_query_enabled_amd is for Vulkan 1 and OpenGL 1.
xfb_query_enabled_amd is for Vulkan 2/3 and OpenGL 2/3.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19015>
This commit is contained in:
Qiang Yu
2022-10-10 11:08:40 +08:00
committed by Marge Bot
parent 1dcbf25757
commit 83643e4dc8
5 changed files with 25 additions and 9 deletions

View File

@@ -452,7 +452,7 @@ emit_ngg_nogs_prim_export(nir_builder *b, lower_ngg_nogs_state *st, nir_ssa_def
arg = emit_ngg_nogs_prim_exp_arg(b, st);
if (st->has_prim_query) {
nir_if *if_shader_query = nir_push_if(b, nir_load_shader_query_enabled_amd(b));
nir_if *if_shader_query = nir_push_if(b, nir_load_prim_gen_query_enabled_amd(b));
{
/* Number of active GS threads. Each has 1 output primitive. */
nir_ssa_def *num_gs_threads = nir_bit_count(b, nir_ballot(b, 1, st->wave_size, nir_imm_bool(b, true)));
@@ -2085,7 +2085,10 @@ ngg_gs_clear_primflags(nir_builder *b, nir_ssa_def *num_vertices, unsigned strea
static void
ngg_gs_shader_query(nir_builder *b, nir_intrinsic_instr *intrin, lower_ngg_gs_state *s)
{
nir_if *if_shader_query = nir_push_if(b, nir_load_shader_query_enabled_amd(b));
nir_ssa_def *pipeline_query_enabled = nir_load_pipeline_stat_query_enabled_amd(b);
nir_ssa_def *prim_gen_query_enabled = nir_load_prim_gen_query_enabled_amd(b);
nir_ssa_def *shader_query_enabled = nir_ior(b, pipeline_query_enabled, prim_gen_query_enabled);
nir_if *if_shader_query = nir_push_if(b, shader_query_enabled);
nir_ssa_def *num_prims_in_wave = NULL;
/* Calculate the "real" number of emitted primitives from the emitted GS vertices and primitives.

View File

@@ -57,6 +57,13 @@ nggc_bool_setting(nir_builder *b, unsigned mask, lower_abi_state *s)
return nir_test_mask(b, settings, mask);
}
static nir_ssa_def *
ngg_query_bool_setting(nir_builder *b, unsigned mask, lower_abi_state *s)
{
nir_ssa_def *settings = ac_nir_load_arg(b, &s->args->ac, s->args->ngg_query_state);
return nir_test_mask(b, settings, mask);
}
static bool
lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
{
@@ -174,9 +181,11 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
/* NGG passthrough mode: the HW already packs the primitive export value to a single register. */
replacement = ac_nir_load_arg(b, &s->args->ac, s->args->ac.gs_vtx_offset[0]);
break;
case nir_intrinsic_load_shader_query_enabled_amd:
replacement = nir_ine_imm(b, ac_nir_load_arg(b, &s->args->ac, s->args->ngg_query_state),
radv_ngg_query_none);
case nir_intrinsic_load_pipeline_stat_query_enabled_amd:
replacement = ngg_query_bool_setting(b, radv_ngg_query_pipeline_stat, s);
break;
case nir_intrinsic_load_prim_gen_query_enabled_amd:
replacement = ngg_query_bool_setting(b, radv_ngg_query_prim_gen, s);
break;
case nir_intrinsic_load_cull_any_enabled_amd:
replacement = nggc_bool_setting(

View File

@@ -164,7 +164,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
case nir_intrinsic_load_sample_positions_pan:
case nir_intrinsic_load_workgroup_num_input_vertices_amd:
case nir_intrinsic_load_workgroup_num_input_primitives_amd:
case nir_intrinsic_load_shader_query_enabled_amd:
case nir_intrinsic_load_pipeline_stat_query_enabled_amd:
case nir_intrinsic_load_prim_gen_query_enabled_amd:
case nir_intrinsic_load_cull_front_face_enabled_amd:
case nir_intrinsic_load_cull_back_face_enabled_amd:
case nir_intrinsic_load_cull_ccw_amd:

View File

@@ -1358,8 +1358,10 @@ system_value("workgroup_num_input_vertices_amd", 1)
system_value("workgroup_num_input_primitives_amd", 1)
# For NGG passthrough mode only. Pre-packed argument for export_primitive_amd.
system_value("packed_passthrough_primitive_amd", 1)
# Whether NGG GS should execute shader query.
system_value("shader_query_enabled_amd", dest_comp=1, bit_sizes=[1])
# Whether NGG should execute shader query for pipeline statistics.
system_value("pipeline_stat_query_enabled_amd", dest_comp=1, bit_sizes=[1])
# Whether NGG should execute shader query for primitive generated.
system_value("prim_gen_query_enabled_amd", dest_comp=1, bit_sizes=[1])
# Whether the shader should cull front facing triangles.
intrinsic("load_cull_front_face_enabled_amd", dest_comp=1, bit_sizes=[1], flags=[CAN_ELIMINATE])
# Whether the shader should cull back facing triangles.

View File

@@ -142,7 +142,8 @@ can_move_intrinsic(nir_intrinsic_instr *instr, opt_preamble_ctx *ctx)
case nir_intrinsic_load_fb_layers_v3d:
case nir_intrinsic_load_tcs_num_patches_amd:
case nir_intrinsic_load_sample_positions_pan:
case nir_intrinsic_load_shader_query_enabled_amd:
case nir_intrinsic_load_pipeline_stat_query_enabled_amd:
case nir_intrinsic_load_prim_gen_query_enabled_amd:
case nir_intrinsic_load_cull_front_face_enabled_amd:
case nir_intrinsic_load_cull_back_face_enabled_amd:
case nir_intrinsic_load_cull_ccw_amd: