aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs')
-rw-r--r--Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs32
1 files changed, 11 insertions, 21 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
index 61b1544f..ec8d8015 100644
--- a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
+++ b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
@@ -10,11 +10,22 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
{
public static void RunPass(BasicBlock[] blocks, ShaderConfig config)
{
+ RunOptimizationPasses(blocks);
+
+ // Those passes are looking for specific patterns and only needs to run once.
for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++)
{
GlobalToStorage.RunPass(blocks[blkIndex], config);
+ BindlessToIndexed.RunPass(blocks[blkIndex]);
+ BindlessElimination.RunPass(blocks[blkIndex], config);
}
+ // Run optimizations one last time to remove any code that is now optimizable after above passes.
+ RunOptimizationPasses(blocks);
+ }
+
+ private static void RunOptimizationPasses(BasicBlock[] blocks)
+ {
bool modified;
do
@@ -85,27 +96,6 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
}
}
while (modified);
-
- for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++)
- {
- BindlessToIndexed.RunPass(blocks[blkIndex]);
- BindlessElimination.RunPass(blocks[blkIndex], config);
-
- // Try to eliminate any operations that are now unused.
- LinkedListNode<INode> node = blocks[blkIndex].Operations.First;
-
- while (node != null)
- {
- LinkedListNode<INode> nextNode = node.Next;
-
- if (IsUnused(node.Value))
- {
- RemoveNode(blocks[blkIndex], node);
- }
-
- node = nextNode;
- }
- }
}
private static void PropagateCopy(Operation copyOp)