From 83643e4dc82d86b15d78bb764721fb731b45c85b Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Mon, 10 Oct 2022 11:08:40 +0800 Subject: [PATCH] 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 Signed-off-by: Qiang Yu Part-of: --- src/amd/common/ac_nir_lower_ngg.c | 7 +++++-- src/amd/vulkan/radv_nir_lower_abi.c | 15 ++++++++++++--- src/compiler/nir/nir_divergence_analysis.c | 3 ++- src/compiler/nir/nir_intrinsics.py | 6 ++++-- src/compiler/nir/nir_opt_preamble.c | 3 ++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index 7c1ad54f00b..f4ec76cbd62 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -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. diff --git a/src/amd/vulkan/radv_nir_lower_abi.c b/src/amd/vulkan/radv_nir_lower_abi.c index 75cb036d799..742f05cd26b 100644 --- a/src/amd/vulkan/radv_nir_lower_abi.c +++ b/src/amd/vulkan/radv_nir_lower_abi.c @@ -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( diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 4b95b133645..ff3f7dfd926 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -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: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 8f29e8a6ebc..bf6b205affb 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -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. diff --git a/src/compiler/nir/nir_opt_preamble.c b/src/compiler/nir/nir_opt_preamble.c index f212f81bb29..f0ea9797705 100644 --- a/src/compiler/nir/nir_opt_preamble.c +++ b/src/compiler/nir/nir_opt_preamble.c @@ -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: