aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Instructions
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-10-25 17:00:44 -0300
committerGitHub <noreply@github.com>2020-10-25 17:00:44 -0300
commit49f970d5bd9163e2b4e26a33ef8f84529174d5de (patch)
treeeceaf9c0454d27413ca77689c06a24b47467d1a0 /Ryujinx.Graphics.Shader/Instructions
parent973a615d405a83d5fc2f6a11ad12ba63c2a76465 (diff)
Implement CAL and RET shader instructions (#1618)
* Add support for CAL and RET shader instructions * Remove unused stuff * Fix a bug that could cause the wrong values to be passed to a function * Avoid repopulating function id dictionary every time * PR feedback * Fix vertex shader A/B merge
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions')
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs33
1 files changed, 31 insertions, 2 deletions
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
index e34f2988..332074ae 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs
@@ -51,10 +51,25 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
}
- public static void Depbar(EmitterContext context) { }
+ public static void Cal(EmitterContext context)
+ {
+ OpCodeBranch op = (OpCodeBranch)context.CurrOp;
+
+ context.Call(context.GetFunctionId(op.GetAbsoluteAddress()), false);
+ }
+
+ public static void Depbar(EmitterContext context)
+ {
+ }
public static void Exit(EmitterContext context)
{
+ if (context.IsNonMain)
+ {
+ context.Config.GpuAccessor.Log("Invalid exit on non-main function.");
+ return;
+ }
+
OpCodeExit op = (OpCodeExit)context.CurrOp;
// TODO: Figure out how this is supposed to work in the
@@ -70,13 +85,27 @@ namespace Ryujinx.Graphics.Shader.Instructions
context.Discard();
}
- public static void Nop(EmitterContext context) { }
+ public static void Nop(EmitterContext context)
+ {
+ }
public static void Pbk(EmitterContext context)
{
EmitPbkOrSsy(context);
}
+ public static void Ret(EmitterContext context)
+ {
+ if (context.IsNonMain)
+ {
+ context.Return();
+ }
+ else
+ {
+ context.Config.GpuAccessor.Log("Invalid return on main function.");
+ }
+ }
+
public static void Ssy(EmitterContext context)
{
EmitPbkOrSsy(context);