From 66153f7bfe8373d26e779120650c75865712bb8a Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 26 Mar 2024 11:18:20 +0000 Subject: [PATCH] aco: always emit float mode for merged shaders compiled separately We don't know what the float mode was by the end of the previous shader, so we should always set it. Signed-off-by: Rhys Perry Reviewed-by: Georg Lehmann Part-of: --- src/amd/compiler/aco_lower_to_hw_instr.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/amd/compiler/aco_lower_to_hw_instr.cpp b/src/amd/compiler/aco_lower_to_hw_instr.cpp index 431d0b0fae9..45cf78e7a7b 100644 --- a/src/amd/compiler/aco_lower_to_hw_instr.cpp +++ b/src/amd/compiler/aco_lower_to_hw_instr.cpp @@ -2164,13 +2164,17 @@ emit_set_mode(Builder& bld, float_mode new_mode, bool set_round, bool set_denorm } void -emit_set_mode_from_block(Builder& bld, Program& program, Block* block, bool always_set) +emit_set_mode_from_block(Builder& bld, Program& program, Block* block) { - float_mode config_mode; - config_mode.val = program.config->float_mode; + float_mode initial; + initial.val = program.config->float_mode; - bool set_round = always_set && block->fp_mode.round != config_mode.round; - bool set_denorm = always_set && block->fp_mode.denorm != config_mode.denorm; + bool inital_unknown = + (program.info.merged_shader_compiled_separately && program.stage.sw == SWStage::GS) || + (program.info.merged_shader_compiled_separately && program.stage.sw == SWStage::TCS); + bool is_start = block->index == 0; + bool set_round = is_start && (inital_unknown || block->fp_mode.round != initial.round); + bool set_denorm = is_start && (inital_unknown || block->fp_mode.denorm != initial.denorm); if (block->kind & block_kind_top_level) { for (unsigned pred : block->linear_preds) { if (program.blocks[pred].fp_mode.round != block->fp_mode.round) @@ -2299,7 +2303,7 @@ lower_to_hw_instr(Program* program) ctx.instructions.reserve(block->instructions.size()); Builder bld(program, &ctx.instructions); - emit_set_mode_from_block(bld, *program, block, (block_idx == 0)); + emit_set_mode_from_block(bld, *program, block); for (size_t instr_idx = 0; instr_idx < block->instructions.size(); instr_idx++) { aco_ptr& instr = block->instructions[instr_idx];