mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-11-24 17:24:16 +00:00
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
6 changed files with 23 additions and 13 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
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
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue