From f097247dd831da9b6e48baebc8b91efec3afcd28 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Samuel=20Iglesias=20Gons=C3=A1lvez?= Date: Wed, 12 Dec 2018 16:29:13 +0100 Subject: [PATCH] nir/algebraic: disable inexact optimizations depending on float controls execution mode MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If FLOAT_CONTROLS_SIGNED_ZERO_INF_NAN_PRESERVE or FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO are enabled, do not apply the inexact optimizations so the VK_KHR_shader_float_controls execution mode is respected. v2: - Do not apply inexact optimizations if SHADER_DENORM_FLUSH_TO_ZERO is enabled (Andres). v3: - Updated to renamed shader info member (Andres). v4: - Directly access execution mode instead of dragging it by parameter (Caio). Signed-off-by: Samuel Iglesias Gonsálvez Signed-off-by: Andres Gomez Reviewed-by: Connor Abbott [v1] --- src/compiler/nir/nir_algebraic.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py index 3b136f800d4..783d0b69285 100644 --- a/src/compiler/nir/nir_algebraic.py +++ b/src/compiler/nir/nir_algebraic.py @@ -1158,6 +1158,7 @@ ${pass_name}_block(nir_builder *build, nir_block *block, const uint16_t *states, const bool *condition_flags) { bool progress = false; + const unsigned execution_mode = build->shader->info.float_controls_execution_mode; nir_foreach_instr_reverse_safe(instr, block) { if (instr->type != nir_instr_type_alu) @@ -1167,6 +1168,7 @@ ${pass_name}_block(nir_builder *build, nir_block *block, if (!alu->dest.dest.is_ssa) continue; + unsigned bit_size = alu->dest.dest.ssa.bit_size; switch (states[alu->dest.dest.ssa.index]) { % for i in range(len(automaton.state_patterns)): case ${i}: @@ -1174,6 +1176,9 @@ ${pass_name}_block(nir_builder *build, nir_block *block, for (unsigned i = 0; i < ARRAY_SIZE(${pass_name}_state${i}_xforms); i++) { const struct transform *xform = &${pass_name}_state${i}_xforms[i]; if (condition_flags[xform->condition_offset] && + !(xform->search->inexact && + (nir_is_float_control_signed_zero_inf_nan_preserve(execution_mode, bit_size) || + nir_is_denorm_flush_to_zero(execution_mode, bit_size))) && nir_replace_instr(build, alu, xform->search, xform->replace)) { progress = true; break; -- 2.30.2