Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #11301 from AdmiralCurtiss/globals-coretiming
CoreTiming: Move variables to Core::System.
  • Loading branch information
lioncash committed Nov 26, 2022
2 parents 70f353f + 4273d37 commit ed84917
Show file tree
Hide file tree
Showing 8 changed files with 217 additions and 106 deletions.
265 changes: 165 additions & 100 deletions Source/Core/Core/CoreTiming.cpp

Large diffs are not rendered by default.

20 changes: 19 additions & 1 deletion Source/Core/Core/CoreTiming.h
Expand Up @@ -16,7 +16,9 @@
// inside callback:
// ScheduleEvent(periodInCycles - cyclesLate, callback, "whatever")

#include <memory>
#include <string>

#include "Common/CommonTypes.h"

class PointerWrap;
Expand All @@ -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
{
Expand All @@ -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.
Expand Down
4 changes: 3 additions & 1 deletion Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp
Expand Up @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion Source/Core/Core/PowerPC/Jit64/Jit_SystemRegisters.cpp
Expand Up @@ -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;

Expand Down Expand Up @@ -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.
Expand Down
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down
13 changes: 13 additions & 0 deletions Source/Core/Core/System.cpp
Expand Up @@ -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"
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions Source/Core/Core/System.h
Expand Up @@ -12,6 +12,11 @@ namespace AudioInterface
{
class AudioInterfaceState;
};
namespace CoreTiming
{
class CoreTimingState;
struct Globals;
} // namespace CoreTiming
namespace DSP
{
class DSPState;
Expand Down Expand Up @@ -76,6 +81,8 @@ class System
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;
Expand Down
6 changes: 4 additions & 2 deletions Source/UnitTests/Core/CoreTimingTest.cpp
Expand Up @@ -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.
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit ed84917

Please sign in to comment.