aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs
new file mode 100644
index 00000000..52c2a11b
--- /dev/null
+++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs
@@ -0,0 +1,55 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.Graphics.Device;
+using System.Collections.Generic;
+
+namespace Ryujinx.Graphics.Gpu.Engine.MME
+{
+ /// <summary>
+ /// Represents a Macro Just-in-Time compiler execution context.
+ /// </summary>
+ class MacroJitContext
+ {
+ /// <summary>
+ /// Arguments FIFO.
+ /// </summary>
+ public Queue<FifoWord> Fifo { get; } = new Queue<FifoWord>();
+
+ /// <summary>
+ /// Fetches a arguments from the arguments FIFO.
+ /// </summary>
+ /// <returns>The call argument, or 0 if the FIFO is empty</returns>
+ public int FetchParam()
+ {
+ if (!Fifo.TryDequeue(out var value))
+ {
+ Logger.Warning?.Print(LogClass.Gpu, "Macro attempted to fetch an inexistent argument.");
+
+ return 0;
+ }
+
+ return value.Word;
+ }
+
+ /// <summary>
+ /// Reads data from a GPU register.
+ /// </summary>
+ /// <param name="state">Current GPU state</param>
+ /// <param name="reg">Register offset to read</param>
+ /// <returns>GPU register value</returns>
+ public static int Read(IDeviceState state, int reg)
+ {
+ return state.Read(reg * 4);
+ }
+
+ /// <summary>
+ /// Performs a GPU method call.
+ /// </summary>
+ /// <param name="value">Call argument</param>
+ /// <param name="state">Current GPU state</param>
+ /// <param name="methAddr">Address, in words, of the method</param>
+ public static void Send(int value, IDeviceState state, int methAddr)
+ {
+ state.Write(methAddr * 4, value);
+ }
+ }
+}