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> /// <summary>
/// Version of the codegen (to be changed when codegen or guest format change). /// Version of the codegen (to be changed when codegen or guest format change).
/// </summary> /// </summary>
private const ulong ShaderCodeGenVersion = 1759; private const ulong ShaderCodeGenVersion = 1878;
/// <summary> /// <summary>
/// Creates a new instance of the shader cache. /// Creates a new instance of the shader cache.

View File

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

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
namespace Ryujinx.Graphics.Shader.Decoders namespace Ryujinx.Graphics.Shader.Decoders
{ {
class OpCodeBranchPop : OpCode class OpCodeBranchPop : OpCodeConditional
{ {
public Dictionary<OpCodePush, int> Targets { get; } 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 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 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) 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 else
{ {
// TODO: Support CC here aswell (condition).
foreach (KeyValuePair<OpCodePush, int> kv in op.Targets) foreach (KeyValuePair<OpCodePush, int> kv in op.Targets)
{ {
OpCodePush pushOp = kv.Key; OpCodePush pushOp = kv.Key;
@ -176,9 +177,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
Operand pred = Register(op.Predicate); 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) if (op.Predicate.IsPT)
{ {