From 0b4014d6658b17e18a823c1547480959fd10fe70 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 24 Jan 2026 22:14:00 +0800 Subject: [PATCH] [Feat] (MG_Util/ShaderTranspiler): patch op `OpFOrdNotEqual`/`OpFUnordNotEqual` --- .../FloatEqualsZeroEliminationPass.cpp | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/FloatEqualsZeroEliminationPass.cpp b/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/FloatEqualsZeroEliminationPass.cpp index c454652a..d0f79cdc 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/FloatEqualsZeroEliminationPass.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/FloatEqualsZeroEliminationPass.cpp @@ -42,12 +42,25 @@ namespace MobileGL { for (auto itInst = bb.begin(); itInst != bb.end(); ++itInst) { auto& inst = *itInst; - // Check if opcode is `OpFOrdEqual` or `OpFUnordEqual` - if (inst.opcode() != spv::Op::OpFOrdEqual && - inst.opcode() != spv::Op::OpFUnordEqual) { - continue; + bool shouldSkip = true; + + // Check if opcode is `OpFOrdEqual`, `OpFUnordEqual`, + // `OpFOrdNotEqual` or `OpFUnordNotEqual`, + // simply skip if irrelevant + switch (inst.opcode()) { + case spv::Op::OpFOrdEqual: + case spv::Op::OpFUnordEqual: + case spv::Op::OpFOrdNotEqual: + case spv::Op::OpFUnordNotEqual: + shouldSkip = false; + break; + default: + break; } + if (shouldSkip) + continue; + // check if operand is "float 0.0" // OpFOrdEqual ResultType ResultID Operand1 Operand2 uint32_t op1_id = inst.GetSingleWordInOperand(0); @@ -114,9 +127,10 @@ namespace MobileGL { less_operands.push_back({spv_operand_type_t::SPV_OPERAND_TYPE_ID, {abs_inst->result_id()}}); less_operands.push_back({spv_operand_type_t::SPV_OPERAND_TYPE_ID, {eps_id}}); + bool isEqualOp = (inst.opcode() == spv::Op::OpFOrdEqual || inst.opcode() == spv::Op::OpFUnordEqual); Instruction* less_than_inst = builder.AddInstruction(MakeUnique( context(), - spv::Op::OpFOrdLessThan, + isEqualOp ? spv::Op::OpFOrdLessThan : spv::Op::OpFOrdGreaterThanEqual, bool_type_id, context()->TakeNextId(), less_operands