aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-01-21 22:11:43 -0300
committerThog <me@thog.eu>2020-01-22 02:11:43 +0100
commit532ccf929a5781668f8ae6c0552023909a771128 (patch)
tree47102ca677ff0b05d3068c2dcf4ce94a88840a9e
parentd6b9babe1d73a78e963455a5a6ea3e7431a44ece (diff)
Ignore exit flag on branch delay slot (#899)
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/MethodFirmware.cs12
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Methods.cs2
-rw-r--r--Ryujinx.Graphics.Gpu/MacroInterpreter.cs11
-rw-r--r--Ryujinx.Graphics.Gpu/State/GpuState.cs10
-rw-r--r--Ryujinx.Graphics.Gpu/State/MethodOffset.cs8
5 files changed, 42 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodFirmware.cs b/Ryujinx.Graphics.Gpu/Engine/MethodFirmware.cs
new file mode 100644
index 00000000..25a48af9
--- /dev/null
+++ b/Ryujinx.Graphics.Gpu/Engine/MethodFirmware.cs
@@ -0,0 +1,12 @@
+using Ryujinx.Graphics.Gpu.State;
+
+namespace Ryujinx.Graphics.Gpu.Engine
+{
+ partial class Methods
+ {
+ private void FirmwareCall4(GpuState state, int argument)
+ {
+ state.Write(0xd00, 1);
+ }
+ }
+}
diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
index 823ac878..31769f5a 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs
@@ -83,6 +83,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
state.RegisterCallback(MethodOffset.Report, Report);
+ state.RegisterCallback(MethodOffset.FirmwareCall4, FirmwareCall4);
+
state.RegisterCallback(MethodOffset.UniformBufferUpdateData, 16, UniformBufferUpdate);
state.RegisterCallback(MethodOffset.UniformBufferBindVertex, UniformBufferBindVertex);
diff --git a/Ryujinx.Graphics.Gpu/MacroInterpreter.cs b/Ryujinx.Graphics.Gpu/MacroInterpreter.cs
index c853da73..4287f055 100644
--- a/Ryujinx.Graphics.Gpu/MacroInterpreter.cs
+++ b/Ryujinx.Graphics.Gpu/MacroInterpreter.cs
@@ -58,6 +58,8 @@ namespace Ryujinx.Graphics.Gpu
private int _pipeOp;
+ private bool _ignoreExitFlag;
+
private int _pc;
/// <summary>
@@ -232,12 +234,19 @@ namespace Ryujinx.Graphics.Gpu
{
FetchOpCode(mme);
}
+ else
+ {
+ // The delay slot instruction exit flag should be ignored.
+ _ignoreExitFlag = true;
+ }
return true;
}
}
- bool exit = (_opCode & 0x80) != 0;
+ bool exit = (_opCode & 0x80) != 0 && !_ignoreExitFlag;
+
+ _ignoreExitFlag = false;
return !exit;
}
diff --git a/Ryujinx.Graphics.Gpu/State/GpuState.cs b/Ryujinx.Graphics.Gpu/State/GpuState.cs
index c6052f4a..de09f3e7 100644
--- a/Ryujinx.Graphics.Gpu/State/GpuState.cs
+++ b/Ryujinx.Graphics.Gpu/State/GpuState.cs
@@ -94,6 +94,16 @@ namespace Ryujinx.Graphics.Gpu.State
}
/// <summary>
+ /// Writes data to the GPU register at the given offset.
+ /// </summary>
+ /// <param name="offset">Offset to be written</param>
+ /// <param name="value">Value to be written</param>
+ public void Write(int offset, int value)
+ {
+ _backingMemory[offset] = value;
+ }
+
+ /// <summary>
/// Writes an offset value at the uniform buffer offset register.
/// </summary>
/// <param name="offset">The offset to be written</param>
diff --git a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
index 904cf8ff..a89fc379 100644
--- a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
+++ b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs
@@ -80,6 +80,14 @@ namespace Ryujinx.Graphics.Gpu.State
BlendState = 0x780,
VertexBufferEndAddress = 0x7c0,
ShaderState = 0x800,
+ FirmwareCall0 = 0x8c0,
+ FirmwareCall1 = 0x8c1,
+ FirmwareCall2 = 0x8c2,
+ FirmwareCall3 = 0x8c3,
+ FirmwareCall4 = 0x8c4,
+ FirmwareCall5 = 0x8c5,
+ FirmwareCall6 = 0x8c6,
+ FirmwareCall7 = 0x8c7,
UniformBufferState = 0x8e0,
UniformBufferUpdateData = 0x8e4,
UniformBufferBindVertex = 0x904,