diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index d28d73620b..40f6d18c50 100644
--- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
///
/// Version of the codegen (to be changed when codegen or guest format change).
///
- private const ulong ShaderCodeGenVersion = 1759;
+ private const ulong ShaderCodeGenVersion = 1878;
///
/// Creates a new instance of the shader cache.
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs
index 71cb9bca9c..9ca437b370 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs
@@ -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;
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs
index f6c3e4f46a..318048709e 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
namespace Ryujinx.Graphics.Shader.Decoders
{
- class OpCodeBranchPop : OpCode
+ class OpCodeBranchPop : OpCodeConditional
{
public Dictionary Targets { get; }
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs
new file mode 100644
index 0000000000..f9110707f8
--- /dev/null
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs
@@ -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);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs
index caad26a3a5..f63d5d1166 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs
@@ -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);
}
}
}
\ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
index 332074ae2d..d4ab5955f6 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
@@ -146,6 +146,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
else
{
+ // TODO: Support CC here aswell (condition).
foreach (KeyValuePair 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)
{