From d1283083eac00c6466a0f066df732699b7074c6f Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 22 May 2020 13:39:06 +0100 Subject: [PATCH] nir: improve divergence analysis for loads with non-uniform resources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If ACCESS_NON_UNIFORM is not specified, we can assume the resource is uniform. This requires nir_lower_non_uniform_access to remove that flag. A few Detroit: Become Human shaders use a index sourced from a fragment input which is expected to be uniform. shader-db (Navi): Totals from 8 (0.01% of 127638) affected shaders: SGPRs: 224 -> 384 (+71.43%) VGPRs: 208 -> 112 (-46.15%) CodeSize: 5360 -> 5344 (-0.30%); split: -1.49%, +1.19% Instrs: 1036 -> 1028 (-0.77%); split: -1.93%, +1.16% VMEM: 1320 -> 608 (-53.94%) SMEM: 384 -> 336 (-12.50%); split: +14.58%, -27.08% VClause: 24 -> 16 (-33.33%) SClause: 48 -> 56 (+16.67%) PreSGPRs: 124 -> 216 (+74.19%) PreVGPRs: 168 -> 88 (-47.62%) Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/compiler/nir/nir_divergence_analysis.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 98392b97b3c..f148c09e678 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -241,6 +241,20 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) break; } + case nir_intrinsic_load_ubo: + case nir_intrinsic_load_ssbo: + is_divergent = (instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM)) || + instr->src[1].ssa->divergent; + break; + + case nir_intrinsic_image_load: + case nir_intrinsic_image_deref_load: + case nir_intrinsic_bindless_image_load: + is_divergent = (instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM)) || + instr->src[1].ssa->divergent || instr->src[2].ssa->divergent || instr->src[3].ssa->divergent; + break; + + /* Intrinsics with divergence depending on sources */ case nir_intrinsic_ballot_bitfield_extract: case nir_intrinsic_ballot_find_lsb: @@ -254,8 +268,6 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_quad_swap_vertical: case nir_intrinsic_quad_swap_diagonal: case nir_intrinsic_load_deref: - case nir_intrinsic_load_ubo: - case nir_intrinsic_load_ssbo: case nir_intrinsic_load_shared: case nir_intrinsic_load_global: case nir_intrinsic_load_global_constant: @@ -264,9 +276,6 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) case nir_intrinsic_load_constant: case nir_intrinsic_load_sample_pos_from_id: case nir_intrinsic_load_kernel_input: - case nir_intrinsic_image_load: - case nir_intrinsic_image_deref_load: - case nir_intrinsic_bindless_image_load: case nir_intrinsic_image_samples: case nir_intrinsic_image_deref_samples: case nir_intrinsic_bindless_image_samples: