aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-04-18 07:31:39 -0300
committerGitHub <noreply@github.com>2021-04-18 12:31:39 +0200
commit40e276c9b554630d14b043cb18804a4a72e4763f (patch)
treea13b34f927ad3990319b0fa7d5add38cb1774eef /Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs
parent77199093978153d519d52264f9ef8b40b0592d0f (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.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)