aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Translation/Transforms/TransformPasses.cs
blob: 7ff3b8bf134de3ae283733ee6395730168e2e65c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
using System.Collections.Generic;

namespace Ryujinx.Graphics.Shader.Translation.Transforms
{
    static class TransformPasses
    {
        public static void RunPass(TransformContext context)
        {
            RunPass<DrawParametersReplace>(context);
            RunPass<ForcePreciseEnable>(context);
            RunPass<VectorComponentSelect>(context);
            RunPass<TexturePass>(context);
            RunPass<SharedStoreSmallIntCas>(context);
            RunPass<SharedAtomicSignedCas>(context);
            RunPass<ShufflePass>(context);
            RunPass<VertexToCompute>(context);
            RunPass<GeometryToCompute>(context);
        }

        private static void RunPass<T>(TransformContext context) where T : ITransformPass
        {
            if (!T.IsEnabled(context.GpuAccessor, context.Stage, context.TargetLanguage, context.UsedFeatures))
            {
                return;
            }

            for (int blkIndex = 0; blkIndex < context.Blocks.Length; blkIndex++)
            {
                BasicBlock block = context.Blocks[blkIndex];

                for (LinkedListNode<INode> node = block.Operations.First; node != null; node = node.Next)
                {
                    if (node.Value is not Operation)
                    {
                        continue;
                    }

                    node = T.RunPass(context, node);
                }
            }
        }
    }
}