aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2022-07-24 15:33:30 -0300
committerGitHub <noreply@github.com>2022-07-24 15:33:30 -0300
commit1a888ae0871c5ef590c92b992b87f01f05a19637 (patch)
treee7a05fc5fb4bf55e26d879f95eeb9d5c1de871cc
parent84d0ca56452ef88dc177a83f34418d353b45face (diff)
Add support for conditional (with CC) shader Exit instructions (#3470)1.1.190
* Add support for conditional (with CC) shader Exit instructions * Shader cache version bump * Make CSM conditions default to false for EXIT.CC
-rw-r--r--Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs2
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs19
2 files changed, 16 insertions, 5 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
index 33a87fa5..a47af942 100644
--- a/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs
@@ -21,7 +21,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
private const ushort FileFormatVersionMajor = 1;
private const ushort FileFormatVersionMinor = 1;
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
- private const uint CodeGenVersion = 3472;
+ private const uint CodeGenVersion = 3469;
private const string SharedTocFileName = "shared.toc";
private const string SharedDataFileName = "shared.data";
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs
index 3cb8fe72..aee52c51 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs
@@ -104,12 +104,23 @@ namespace Ryujinx.Graphics.Shader.Instructions
return;
}
- // TODO: Figure out how this is supposed to work in the
- // presence of other condition codes.
if (op.Ccc == Ccc.T)
{
context.Return();
}
+ else
+ {
+ Operand cond = GetCondition(context, op.Ccc, IrConsts.False);
+
+ // If the condition is always false, we don't need to do anything.
+ if (cond.Type != OperandType.Constant || cond.Value != IrConsts.False)
+ {
+ Operand lblSkip = Label();
+ context.BranchIfFalse(lblSkip, cond);
+ context.Return();
+ context.MarkLabel(lblSkip);
+ }
+ }
}
public static void Kil(EmitterContext context)
@@ -250,7 +261,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
}
- private static Operand GetCondition(EmitterContext context, Ccc cond)
+ private static Operand GetCondition(EmitterContext context, Ccc cond, int defaultCond = IrConsts.True)
{
// TODO: More condition codes, figure out how they work.
switch (cond)
@@ -263,7 +274,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
return context.BitwiseNot(GetZF());
}
- return Const(IrConsts.True);
+ return Const(defaultCond);
}
}
} \ No newline at end of file