From 11d9f3348d43e95d5840c6142b4a389d4f42ba1b Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Mon, 20 Aug 2018 23:06:34 -0300 Subject: [PATCH] Avoid gpr overwritting on LD_C instruction --- Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs | 13 ++++++++++--- Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs index e794e1f874..9e7b920ac9 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs @@ -52,19 +52,26 @@ namespace Ryujinx.Graphics.Gal.Shader public static void Ld_C(ShaderIrBlock Block, long OpCode) { - int Type = (int)(OpCode >> 48) & 7; + int Type = (int)(OpCode >> 48) & 7; + int CbufIndex = (int)(OpCode >> 36) & 0x1f; + int CbufPos = (int)(OpCode >> 22) & 0x3fff; if (Type > 5) { throw new InvalidOperationException(); } + ShaderIrOperGpr Temp = ShaderIrOperGpr.MakeTemporary(); + + Block.AddNode(new ShaderIrAsg(Temp, GetOperGpr8(OpCode))); + int Count = Type == 5 ? 2 : 1; for (int Index = 0; Index < Count; Index++) { - ShaderIrOperCbuf OperA = GetOperCbuf36(OpCode); - ShaderIrOperGpr OperD = GetOperGpr0 (OpCode); + ShaderIrOperCbuf OperA = new ShaderIrOperCbuf(CbufIndex, CbufPos, Temp); + + ShaderIrOperGpr OperD = GetOperGpr0(OpCode); OperA.Pos += Index; OperD.Index += Index; diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs b/Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs index 5c69d6a67a..88ac31299c 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs @@ -4,6 +4,8 @@ namespace Ryujinx.Graphics.Gal.Shader { public const int ZRIndex = 0xff; + public static ShaderIrOperGpr MakeTemporary() => new ShaderIrOperGpr(0x100); + public bool IsConst => Index == ZRIndex; public int Index { get; set; }