From 9af3a31744db8140ccb17e8e9131c5dc4dc186df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Mon, 30 Jan 2023 15:34:40 +0100 Subject: [PATCH] ac/nir/cull: Alway remove zero-area triangles in face culling. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The face culling algorithm should have been disabled for conservative overestimation because it already (mistakenly) removed some close-to-zero area triangles. Now that the driver disables it in that case, let's always remove zero-area triangles. This only costs +2 SALU instructions. Signed-off-by: Timur Kristóf Reviewed-by: Marek Olšák Part-of: --- src/amd/common/ac_nir_cull.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_nir_cull.c b/src/amd/common/ac_nir_cull.c index 2d4cf2fb51e..1994c73c565 100644 --- a/src/amd/common/ac_nir_cull.c +++ b/src/amd/common/ac_nir_cull.c @@ -64,14 +64,15 @@ cull_face_triangle(nir_builder *b, nir_ssa_def *pos[3][4], const position_w_info det = nir_bcsel(b, w_info->w_reflection, nir_fneg(b, det), det); - nir_ssa_def *front_facing_cw = nir_flt(b, det, nir_imm_float(b, 0.0f)); nir_ssa_def *front_facing_ccw = nir_flt(b, nir_imm_float(b, 0.0f), det); + nir_ssa_def *zero_area = nir_feq(b, nir_imm_float(b, 0.0f), det); nir_ssa_def *ccw = nir_load_cull_ccw_amd(b); - nir_ssa_def *front_facing = nir_bcsel(b, ccw, front_facing_ccw, front_facing_cw); + nir_ssa_def *front_facing = nir_ieq(b, front_facing_ccw, ccw); nir_ssa_def *cull_front = nir_load_cull_front_face_enabled_amd(b); nir_ssa_def *cull_back = nir_load_cull_back_face_enabled_amd(b); nir_ssa_def *face_culled = nir_bcsel(b, front_facing, cull_front, cull_back); + face_culled = nir_ior(b, face_culled, zero_area); /* Don't reject NaN and +/-infinity, these are tricky. * Just trust fixed-function HW to handle these cases correctly.