From ff59f1f58e0fcbab0c32558848f557915d49d338 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Mon, 25 Nov 2024 14:04:48 +0100 Subject: [PATCH] nir/opt_intrinsic: rework sample mask opt with vector alu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Purely theoretical issue, for example gl_SampleMaskIn.xx == 0.xx. Reviewed-by: Marek Olšák Fixes: d3ce8a7f6b9 ("nir: optimize gl_SampleMaskIn to gl_HelperInvocation for radeonsi when possible") Part-of: (cherry picked from commit 22557497ec7d7538268d6250f141a3c8ff59f883) --- .pick_status.json | 2 +- src/compiler/nir/nir_opt_intrinsics.c | 29 +++++++++++++-------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 30fdd900926..5b72f93d2d2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2924,7 +2924,7 @@ "description": "nir/opt_intrinsic: rework sample mask opt with vector alu", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d3ce8a7f6b93e893929b81f4d6605a2a968730a1", "notes": null diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index d333a7070fb..f20a7ac6e0c 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -319,24 +319,23 @@ opt_intrinsics_intrin(nir_builder *b, nir_intrinsic_instr *intrin, if (nir_src_parent_instr(use_src)->type == nir_instr_type_alu) { nir_alu_instr *alu = nir_instr_as_alu(nir_src_parent_instr(use_src)); - if (alu->op == nir_op_ieq || - alu->op == nir_op_ine) { - /* Check for 0 in either operand. */ - nir_const_value *const_val = - nir_src_as_const_value(alu->src[0].src); - if (!const_val) - const_val = nir_src_as_const_value(alu->src[1].src); - if (!const_val || const_val->i32 != 0) - continue; + if ((alu->op != nir_op_ieq && alu->op != nir_op_ine) || alu->def.num_components != 1) + continue; - nir_def *new_expr = nir_load_helper_invocation(b, 1); + nir_alu_src *alu_src = list_entry(use_src, nir_alu_src, src); + unsigned src_index = alu_src - alu->src; + nir_scalar other = nir_scalar_chase_alu_src(nir_get_scalar(&alu->def, 0), !src_index); - if (alu->op == nir_op_ine) - new_expr = nir_inot(b, new_expr); + if (!nir_scalar_is_const(other) || nir_scalar_as_uint(other)) + continue; - nir_def_replace(&alu->def, new_expr); - progress = true; - } + nir_def *new_expr = nir_load_helper_invocation(b, 1); + + if (alu->op == nir_op_ine) + new_expr = nir_inot(b, new_expr); + + nir_def_replace(&alu->def, new_expr); + progress = true; } } return progress;