diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2024-06-16 14:46:27 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-16 14:46:27 -0300 |
| commit | 3193ef10833bc0d27e2701c7759ab02674d672d3 (patch) | |
| tree | 8aae569f4943373450d181908f858cf03c0a0b42 /src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs | |
| parent | 5a878ae9afe73d12bd344c139ee1b485335af3ff (diff) | |
Extend bindless elimination to catch a few more specific cases (#6921)
* Catch more cases on bindless elimination
* Match blocks with the same comparison condition
* Shader cache version bump
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs')
| -rw-r--r-- | src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs index a509fcb4..097c8aa8 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs @@ -31,6 +31,10 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations TryEliminateBitwiseOr(operation); break; + case Instruction.CompareNotEqual: + TryEliminateCompareNotEqual(operation); + break; + case Instruction.ConditionalSelect: TryEliminateConditionalSelect(operation); break; @@ -174,6 +178,32 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations } } + private static void TryEliminateCompareNotEqual(Operation operation) + { + // Comparison instruction returns 0 if the result is false, and -1 if true. + // Doing a not equal zero comparison on the result is redundant, so we can just copy the first result in this case. + + Operand lhs = operation.GetSource(0); + Operand rhs = operation.GetSource(1); + + if (lhs.Type == OperandType.Constant) + { + (lhs, rhs) = (rhs, lhs); + } + + if (rhs.Type != OperandType.Constant || rhs.Value != 0) + { + return; + } + + if (lhs.AsgOp is not Operation compareOp || !compareOp.Inst.IsComparison()) + { + return; + } + + operation.TurnIntoCopy(lhs); + } + private static void TryEliminateConditionalSelect(Operation operation) { Operand cond = operation.GetSource(0); |
