Implement SSY/SYNC shader instructions (#382)
* Use a program counter to control shaders' flow * Cleanup * Implement SSY/SYNC * Address feedback * Fixup commentary * Fixup Ssy instruction
This commit is contained in:
parent
7cb6fd8090
commit
42dc925c3d
11 changed files with 313 additions and 268 deletions
|
@ -50,17 +50,29 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
{
|
||||
ShaderIrNode LastNode = Current.GetLastNode();
|
||||
|
||||
ShaderIrOp Op = GetInnermostOp(LastNode);
|
||||
ShaderIrOp InnerOp = GetInnermostOp(LastNode);
|
||||
|
||||
if (Op?.Inst == ShaderIrInst.Bra)
|
||||
if (InnerOp?.Inst == ShaderIrInst.Bra)
|
||||
{
|
||||
int Offset = ((ShaderIrOperImm)Op.OperandA).Value;
|
||||
int Offset = ((ShaderIrOperImm)InnerOp.OperandA).Value;
|
||||
|
||||
long Target = Current.EndPosition + Offset;
|
||||
|
||||
Current.Branch = Enqueue(Target, Current);
|
||||
}
|
||||
|
||||
foreach (ShaderIrNode Node in Current.Nodes)
|
||||
{
|
||||
if (Node is ShaderIrOp CurrOp && CurrOp.Inst == ShaderIrInst.Ssy)
|
||||
{
|
||||
int Offset = ((ShaderIrOperImm)CurrOp.OperandA).Value;
|
||||
|
||||
long Target = Offset;
|
||||
|
||||
Current.Branch = Enqueue(Target, Current);
|
||||
}
|
||||
}
|
||||
|
||||
if (NodeHasNext(LastNode))
|
||||
{
|
||||
Current.Next = Enqueue(Current.EndPosition);
|
||||
|
@ -157,7 +169,7 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
{
|
||||
int Offset = ((int)(OpCode >> 20) << 8) >> 8;
|
||||
|
||||
long Target = Position + Offset;
|
||||
long Target = Position + Offset - Beginning;
|
||||
|
||||
DbgOpCode += " (0x" + Target.ToString("x16") + ")";
|
||||
}
|
||||
|
@ -170,7 +182,7 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
continue;
|
||||
}
|
||||
|
||||
Decode(Block, OpCode);
|
||||
Decode(Block, OpCode, Position);
|
||||
}
|
||||
while (!IsFlowChange(Block.GetLastNode()));
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue