mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #11301 from AdmiralCurtiss/globals-coretiming
CoreTiming: Move variables to Core::System.
This commit is contained in:
+165
-100
File diff suppressed because it is too large
Load Diff
@@ -16,7 +16,9 @@
|
||||
// inside callback:
|
||||
// ScheduleEvent(periodInCycles - cyclesLate, callback, "whatever")
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
class PointerWrap;
|
||||
@@ -28,6 +30,23 @@ class System;
|
||||
|
||||
namespace CoreTiming
|
||||
{
|
||||
class CoreTimingState
|
||||
{
|
||||
public:
|
||||
CoreTimingState();
|
||||
CoreTimingState(const CoreTimingState&) = delete;
|
||||
CoreTimingState(CoreTimingState&&) = delete;
|
||||
CoreTimingState& operator=(const CoreTimingState&) = delete;
|
||||
CoreTimingState& operator=(CoreTimingState&&) = delete;
|
||||
~CoreTimingState();
|
||||
|
||||
struct Data;
|
||||
Data& GetData() { return *m_data; }
|
||||
|
||||
private:
|
||||
std::unique_ptr<Data> m_data;
|
||||
};
|
||||
|
||||
// These really shouldn't be global, but jit64 accesses them directly
|
||||
struct Globals
|
||||
{
|
||||
@@ -37,7 +56,6 @@ struct Globals
|
||||
u64 fake_TB_start_ticks;
|
||||
float last_OC_factor_inverted;
|
||||
};
|
||||
extern Globals g;
|
||||
|
||||
// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is
|
||||
// required to end slice -1 and start slice 0 before the first cycle of code is executed.
|
||||
|
||||
@@ -212,13 +212,15 @@ int Interpreter::SingleStepInner()
|
||||
|
||||
void Interpreter::SingleStep()
|
||||
{
|
||||
auto& core_timing_globals = Core::System::GetInstance().GetCoreTimingGlobals();
|
||||
|
||||
// Declare start of new slice
|
||||
CoreTiming::Advance();
|
||||
|
||||
SingleStepInner();
|
||||
|
||||
// The interpreter ignores instruction timing information outside the 'fast runloop'.
|
||||
CoreTiming::g.slice_length = 1;
|
||||
core_timing_globals.slice_length = 1;
|
||||
PowerPC::ppcState.downcount = 0;
|
||||
|
||||
if (PowerPC::ppcState.Exceptions != 0)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "Core/PowerPC/Jit64/RegCache/JitRegCache.h"
|
||||
#include "Core/PowerPC/Jit64Common/Jit64PowerPCState.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
using namespace Gen;
|
||||
|
||||
@@ -322,7 +323,8 @@ void Jit64::mfspr(UGeckoInstruction inst)
|
||||
RCX64Reg rax = gpr.Scratch(RAX);
|
||||
RCX64Reg rcx = gpr.Scratch(RCX);
|
||||
|
||||
MOV(64, rcx, ImmPtr(&CoreTiming::g));
|
||||
auto& core_timing_globals = Core::System::GetInstance().GetCoreTimingGlobals();
|
||||
MOV(64, rcx, ImmPtr(&core_timing_globals));
|
||||
|
||||
// An inline implementation of CoreTiming::GetFakeTimeBase, since in timer-heavy games the
|
||||
// cost of calling out to C for this is actually significant.
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "Core/PowerPC/Interpreter/ExceptionUtils.h"
|
||||
#include "Core/PowerPC/PPCTables.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
using namespace Arm64Gen;
|
||||
|
||||
@@ -306,7 +307,8 @@ void JitArm64::mfspr(UGeckoInstruction inst)
|
||||
// An inline implementation of CoreTiming::GetFakeTimeBase, since in timer-heavy games the
|
||||
// cost of calling out to C for this is actually significant.
|
||||
|
||||
MOVP2R(Xg, &CoreTiming::g);
|
||||
auto& core_timing_globals = Core::System::GetInstance().GetCoreTimingGlobals();
|
||||
MOVP2R(Xg, &core_timing_globals);
|
||||
|
||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(downcount));
|
||||
m_float_emit.SCVTF(SC, WA);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "AudioCommon/SoundStream.h"
|
||||
#include "Core/Config/MainSettings.h"
|
||||
#include "Core/CoreTiming.h"
|
||||
#include "Core/HW/AudioInterface.h"
|
||||
#include "Core/HW/DSP.h"
|
||||
#include "Core/HW/DVD/DVDInterface.h"
|
||||
@@ -26,6 +27,8 @@ struct System::Impl
|
||||
bool m_audio_dump_started = false;
|
||||
|
||||
AudioInterface::AudioInterfaceState m_audio_interface_state;
|
||||
CoreTiming::CoreTimingState m_core_timing_state;
|
||||
CoreTiming::Globals m_core_timing_globals;
|
||||
DSP::DSPState m_dsp_state;
|
||||
DVDInterface::DVDInterfaceState m_dvd_interface_state;
|
||||
DVDThread::DVDThreadState m_dvd_thread_state;
|
||||
@@ -84,6 +87,16 @@ AudioInterface::AudioInterfaceState& System::GetAudioInterfaceState() const
|
||||
return m_impl->m_audio_interface_state;
|
||||
}
|
||||
|
||||
CoreTiming::CoreTimingState& System::GetCoreTimingState() const
|
||||
{
|
||||
return m_impl->m_core_timing_state;
|
||||
}
|
||||
|
||||
CoreTiming::Globals& System::GetCoreTimingGlobals() const
|
||||
{
|
||||
return m_impl->m_core_timing_globals;
|
||||
}
|
||||
|
||||
DSP::DSPState& System::GetDSPState() const
|
||||
{
|
||||
return m_impl->m_dsp_state;
|
||||
|
||||
@@ -12,6 +12,11 @@ namespace AudioInterface
|
||||
{
|
||||
class AudioInterfaceState;
|
||||
};
|
||||
namespace CoreTiming
|
||||
{
|
||||
class CoreTimingState;
|
||||
struct Globals;
|
||||
} // namespace CoreTiming
|
||||
namespace DSP
|
||||
{
|
||||
class DSPState;
|
||||
@@ -76,6 +81,8 @@ public:
|
||||
void SetAudioDumpStarted(bool started);
|
||||
|
||||
AudioInterface::AudioInterfaceState& GetAudioInterfaceState() const;
|
||||
CoreTiming::CoreTimingState& GetCoreTimingState() const;
|
||||
CoreTiming::Globals& GetCoreTimingGlobals() const;
|
||||
DSP::DSPState& GetDSPState() const;
|
||||
DVDInterface::DVDInterfaceState& GetDVDInterfaceState() const;
|
||||
DVDThread::DVDThreadState& GetDVDThreadState() const;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "Core/Core.h"
|
||||
#include "Core/CoreTiming.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/System.h"
|
||||
#include "UICommon/UICommon.h"
|
||||
|
||||
// Numbers are chosen randomly to make sure the correct one is given.
|
||||
@@ -279,9 +280,10 @@ TEST(CoreTiming, ScheduleIntoPast)
|
||||
// the stale value, i.e. effectively half-way through the previous slice.
|
||||
// NOTE: We're only testing that the scheduler doesn't break, not whether this makes sense.
|
||||
Core::UndeclareAsCPUThread();
|
||||
CoreTiming::g.global_timer -= 1000;
|
||||
auto& core_timing_globals = Core::System::GetInstance().GetCoreTimingGlobals();
|
||||
core_timing_globals.global_timer -= 1000;
|
||||
CoreTiming::ScheduleEvent(0, cb_b, CB_IDS[1], CoreTiming::FromThread::NON_CPU);
|
||||
CoreTiming::g.global_timer += 1000;
|
||||
core_timing_globals.global_timer += 1000;
|
||||
Core::DeclareAsCPUThread();
|
||||
AdvanceAndCheck(1, MAX_SLICE_LENGTH, MAX_SLICE_LENGTH + 1000);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user