aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-10-06 00:18:30 -0300
committerGitHub <noreply@github.com>2023-10-06 00:18:30 -0300
commitb6ac45d36d8153c5278f2b519eb120cc553a662f (patch)
treec0f478a5c1e46dfb9cb9e90c0d3041b89e7a9425
parent7afae8c69947f7a5fa9a55cee36381aef372dfba (diff)
Fix SPIR-V call out arguments regression (#5767)1.1.1045
* Fix SPIR-V call out arguments regression * Shader cache version bump
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs2
-rw-r--r--src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs28
2 files changed, 23 insertions, 7 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
index 19601d18..0f1aa6a9 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
private const ushort FileFormatVersionMajor = 1;
private const ushort FileFormatVersionMinor = 2;
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
- private const uint CodeGenVersion = 5764;
+ private const uint CodeGenVersion = 5767;
private const string SharedTocFileName = "shared.toc";
private const string SharedDataFileName = "shared.data";
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