diff --git a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs index 8af40d2028..0ad437e786 100644 --- a/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs +++ b/Ryujinx.Graphics/Gal/Shader/GlslDecompiler.cs @@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Gal.Shader private const string GprName = "gpr"; - private string IdentationStr = "\t"; + private const string IdentationStr = "\t"; private int GprsCount; diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs index 0a01bb2d3c..96452bbdbb 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs @@ -2,45 +2,45 @@ namespace Ryujinx.Graphics.Gal.Shader { static class ShaderDecodeHelper { - public static ShaderIrOper[] GetAluOperANode_A(long OpCode) + public static ShaderIrOperAbuf[] GetAluOperANode_A(long OpCode) { int Abuf = (int)(OpCode >> 20) & 0x3ff; int Reg = (int)(OpCode >> 39) & 0xff; int Size = (int)(OpCode >> 47) & 3; - ShaderIrOper[] Opers = new ShaderIrOper[Size + 1]; + ShaderIrOperAbuf[] Opers = new ShaderIrOperAbuf[Size + 1]; for (int Index = 0; Index <= Size; Index++) { - Opers[Index] = new ShaderIrOperAbuf(Abuf, (Reg + Index) & 0xff); + Opers[Index] = new ShaderIrOperAbuf(Abuf, Reg); } return Opers; } - public static ShaderIrOper GetAluOperANode_R(long OpCode) + public static ShaderIrOperReg GetAluOperANode_R(long OpCode) { return new ShaderIrOperReg((int)(OpCode >> 8) & 0xff); } - public static ShaderIrOper GetAluOperBNode_RR(long OpCode) + public static ShaderIrOperReg GetAluOperBNode_RR(long OpCode) { return new ShaderIrOperReg((int)(OpCode >> 20) & 0xff); } - public static ShaderIrOper GetAluOperBCNode_R(long OpCode) + public static ShaderIrOperReg GetAluOperBCNode_R(long OpCode) { return new ShaderIrOperReg((int)(OpCode >> 39) & 0xff); } - public static ShaderIrOper GetAluOperBCNode_C(long OpCode) + public static ShaderIrOperCbuf GetAluOperBCNode_C(long OpCode) { return new ShaderIrOperCbuf( (int)(OpCode >> 34) & 0x1f, (int)(OpCode >> 20) & 0x3fff); } - public static ShaderIrOper GetAluOperDNode(long OpCode) + public static ShaderIrOperReg GetAluOperDNode(long OpCode) { return new ShaderIrOperReg((int)(OpCode >> 0) & 0xff); } diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs index 7341518c6a..b2f6bf8e8d 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs @@ -7,10 +7,15 @@ namespace Ryujinx.Graphics.Gal.Shader public static void Ld_A(ShaderIrBlock Block, long OpCode) { ShaderIrOper[] Opers = GetAluOperANode_A(OpCode); - ShaderIrOper OperD = GetAluOperDNode(OpCode); + + int Index = 0; foreach (ShaderIrOper OperA in Opers) { + ShaderIrOperReg OperD = GetAluOperDNode(OpCode); + + OperD.GprIndex += Index++; + Block.AddNode(new ShaderIrNode(OperD, OperA)); } } @@ -18,10 +23,15 @@ namespace Ryujinx.Graphics.Gal.Shader public static void St_A(ShaderIrBlock Block, long OpCode) { ShaderIrOper[] Opers = GetAluOperANode_A(OpCode); - ShaderIrOper OperD = GetAluOperDNode(OpCode); + + int Index = 0; foreach (ShaderIrOper OperA in Opers) { + ShaderIrOperReg OperD = GetAluOperDNode(OpCode); + + OperD.GprIndex += Index++; + Block.AddNode(new ShaderIrNode(OperA, OperD)); } } diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderIrOperReg.cs b/Ryujinx.Graphics/Gal/Shader/ShaderIrOperReg.cs index a8db8b0c0f..87c70ca714 100644 --- a/Ryujinx.Graphics/Gal/Shader/ShaderIrOperReg.cs +++ b/Ryujinx.Graphics/Gal/Shader/ShaderIrOperReg.cs @@ -4,7 +4,7 @@ namespace Ryujinx.Graphics.Gal.Shader { public const int ZRIndex = 0xff; - public int GprIndex { get; private set; } + public int GprIndex { get; set; } public ShaderIrOperReg(int GprIndex) {