diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-10-25 17:00:44 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-25 17:00:44 -0300 |
| commit | 49f970d5bd9163e2b4e26a33ef8f84529174d5de (patch) | |
| tree | eceaf9c0454d27413ca77689c06a24b47467d1a0 /Ryujinx.Graphics.Shader/Instructions | |
| parent | 973a615d405a83d5fc2f6a11ad12ba63c2a76465 (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.cs | 33 |
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); |
