From 7277eb0e6c53a9bf23c9c83e521635c7993e18e2 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 19 Aug 2015 16:19:06 +0200 Subject: [PATCH 1/2] AX-HLE: Call HLE on mailbox write It was done on Update() which was called exactly every 5ms. But the game is allowed to use the DSP more often, eg to generate 48kHz audio. --- Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp | 11 +++-------- Source/Core/Core/HW/DSPHLE/UCodes/AX.h | 3 --- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp index 8c9c65fea1..f3cecfe64e 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp @@ -14,7 +14,6 @@ AXUCode::AXUCode(DSPHLE* dsphle, u32 crc) : UCodeInterface(dsphle, crc) - , m_work_available(false) , m_cmdlist_size(0) { WARN_LOG(DSPHLE, "Instantiating AXUCode: crc=%08x", crc); @@ -609,7 +608,9 @@ void AXUCode::HandleMail(u32 mail) if (next_is_cmdlist) { CopyCmdList(mail, cmdlist_size); - m_work_available = true; + HandleCommandList(); + m_cmdlist_size = 0; + SignalWorkEnd(); } else if (m_upload_setup_in_progress) { @@ -669,12 +670,6 @@ void AXUCode::Update() m_mail_handler.PushMail(DSP_RESUME); DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP); } - else if (m_work_available) - { - HandleCommandList(); - m_cmdlist_size = 0; - SignalWorkEnd(); - } } u32 AXUCode::GetUpdateMs() diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h index 1af79ebb4f..466bbf7b9d 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h @@ -84,9 +84,6 @@ protected: int m_samples_auxB_right[32 * 5]; int m_samples_auxB_surround[32 * 5]; - // This flag is set if there is anything to process. - bool m_work_available; - u16 m_cmdlist[512]; u32 m_cmdlist_size; From 896a02b3a8a635e064c17b1c22c6dbb1ee1e2191 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 19 Aug 2015 15:44:41 +0200 Subject: [PATCH 2/2] DSP HLE: Remove timing informations from ucodes On HLE, we don't emulate the timings on HLE, so there is also no need to setup periods callbacks. --- Source/Core/Core/HW/DSPHLE/DSPHLE.cpp | 6 ++---- Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/AX.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/AXWii.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/CARD.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/GBA.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/INIT.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/ROM.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h | 1 - Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp | 5 ----- Source/Core/Core/HW/DSPHLE/UCodes/Zelda.h | 1 - 16 files changed, 2 insertions(+), 47 deletions(-) diff --git a/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp b/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp index 089f236cf6..78ff5b4c27 100644 --- a/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp +++ b/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp @@ -75,10 +75,8 @@ void DSPHLE::DSP_Update(int cycles) u32 DSPHLE::DSP_UpdateRate() { // AX HLE uses 3ms (Wii) or 5ms (GC) timing period - if (m_pUCode != nullptr) - return (SystemTimers::GetTicksPerSecond() / 1000) * m_pUCode->GetUpdateMs(); - else - return SystemTimers::GetTicksPerSecond() / 1000; + // But to be sure, just update the HLE every ms. + return SystemTimers::GetTicksPerSecond() / 1000; } void DSPHLE::SendMailToDSP(u32 _uMail) diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp index f3cecfe64e..059226d55e 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp @@ -672,11 +672,6 @@ void AXUCode::Update() } } -u32 AXUCode::GetUpdateMs() -{ - return 5; -} - void AXUCode::DoAXState(PointerWrap& p) { p.Do(m_cmdlist); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h index 466bbf7b9d..ce76dc6906 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h @@ -58,7 +58,6 @@ public: void HandleMail(u32 mail) override; void Update() override; void DoState(PointerWrap& p) override; - u32 GetUpdateMs() override; protected: enum MailType diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp index 706f8012db..a3c9731db8 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp @@ -660,11 +660,6 @@ void AXWiiUCode::OutputWMSamples(u32* addresses) } } -u32 AXWiiUCode::GetUpdateMs() -{ - return 3; -} - void AXWiiUCode::DoState(PointerWrap &p) { DoStateShared(p); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.h b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.h index 13a5d3dc41..e952139efd 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.h @@ -11,7 +11,6 @@ class AXWiiUCode : public AXUCode public: AXWiiUCode(DSPHLE *dsphle, u32 crc); virtual ~AXWiiUCode(); - u32 GetUpdateMs() override; void DoState(PointerWrap &p) override; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp index bfcb74cde9..89692f1683 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp @@ -32,11 +32,6 @@ void CARDUCode::Update() } } -u32 CARDUCode::GetUpdateMs() -{ - return SConfig::GetInstance().bWii ? 3 : 5; -} - void CARDUCode::HandleMail(u32 mail) { if (mail == 0xFF000000) // unlock card diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h index 3290af55e2..a3978aeee0 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h @@ -11,7 +11,6 @@ class CARDUCode : public UCodeInterface public: CARDUCode(DSPHLE *dsphle, u32 crc); virtual ~CARDUCode(); - u32 GetUpdateMs() override; void HandleMail(u32 mail) override; void Update() override; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp index 1c6d50674f..20ff8d0b2f 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp @@ -102,11 +102,6 @@ void GBAUCode::Update() } } -u32 GBAUCode::GetUpdateMs() -{ - return SConfig::GetInstance().bWii ? 3 : 5; -} - void GBAUCode::HandleMail(u32 mail) { static bool nextmail_is_mramaddr = false; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h index 751750cce1..f439a37b4f 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h @@ -15,7 +15,6 @@ struct GBAUCode : public UCodeInterface { GBAUCode(DSPHLE *dsphle, u32 crc); virtual ~GBAUCode(); - u32 GetUpdateMs() override; void HandleMail(u32 mail) override; void Update() override; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp index e6be9773bb..932e1d6b87 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp @@ -25,11 +25,6 @@ void INITUCode::Update() { } -u32 INITUCode::GetUpdateMs() -{ - return SConfig::GetInstance().bWii ? 3 : 5; -} - void INITUCode::HandleMail(u32 mail) { } diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h index a0ce30c9f3..716ba2cc54 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h @@ -11,7 +11,6 @@ class INITUCode : public UCodeInterface public: INITUCode(DSPHLE *dsphle, u32 crc); virtual ~INITUCode(); - u32 GetUpdateMs() override; void HandleMail(u32 mail) override; void Update() override; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp index 0d54b6efa0..bcb0a59c47 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp @@ -116,11 +116,6 @@ void ROMUCode::BootUCode() m_dsphle->SetUCode(ector_crc); } -u32 ROMUCode::GetUpdateMs() -{ - return SConfig::GetInstance().bWii ? 3 : 5; -} - void ROMUCode::DoState(PointerWrap &p) { p.Do(m_current_ucode); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.h b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.h index 9a27933da2..41092b1dd0 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.h @@ -11,7 +11,6 @@ class ROMUCode : public UCodeInterface public: ROMUCode(DSPHLE* dsphle, u32 crc); virtual ~ROMUCode(); - u32 GetUpdateMs() override; void HandleMail(u32 mail) override; void Update() override; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h index aabb891a39..eee7bf44e5 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h @@ -77,7 +77,6 @@ public: virtual void HandleMail(u32 mail) = 0; virtual void Update() = 0; - virtual u32 GetUpdateMs() = 0; virtual void DoState(PointerWrap &p) { diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp index efebb44f8b..4c552948da 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.cpp @@ -134,11 +134,6 @@ void ZeldaUCode::Update() } } -u32 ZeldaUCode::GetUpdateMs() -{ - return SConfig::GetInstance().bWii ? 3 : 5; -} - void ZeldaUCode::DoState(PointerWrap &p) { p.Do(m_flags); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.h b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.h index 8f62aaa376..780cc89708 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/Zelda.h @@ -189,7 +189,6 @@ class ZeldaUCode : public UCodeInterface public: ZeldaUCode(DSPHLE *dsphle, u32 crc); virtual ~ZeldaUCode(); - u32 GetUpdateMs() override; void HandleMail(u32 mail) override; void Update() override;