diff options
author | gdkchan <gab.dark.100@gmail.com> | 2021-04-18 07:31:39 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-18 12:31:39 +0200 |
commit | 40e276c9b554630d14b043cb18804a4a72e4763f (patch) | |
tree | a13b34f927ad3990319b0fa7d5add38cb1774eef /Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs | |
parent | 77199093978153d519d52264f9ef8b40b0592d0f (diff) |
Improve shader global memory to storage pass (#2200)
* Improve shader global memory to storage pass
* Formatting and more comments
* Shader cache version bump
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) |