diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2021-01-27 20:59:47 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-28 10:59:47 +1100 |
| commit | 4b7c7dab9e33faaf4eb58342f1f7ad8ada354591 (patch) | |
| tree | d912e9e3434fb3ba53afad5fee216eadde731cc6 /Ryujinx.Graphics.Shader/Translation/Optimizations | |
| parent | dcce4070719a3798bb96d3aa02b9ba02a7fecc16 (diff) | |
Support multiple destination operands on shader IR and shuffle predicates (#1964)
* Support multiple destination operands on shader IR and shuffle predicates
* Cache version change
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/Optimizations')
| -rw-r--r-- | Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs index 32c7d2f0..9a0815c3 100644 --- a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs +++ b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs @@ -64,7 +64,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations else if ((operation.Inst == Instruction.PackHalf2x16 && PropagatePack(operation)) || (operation.Inst == Instruction.ShuffleXor && MatchDdxOrDdy(operation))) { - if (operation.Dest.UseOps.Count == 0) + if (DestHasNoUses(operation)) { RemoveNode(block, node); } @@ -260,6 +260,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations if (src.UseOps.Remove(node) && src.UseOps.Count == 0) { + Debug.Assert(src.AsgOp != null); nodes.Enqueue(src.AsgOp); } } @@ -268,7 +269,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations private static bool IsUnused(INode node) { - return !HasSideEffects(node) && DestIsLocalVar(node) && node.Dest.UseOps.Count == 0; + return !HasSideEffects(node) && DestIsLocalVar(node) && DestHasNoUses(node); } private static bool HasSideEffects(INode node) @@ -298,7 +299,33 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations private static bool DestIsLocalVar(INode node) { - return node.Dest != null && node.Dest.Type == OperandType.LocalVariable; + if (node.DestsCount == 0) + { + return false; + } + + for (int index = 0; index < node.DestsCount; index++) + { + if (node.GetDest(index).Type != OperandType.LocalVariable) + { + return false; + } + } + + return true; + } + + private static bool DestHasNoUses(INode node) + { + for (int index = 0; index < node.DestsCount; index++) + { + if (node.GetDest(index).UseOps.Count != 0) + { + return false; + } + } + + return true; } } }
\ No newline at end of file |
