From 00a1f351e92ceceb153e072f548cfff6cea19dc8 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Fri, 1 Feb 2013 20:53:05 -0600 Subject: [PATCH] Delay IPC replies directly caused by requests by 150th of a second. Fixes everything. --- Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp | 17 ++++++++++++++--- Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp index 6aae2fe4e5..7dca728f0f 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp @@ -58,6 +58,8 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC #include "../HW/WII_IPC.h" #include "../Debugger/Debugger_SymbolMap.h" #include "../PowerPC/PowerPC.h" +#include "../HW/SystemTimers.h" +#include "CoreTiming.h" namespace WII_IPC_HLE_Interface @@ -80,8 +82,17 @@ typedef std::deque ipc_msg_queue; static ipc_msg_queue request_queue; // ppc -> arm static ipc_msg_queue reply_queue; // arm -> ppc +static int enque_reply; + +void EnqueReplyCallback(u64 userdata, int) +{ + reply_queue.push_back(userdata); +} + void Init() { + enque_reply = CoreTiming::RegisterEvent("IPCReply", EnqueReplyCallback); + _dbg_assert_msg_(WII_IPC_HLE, g_DeviceMap.empty(), "DeviceMap isnt empty on init"); CWII_IPC_HLE_Device_es::m_ContentFile = ""; u32 i; @@ -504,7 +515,7 @@ void ExecuteCommand(u32 _Address) if (CmdSuccess) { // Generate a reply to the IPC command - EnqReply(_Address); + EnqReply(_Address, SystemTimers::GetTicksPerSecond() / 150); } else { @@ -526,9 +537,9 @@ void EnqRequest(u32 _Address) } // Called when IOS module has some reply -void EnqReply(u32 _Address) +void EnqReply(u32 _Address, int cycles_in_future) { - reply_queue.push_back(_Address); + CoreTiming::ScheduleEvent(cycles_in_future, enque_reply, _Address); } // This is called every IPC_HLE_PERIOD from SystemTimers.cpp diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h index 2e056b5bec..65244836cc 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.h @@ -62,7 +62,7 @@ void UpdateDevices(); void ExecuteCommand(u32 _Address); void EnqRequest(u32 _Address); -void EnqReply(u32 _Address); +void EnqReply(u32 _Address, int cycles_in_future = 0); enum ECommandType {