Fix for ld/str with size > 32
This commit is contained in:
parent
7949ceffa5
commit
8ed55be9c5
4 changed files with 22 additions and 12 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue