Support conditional on BRK and SYNC shader instructions (#1878)

* Support conditional on BRK and SYNC shader instructions

* Add TODO comment and bump cache version
This commit is contained in:
gdkchan 2021-01-08 22:55:55 -03:00 committed by GitHub
parent a9cb31e75f
commit b9200dd734
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 23 additions and 13 deletions

View file

@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <summary>
/// Version of the codegen (to be changed when codegen or guest format change).
/// </summary>
private const ulong ShaderCodeGenVersion = 1759;
private const ulong ShaderCodeGenVersion = 1878;
/// <summary>
/// Creates a new instance of the shader cache.

View file

@ -2,10 +2,8 @@ using Ryujinx.Graphics.Shader.Instructions;
namespace Ryujinx.Graphics.Shader.Decoders
{
class OpCodeBranch : OpCode
class OpCodeBranch : OpCodeConditional
{
public Condition Condition { get; }
public int Offset { get; }
public bool PushTarget { get; protected set; }
@ -14,8 +12,6 @@ namespace Ryujinx.Graphics.Shader.Decoders
public OpCodeBranch(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
{
Condition = (Condition)(opCode & 0x1f);
Offset = ((int)(opCode >> 20) << 8) >> 8;
PushTarget = false;

View file

@ -3,7 +3,7 @@ using System.Collections.Generic;
namespace Ryujinx.Graphics.Shader.Decoders
{
class OpCodeBranchPop : OpCode
class OpCodeBranchPop : OpCodeConditional
{
public Dictionary<OpCodePush, int> Targets { get; }

View file

@ -0,0 +1,16 @@
using Ryujinx.Graphics.Shader.Instructions;
namespace Ryujinx.Graphics.Shader.Decoders
{
class OpCodeConditional : OpCode
{
public Condition Condition { get; }
public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode);
public OpCodeConditional(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
{
Condition = (Condition)opCode.Extract(0, 5);
}
}
}

View file

@ -2,15 +2,12 @@ using Ryujinx.Graphics.Shader.Instructions;
namespace Ryujinx.Graphics.Shader.Decoders
{
class OpCodeExit : OpCode
class OpCodeExit : OpCodeConditional
{
public Condition Condition { get; }
public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode);
public OpCodeExit(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
{
Condition = (Condition)opCode.Extract(0, 5);
}
}
}

View file

@ -146,6 +146,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
else
{
// TODO: Support CC here aswell (condition).
foreach (KeyValuePair<OpCodePush, int> kv in op.Targets)
{
OpCodePush pushOp = kv.Key;
@ -176,9 +177,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
Operand pred = Register(op.Predicate);
if (op is OpCodeBranch opBranch && opBranch.Condition != Condition.Always)
if (op is OpCodeConditional opCond && opCond.Condition != Condition.Always)
{
Operand cond = GetCondition(context, opBranch.Condition);
Operand cond = GetCondition(context, opCond.Condition);
if (op.Predicate.IsPT)
{