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:
parent
a9cb31e75f
commit
b9200dd734
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
||||
|
16
Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs
Normal file
16
Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user