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