summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-03-22 01:56:27 +0100
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:24 +0200
commit2be5c7eff40647344da7951dc5e20a7deebf78aa (patch)
tree50a0ba9e2b1cedccfceadf6b73f4b14743a33a60
parentshader: Better but still partial interpolation support (diff)
downloadyuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar.gz
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar.bz2
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar.lz
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar.xz
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.tar.zst
yuzu-2be5c7eff40647344da7951dc5e20a7deebf78aa.zip
-rw-r--r--src/shader_recompiler/ir_opt/constant_propagation_pass.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
index ef7766d22..3dab424f6 100644
--- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
+++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
@@ -236,6 +236,38 @@ void FoldSelect(IR::Inst& inst) {
}
}
+void FoldFPMul32(IR::Inst& inst) {
+ const auto control{inst.Flags<IR::FpControl>()};
+ if (control.no_contraction) {
+ return;
+ }
+ // Fold interpolation operations
+ const IR::Value lhs_value{inst.Arg(0)};
+ const IR::Value rhs_value{inst.Arg(1)};
+ if (lhs_value.IsImmediate() || rhs_value.IsImmediate()) {
+ return;
+ }
+ IR::Inst* const lhs_op{lhs_value.InstRecursive()};
+ IR::Inst* const rhs_op{rhs_value.InstRecursive()};
+ if (lhs_op->Opcode() != IR::Opcode::FPMul32 || rhs_op->Opcode() != IR::Opcode::FPRecip32) {
+ return;
+ }
+ const IR::Value recip_source{rhs_op->Arg(0)};
+ const IR::Value lhs_mul_source{lhs_op->Arg(1).Resolve()};
+ if (recip_source.IsImmediate() || lhs_mul_source.IsImmediate()) {
+ return;
+ }
+ IR::Inst* const attr_a{recip_source.InstRecursive()};
+ IR::Inst* const attr_b{lhs_mul_source.InstRecursive()};
+ if (attr_a->Opcode() != IR::Opcode::GetAttribute ||
+ attr_b->Opcode() != IR::Opcode::GetAttribute) {
+ return;
+ }
+ if (attr_a->Arg(0).Attribute() == attr_b->Arg(0).Attribute()) {
+ inst.ReplaceUsesWith(lhs_op->Arg(0));
+ }
+}
+
void FoldLogicalAnd(IR::Inst& inst) {
if (!FoldCommutative<bool>(inst, [](bool a, bool b) { return a && b; })) {
return;
@@ -348,6 +380,8 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
case IR::Opcode::SelectF32:
case IR::Opcode::SelectF64:
return FoldSelect(inst);
+ case IR::Opcode::FPMul32:
+ return FoldFPMul32(inst);
case IR::Opcode::LogicalAnd:
return FoldLogicalAnd(inst);
case IR::Opcode::LogicalOr: