From f1f2c931a7df689027c4886da455fd78d5e25f94 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 9 Aug 2022 21:47:11 +0800 Subject: [PATCH] ac/nir/cull: support caller react when primitive is rejected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make accept_func optional, and return accpect result for caller react when primitive is rejected. This is for GS culling. Acked-by: Marek Olšák Reviewed-by: Timur Kristóf Signed-off-by: Qiang Yu Part-of: --- src/amd/common/ac_nir.h | 2 +- src/amd/common/ac_nir_cull.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/amd/common/ac_nir.h b/src/amd/common/ac_nir.h index bee4ca8410a..f6a9c9bd56b 100644 --- a/src/amd/common/ac_nir.h +++ b/src/amd/common/ac_nir.h @@ -161,7 +161,7 @@ ac_nir_lower_mesh_inputs_to_mem(nir_shader *shader, unsigned task_payload_entry_bytes, unsigned task_num_entries); -void +nir_ssa_def * ac_nir_cull_triangle(nir_builder *b, nir_ssa_def *initially_accepted, nir_ssa_def *pos[3][4], diff --git a/src/amd/common/ac_nir_cull.c b/src/amd/common/ac_nir_cull.c index ed52029c4b6..bdb3be7a097 100644 --- a/src/amd/common/ac_nir_cull.c +++ b/src/amd/common/ac_nir_cull.c @@ -137,7 +137,7 @@ cull_small_primitive(nir_builder *b, nir_ssa_def *bbox_min[3], nir_ssa_def *bbox return nir_if_phi(b, prim_is_small, prim_is_small_else); } -void +nir_ssa_def * ac_nir_cull_triangle(nir_builder *b, nir_ssa_def *initially_accepted, nir_ssa_def *pos[3][4], @@ -151,6 +151,8 @@ ac_nir_cull_triangle(nir_builder *b, accepted = nir_iand(b, accepted, nir_inot(b, w_info.all_w_negative)); accepted = nir_iand(b, accepted, nir_inot(b, cull_face(b, pos, &w_info))); + nir_ssa_def *bbox_accepted = NULL; + nir_if *if_accepted = nir_push_if(b, accepted); { nir_ssa_def *bbox_min[3] = {0}, *bbox_max[3] = {0}; @@ -159,12 +161,18 @@ ac_nir_cull_triangle(nir_builder *b, nir_ssa_def *prim_outside_view = cull_frustrum(b, bbox_min, bbox_max); nir_ssa_def *prim_invisible = cull_small_primitive(b, bbox_min, bbox_max, prim_outside_view); - accepted = nir_ior(b, nir_inot(b, prim_invisible), w_info.any_w_negative); - nir_if *if_still_accepted = nir_push_if(b, accepted); - { - accept_func(b, state); + bbox_accepted = nir_ior(b, nir_inot(b, prim_invisible), w_info.any_w_negative); + + /* for caller which need to react when primitive is accepted */ + if (accept_func) { + nir_if *if_still_accepted = nir_push_if(b, bbox_accepted); + { + accept_func(b, state); + } + nir_pop_if(b, if_still_accepted); } - nir_pop_if(b, if_still_accepted); } nir_pop_if(b, if_accepted); + + return nir_if_phi(b, bbox_accepted, accepted); }