From deb2dccc7533d4171fe7e9df293a027b5ccb8aa3 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 19 Sep 2022 15:08:52 +0200 Subject: [PATCH] radv: add barycentric_at_sample lowering when the number of samples is dynamic Use two different paths (static vs dynamic) to avoid running more NIR pass to remove dead CF code when static is used. Signed-off-by: Samuel Pitoiset Reviewed-by: Rhys Perry Part-of: --- src/amd/vulkan/radv_nir_lower_abi.c | 7 +++-- src/amd/vulkan/radv_shader.c | 48 +++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/amd/vulkan/radv_nir_lower_abi.c b/src/amd/vulkan/radv_nir_lower_abi.c index e84859108da..2bfaa71f80b 100644 --- a/src/amd/vulkan/radv_nir_lower_abi.c +++ b/src/amd/vulkan/radv_nir_lower_abi.c @@ -263,8 +263,11 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state) nir_ssa_def *offset = nir_ishl_imm(b, sample_id, 3); /* 2 floats containing samplepos.xy */ nir_const_value *const_num_samples = nir_src_as_const_value(intrin->src[1]); - assert(const_num_samples); - sample_pos_offset += (const_num_samples->u32 << 3); + if (const_num_samples) { + sample_pos_offset += (const_num_samples->u32 << 3); + } else { + offset = nir_iadd(b, offset, nir_ishl_imm(b, intrin->src[1].ssa, 3)); + } replacement = nir_load_global_amd(b, 2, 32, addr, offset, .base = sample_pos_offset, .access = ACCESS_NON_WRITEABLE); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index c59cbf3c644..8aecfb94795 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -599,20 +599,44 @@ radv_lower_fs_intrinsics(nir_shader *nir, const struct radv_pipeline_stage *fs_s nir_ssa_def *num_samples = nir_load_rasterization_samples_amd(&b); nir_ssa_def *new_dest; - if (!key->ps.num_samples) { - new_dest = - nir_load_barycentric_pixel(&b, 32, - .interp_mode = nir_intrinsic_interp_mode(intrin)); + if (key->dynamic_rasterization_samples) { + nir_ssa_def *res1, *res2; + + nir_push_if(&b, nir_ieq_imm(&b, num_samples, 1)); + { + res1 = nir_load_barycentric_pixel(&b, 32, + .interp_mode = nir_intrinsic_interp_mode(intrin)); + } + nir_push_else(&b, NULL); + { + nir_ssa_def *sample_pos = + nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples); + + /* sample_pos -= 0.5 */ + sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f)); + + res2 = nir_load_barycentric_at_offset(&b, 32, sample_pos, + .interp_mode = nir_intrinsic_interp_mode(intrin)); + } + nir_pop_if(&b, NULL); + + new_dest = nir_if_phi(&b, res1, res2); } else { - nir_ssa_def *sample_pos = - nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples); + if (!key->ps.num_samples) { + new_dest = + nir_load_barycentric_pixel(&b, 32, + .interp_mode = nir_intrinsic_interp_mode(intrin)); + } else { + nir_ssa_def *sample_pos = + nir_load_sample_positions_amd(&b, 32, intrin->src[0].ssa, num_samples); - /* sample_pos -= 0.5 */ - sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f)); + /* sample_pos -= 0.5 */ + sample_pos = nir_fsub(&b, sample_pos, nir_imm_float(&b, 0.5f)); - new_dest = - nir_load_barycentric_at_offset(&b, 32, sample_pos, - .interp_mode = nir_intrinsic_interp_mode(intrin)); + new_dest = + nir_load_barycentric_at_offset(&b, 32, sample_pos, + .interp_mode = nir_intrinsic_interp_mode(intrin)); + } } nir_ssa_def_rewrite_uses(&intrin->dest.ssa, new_dest); @@ -628,7 +652,7 @@ radv_lower_fs_intrinsics(nir_shader *nir, const struct radv_pipeline_stage *fs_s } if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); + nir_metadata_preserve(impl, 0); else nir_metadata_preserve(impl, nir_metadata_all);