Avoid gpr overwritting on LD_C instruction
This commit is contained in:
parent
afdeee2b86
commit
11d9f3348d
2 changed files with 12 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Add table
Reference in a new issue