From b6ac45d36d8153c5278f2b519eb120cc553a662f Mon Sep 17 00:00:00 2001 From: gdkchan Date: Fri, 6 Oct 2023 00:18:30 -0300 Subject: [PATCH] Fix SPIR-V call out arguments regression (#5767) * Fix SPIR-V call out arguments regression * Shader cache version bump --- .../Shader/DiskCache/DiskCacheHostStorage.cs | 2 +- .../StructuredIr/StructuredProgram.cs | 28 +++++++++++++++---- 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 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