aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs
index f28bb6aa..2e2df754 100644
--- a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs
+++ b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs
@@ -2,6 +2,7 @@ using Ryujinx.Graphics.Shader.IntermediateRepresentation;
using Ryujinx.Graphics.Shader.Translation;
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Numerics;
namespace Ryujinx.Graphics.Shader.StructuredIr
@@ -62,7 +63,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
}
else
{
- AddOperation(context, operation, targetLanguage);
+ AddOperation(context, operation, targetLanguage, functions);
}
}
}
@@ -77,7 +78,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
return context.Info;
}
- private static void AddOperation(StructuredProgramContext context, Operation operation, TargetLanguage targetLanguage)
+ private static void AddOperation(StructuredProgramContext context, Operation operation, TargetLanguage targetLanguage, IReadOnlyList<Function> functions)
{
Instruction inst = operation.Inst;
StorageKind storageKind = operation.StorageKind;
@@ -124,14 +125,29 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
// (or at least that's what the Khronos compiler does).
// First one is the function index.
- sources[0] = context.GetOperandOrCbLoad(operation.GetSource(0));
+ Operand funcIndexOperand = operation.GetSource(0);
+ Debug.Assert(funcIndexOperand.Type == OperandType.Constant);
+ int funcIndex = funcIndexOperand.Value;
+
+ sources[0] = new AstOperand(OperandType.Constant, funcIndex);
+
+ int inArgsCount = functions[funcIndex].InArgumentsCount;
// Remaining ones are parameters, copy them to a temp local variable.
for (int index = 1; index < operation.SourcesCount; index++)
{
- AstOperand argTemp = context.NewTemp(FuncParameterType);
- context.AddNode(new AstAssignment(argTemp, context.GetOperandOrCbLoad(operation.GetSource(index))));
- sources[index] = argTemp;
+ IAstNode source = context.GetOperandOrCbLoad(operation.GetSource(index));
+
+ if (index - 1 < inArgsCount)
+ {
+ AstOperand argTemp = context.NewTemp(FuncParameterType);
+ context.AddNode(new AstAssignment(argTemp, source));
+ sources[index] = argTemp;
+ }
+ else
+ {
+ sources[index] = source;
+ }
}
}
else