/ src / Ryujinx.Graphics.Shader / Translation / Transforms / SharedStoreSmallIntCas.cs
SharedStoreSmallIntCas.cs
 1  using Ryujinx.Graphics.Shader.IntermediateRepresentation;
 2  using Ryujinx.Graphics.Shader.Translation.Optimizations;
 3  using System.Collections.Generic;
 4  using System.Diagnostics;
 5  
 6  using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
 7  
 8  namespace Ryujinx.Graphics.Shader.Translation.Transforms
 9  {
10      class SharedStoreSmallIntCas : ITransformPass
11      {
12          public static bool IsEnabled(IGpuAccessor gpuAccessor, ShaderStage stage, TargetLanguage targetLanguage, FeatureFlags usedFeatures)
13          {
14              return stage == ShaderStage.Compute && usedFeatures.HasFlag(FeatureFlags.SharedMemory);
15          }
16  
17          public static LinkedListNode<INode> RunPass(TransformContext context, LinkedListNode<INode> node)
18          {
19              Operation operation = (Operation)node.Value;
20              HelperFunctionName name;
21  
22              if (operation.StorageKind == StorageKind.SharedMemory8)
23              {
24                  name = HelperFunctionName.SharedStore8;
25              }
26              else if (operation.StorageKind == StorageKind.SharedMemory16)
27              {
28                  name = HelperFunctionName.SharedStore16;
29              }
30              else
31              {
32                  return node;
33              }
34  
35              if (operation.Inst != Instruction.Store)
36              {
37                  return node;
38              }
39  
40              Operand memoryId = operation.GetSource(0);
41              Operand byteOffset = operation.GetSource(1);
42              Operand value = operation.GetSource(2);
43  
44              Debug.Assert(memoryId.Type == OperandType.Constant);
45  
46              int functionId = context.Hfm.GetOrCreateFunctionId(name, memoryId.Value);
47  
48              Operand[] callArgs = new Operand[] { Const(functionId), byteOffset, value };
49  
50              LinkedListNode<INode> newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, (Operand)null, callArgs));
51  
52              Utils.DeleteNode(node, operation);
53  
54              return newNode;
55          }
56      }
57  }