Fix for ld/str with size > 32

This commit is contained in:
gdkchan 2018-03-23 21:47:50 -03:00
commit 09bfe41ab2
4 changed files with 22 additions and 12 deletions

View file

@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Gal.Shader
private const string GprName = "gpr"; private const string GprName = "gpr";
private string IdentationStr = "\t"; private const string IdentationStr = "\t";
private int GprsCount; private int GprsCount;

View file

@ -2,45 +2,45 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
static class ShaderDecodeHelper static class ShaderDecodeHelper
{ {
public static ShaderIrOper[] GetAluOperANode_A(long OpCode) public static ShaderIrOperAbuf[] GetAluOperANode_A(long OpCode)
{ {
int Abuf = (int)(OpCode >> 20) & 0x3ff; int Abuf = (int)(OpCode >> 20) & 0x3ff;
int Reg = (int)(OpCode >> 39) & 0xff; int Reg = (int)(OpCode >> 39) & 0xff;
int Size = (int)(OpCode >> 47) & 3; 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++) for (int Index = 0; Index <= Size; Index++)
{ {
Opers[Index] = new ShaderIrOperAbuf(Abuf, (Reg + Index) & 0xff); Opers[Index] = new ShaderIrOperAbuf(Abuf, Reg);
} }
return Opers; return Opers;
} }
public static ShaderIrOper GetAluOperANode_R(long OpCode) public static ShaderIrOperReg GetAluOperANode_R(long OpCode)
{ {
return new ShaderIrOperReg((int)(OpCode >> 8) & 0xff); 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); 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); return new ShaderIrOperReg((int)(OpCode >> 39) & 0xff);
} }
public static ShaderIrOper GetAluOperBCNode_C(long OpCode) public static ShaderIrOperCbuf GetAluOperBCNode_C(long OpCode)
{ {
return new ShaderIrOperCbuf( return new ShaderIrOperCbuf(
(int)(OpCode >> 34) & 0x1f, (int)(OpCode >> 34) & 0x1f,
(int)(OpCode >> 20) & 0x3fff); (int)(OpCode >> 20) & 0x3fff);
} }
public static ShaderIrOper GetAluOperDNode(long OpCode) public static ShaderIrOperReg GetAluOperDNode(long OpCode)
{ {
return new ShaderIrOperReg((int)(OpCode >> 0) & 0xff); return new ShaderIrOperReg((int)(OpCode >> 0) & 0xff);
} }

View file

@ -7,10 +7,15 @@ namespace Ryujinx.Graphics.Gal.Shader
public static void Ld_A(ShaderIrBlock Block, long OpCode) public static void Ld_A(ShaderIrBlock Block, long OpCode)
{ {
ShaderIrOper[] Opers = GetAluOperANode_A(OpCode); ShaderIrOper[] Opers = GetAluOperANode_A(OpCode);
ShaderIrOper OperD = GetAluOperDNode(OpCode);
int Index = 0;
foreach (ShaderIrOper OperA in Opers) foreach (ShaderIrOper OperA in Opers)
{ {
ShaderIrOperReg OperD = GetAluOperDNode(OpCode);
OperD.GprIndex += Index++;
Block.AddNode(new ShaderIrNode(OperD, OperA)); Block.AddNode(new ShaderIrNode(OperD, OperA));
} }
} }
@ -18,10 +23,15 @@ namespace Ryujinx.Graphics.Gal.Shader
public static void St_A(ShaderIrBlock Block, long OpCode) public static void St_A(ShaderIrBlock Block, long OpCode)
{ {
ShaderIrOper[] Opers = GetAluOperANode_A(OpCode); ShaderIrOper[] Opers = GetAluOperANode_A(OpCode);
ShaderIrOper OperD = GetAluOperDNode(OpCode);
int Index = 0;
foreach (ShaderIrOper OperA in Opers) foreach (ShaderIrOper OperA in Opers)
{ {
ShaderIrOperReg OperD = GetAluOperDNode(OpCode);
OperD.GprIndex += Index++;
Block.AddNode(new ShaderIrNode(OperA, OperD)); Block.AddNode(new ShaderIrNode(OperA, OperD));
} }
} }

View file

@ -4,7 +4,7 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
public const int ZRIndex = 0xff; public const int ZRIndex = 0xff;
public int GprIndex { get; private set; } public int GprIndex { get; set; }
public ShaderIrOperReg(int GprIndex) public ShaderIrOperReg(int GprIndex)
{ {