diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-01-21 22:11:43 -0300 |
|---|---|---|
| committer | Thog <me@thog.eu> | 2020-01-22 02:11:43 +0100 |
| commit | 532ccf929a5781668f8ae6c0552023909a771128 (patch) | |
| tree | 47102ca677ff0b05d3068c2dcf4ce94a88840a9e | |
| parent | d6b9babe1d73a78e963455a5a6ea3e7431a44ece (diff) | |
Ignore exit flag on branch delay slot (#899)
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/MethodFirmware.cs | 12 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Methods.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/MacroInterpreter.cs | 11 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/State/GpuState.cs | 10 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/State/MethodOffset.cs | 8 |
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, |
