Avoid gpr overwritting on LD_C instruction

This commit is contained in:
ReinUsesLisp 2018-08-20 23:06:34 -03:00
parent afdeee2b86
commit 11d9f3348d
2 changed files with 12 additions and 3 deletions

View file

@ -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;

View file

@ -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; }