diff options
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs')
-rw-r--r-- | Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs | 32 |
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) |