aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs
index 4ca6d687..a0d58d07 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs
@@ -4,6 +4,35 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
{
static class Utils
{
+ public static bool IsInputLoad(INode node)
+ {
+ return (node is Operation operation) &&
+ operation.Inst == Instruction.Load &&
+ operation.StorageKind == StorageKind.Input;
+ }
+
+ public static bool IsInputLoad(INode node, IoVariable ioVariable, int elemIndex)
+ {
+ if (!(node is Operation operation) ||
+ operation.Inst != Instruction.Load ||
+ operation.StorageKind != StorageKind.Input ||
+ operation.SourcesCount != 2)
+ {
+ return false;
+ }
+
+ Operand ioVariableSrc = operation.GetSource(0);
+
+ if (ioVariableSrc.Type != OperandType.Constant || (IoVariable)ioVariableSrc.Value != ioVariable)
+ {
+ return false;
+ }
+
+ Operand elemIndexSrc = operation.GetSource(1);
+
+ return elemIndexSrc.Type == OperandType.Constant && elemIndexSrc.Value == elemIndex;
+ }
+
private static Operation FindBranchSource(BasicBlock block)
{
foreach (BasicBlock sourceBlock in block.Predecessors)