Skip to content
Permalink
Browse files
Merge pull request #11253 from AdmiralCurtiss/core-timing-events-pass…
…-system

CoreTiming: Pass Core::System to Events.
  • Loading branch information
lioncash committed Nov 23, 2022
2 parents 677121b + a36a5c1 commit a47ed21
Show file tree
Hide file tree
Showing 23 changed files with 102 additions and 82 deletions.
@@ -19,6 +19,7 @@
#include "Core/Config/MainSettings.h"
#include "Core/Core.h"
#include "Core/PowerPC/PowerPC.h"
#include "Core/System.h"

#include "VideoCommon/Fifo.h"
#include "VideoCommon/VideoBackendBase.h"
@@ -82,7 +83,7 @@ static float s_config_OC_factor;
static float s_config_OC_inv_factor;
static bool s_config_sync_on_skip_idle;

static void EmptyTimedCallback(u64 userdata, s64 cyclesLate)
static void EmptyTimedCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
}

@@ -345,7 +346,7 @@ void Advance()
Event evt = std::move(s_event_queue.front());
std::pop_heap(s_event_queue.begin(), s_event_queue.end(), std::greater<Event>());
s_event_queue.pop_back();
evt.type->callback(evt.userdata, g.global_timer - evt.time);
evt.type->callback(Core::System::GetInstance(), evt.userdata, g.global_timer - evt.time);
}

s_is_global_timer_sane = false;
@@ -21,6 +21,11 @@

class PointerWrap;

namespace Core
{
class System;
}

namespace CoreTiming
{
// These really shouldn't be global, but jit64 accesses them directly
@@ -39,7 +44,7 @@ extern Globals g;
void Init();
void Shutdown();

typedef void (*TimedCallback)(u64 userdata, s64 cyclesLate);
typedef void (*TimedCallback)(Core::System& system, u64 userdata, s64 cyclesLate);

// This should only be called from the CPU thread, if you are calling it any other thread, you are
// doing something evil
@@ -198,12 +198,12 @@ int GetAIPeriod()
return static_cast<int>(std::min(period, s_period));
}

void Update(u64 userdata, s64 cycles_late)
static void Update(Core::System& system, u64 userdata, s64 cycles_late)
{
if (!IsPlaying())
return;

auto& state = Core::System::GetInstance().GetAudioInterfaceState().GetData();
auto& state = system.GetAudioInterfaceState().GetData();

const u64 diff = CoreTiming::GetTicks() - state.last_cpu_time;
if (diff > state.cpu_cycles_per_sample)
@@ -177,13 +177,13 @@ void DoState(PointerWrap& p)

static void UpdateInterrupts();
static void Do_ARAM_DMA();
static void GenerateDSPInterrupt(u64 DSPIntType, s64 cyclesLate = 0);
static void GenerateDSPInterrupt(Core::System& system, u64 DSPIntType, s64 cyclesLate = 0);

static void CompleteARAM(u64 userdata, s64 cyclesLate)
static void CompleteARAM(Core::System& system, u64 userdata, s64 cyclesLate)
{
auto& state = Core::System::GetInstance().GetDSPState().GetData();
auto& state = system.GetDSPState().GetData();
state.dsp_control.DMAState = 0;
GenerateDSPInterrupt(INT_ARAM);
GenerateDSPInterrupt(system, INT_ARAM);
}

DSPEmulator* GetDSPEmulator()
@@ -471,9 +471,9 @@ static void UpdateInterrupts()
ProcessorInterface::SetInterrupt(ProcessorInterface::INT_CAUSE_DSP, ints_set);
}

static void GenerateDSPInterrupt(u64 DSPIntType, s64 cyclesLate)
static void GenerateDSPInterrupt(Core::System& system, u64 DSPIntType, s64 cyclesLate)
{
auto& state = Core::System::GetInstance().GetDSPState().GetData();
auto& state = system.GetDSPState().GetData();

// The INT_* enumeration members have values that reflect their bit positions in
// DSP_CONTROL - we mask by (INT_DSP | INT_ARAM | INT_AID) just to ensure people
@@ -512,7 +512,8 @@ void UpdateDSPSlice(int cycles)
// This happens at 4 khz, since 32 bytes at 4khz = 4 bytes at 32 khz (16bit stereo pcm)
void UpdateAudioDMA()
{
auto& state = Core::System::GetInstance().GetDSPState().GetData();
auto& system = Core::System::GetInstance();
auto& state = system.GetDSPState().GetData();

static short zero_samples[8 * 2] = {0};
if (state.audio_dma.AudioDMAControl.Enable)
@@ -534,7 +535,7 @@ void UpdateAudioDMA()
state.audio_dma.current_source_address = state.audio_dma.SourceAddress;
state.audio_dma.remaining_blocks_count = state.audio_dma.AudioDMAControl.NumBlocks;

GenerateDSPInterrupt(DSP::INT_AID);
GenerateDSPInterrupt(system, DSP::INT_AID);
}
}
else
@@ -188,10 +188,10 @@ DVDInterfaceState::DVDInterfaceState() : m_data(std::make_unique<Data>())

DVDInterfaceState::~DVDInterfaceState() = default;

static void AutoChangeDiscCallback(u64 userdata, s64 cyclesLate);
static void EjectDiscCallback(u64 userdata, s64 cyclesLate);
static void InsertDiscCallback(u64 userdata, s64 cyclesLate);
static void FinishExecutingCommandCallback(u64 userdata, s64 cycles_late);
static void AutoChangeDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate);
static void EjectDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate);
static void InsertDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate);
static void FinishExecutingCommandCallback(Core::System& system, u64 userdata, s64 cycles_late);

static void SetLidOpen();

@@ -531,19 +531,19 @@ bool IsDiscInside()
return DVDThread::HasDisc();
}

static void AutoChangeDiscCallback(u64 userdata, s64 cyclesLate)
static void AutoChangeDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
AutoChangeDisc();
}

static void EjectDiscCallback(u64 userdata, s64 cyclesLate)
static void EjectDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
SetDisc(nullptr, {});
}

static void InsertDiscCallback(u64 userdata, s64 cyclesLate)
static void InsertDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
auto& state = Core::System::GetInstance().GetDVDInterfaceState().GetData();
auto& state = system.GetDVDInterfaceState().GetData();
std::unique_ptr<DiscIO::VolumeDisc> new_disc = DiscIO::CreateDisc(state.disc_path_to_insert);

if (new_disc)
@@ -1370,7 +1370,7 @@ static u64 PackFinishExecutingCommandUserdata(ReplyType reply_type, DIInterruptT
return (static_cast<u64>(reply_type) << 32) + static_cast<u32>(interrupt_type);
}

void FinishExecutingCommandCallback(u64 userdata, s64 cycles_late)
void FinishExecutingCommandCallback(Core::System& system, u64 userdata, s64 cycles_late)
{
ReplyType reply_type = static_cast<ReplyType>(userdata >> 32);
DIInterruptType interrupt_type = static_cast<DIInterruptType>(userdata & 0xFFFFFFFF);
@@ -72,7 +72,7 @@ static void StartReadInternal(bool copy_to_ram, u32 output_address, u64 dvd_offs
const DiscIO::Partition& partition,
DVDInterface::ReplyType reply_type, s64 ticks_until_completion);

static void FinishRead(u64 id, s64 cycles_late);
static void FinishRead(Core::System& system, u64 id, s64 cycles_late);

struct DVDThreadState::Data
{
@@ -328,9 +328,9 @@ static void StartReadInternal(bool copy_to_ram, u32 output_address, u64 dvd_offs
CoreTiming::ScheduleEvent(ticks_until_completion, state.finish_read, id);
}

static void FinishRead(u64 id, s64 cycles_late)
static void FinishRead(Core::System& system, u64 id, s64 cycles_late)
{
auto& state = Core::System::GetInstance().GetDVDThreadState().GetData();
auto& state = system.GetDVDThreadState().GetData();

// We can't simply pop result_queue and always get the ReadResult
// we want, because the DVD thread may add ReadResults to the queue
@@ -43,8 +43,8 @@ ExpansionInterfaceState::ExpansionInterfaceState() : m_data(std::make_unique<Dat

ExpansionInterfaceState::~ExpansionInterfaceState() = default;

static void ChangeDeviceCallback(u64 userdata, s64 cyclesLate);
static void UpdateInterruptsCallback(u64 userdata, s64 cycles_late);
static void ChangeDeviceCallback(Core::System& system, u64 userdata, s64 cyclesLate);
static void UpdateInterruptsCallback(Core::System& system, u64 userdata, s64 cycles_late);

namespace
{
@@ -214,13 +214,13 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
}
}

static void ChangeDeviceCallback(u64 userdata, s64 cyclesLate)
static void ChangeDeviceCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
u8 channel = (u8)(userdata >> 32);
u8 type = (u8)(userdata >> 16);
u8 num = (u8)userdata;

auto& state = Core::System::GetInstance().GetExpansionInterfaceState().GetData();
auto& state = system.GetExpansionInterfaceState().GetData();
state.channels.at(channel)->AddDevice(static_cast<EXIDeviceType>(type), num);
}

@@ -270,7 +270,7 @@ void UpdateInterrupts()
ProcessorInterface::SetInterrupt(ProcessorInterface::INT_CAUSE_EXI, causeInt);
}

static void UpdateInterruptsCallback(u64 userdata, s64 cycles_late)
static void UpdateInterruptsCallback(Core::System& system, u64 userdata, s64 cycles_late)
{
UpdateInterrupts();
}
@@ -71,12 +71,12 @@ void CEXIMemoryCard::EventCompleteFindInstance(u64 userdata,
}
}

void CEXIMemoryCard::CmdDoneCallback(u64 userdata, s64)
void CEXIMemoryCard::CmdDoneCallback(Core::System& system, u64 userdata, s64)
{
EventCompleteFindInstance(userdata, [](CEXIMemoryCard* instance) { instance->CmdDone(); });
}

void CEXIMemoryCard::TransferCompleteCallback(u64 userdata, s64)
void CEXIMemoryCard::TransferCompleteCallback(Core::System& system, u64 userdata, s64)
{
EventCompleteFindInstance(userdata,
[](CEXIMemoryCard* instance) { instance->TransferComplete(); });
@@ -14,6 +14,10 @@
class MemoryCardBase;
class PointerWrap;

namespace Core
{
class System;
}
namespace Memcard
{
struct HeaderData;
@@ -58,10 +62,10 @@ class CEXIMemoryCard : public IEXIDevice
std::function<void(CEXIMemoryCard*)> callback);

// Scheduled when a command that required delayed end signaling is done.
static void CmdDoneCallback(u64 userdata, s64 cyclesLate);
static void CmdDoneCallback(Core::System& system, u64 userdata, s64 cyclesLate);

// Scheduled when memory card is done transferring data
static void TransferCompleteCallback(u64 userdata, s64 cyclesLate);
static void TransferCompleteCallback(Core::System& system, u64 userdata, s64 cyclesLate);

// Signals that the command that was previously executed is now done.
void CmdDone();
@@ -39,13 +39,13 @@ static u32 m_ResetCode;

// ID and callback for scheduling reset button presses/releases
static CoreTiming::EventType* toggleResetButton;
static void ToggleResetButtonCallback(u64 userdata, s64 cyclesLate);
static void ToggleResetButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate);

static CoreTiming::EventType* iosNotifyResetButton;
static void IOSNotifyResetButtonCallback(u64 userdata, s64 cyclesLate);
static void IOSNotifyResetButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate);

static CoreTiming::EventType* iosNotifyPowerButton;
static void IOSNotifyPowerButtonCallback(u64 userdata, s64 cyclesLate);
static void IOSNotifyPowerButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate);

// Let the PPC know that an external exception is set/cleared
void UpdateException();
@@ -230,12 +230,12 @@ static void SetResetButton(bool set)
SetInterrupt(INT_CAUSE_RST_BUTTON, !set);
}

static void ToggleResetButtonCallback(u64 userdata, s64 cyclesLate)
static void ToggleResetButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
SetResetButton(!!userdata);
}

static void IOSNotifyResetButtonCallback(u64 userdata, s64 cyclesLate)
static void IOSNotifyResetButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
const auto ios = IOS::HLE::GetIOS();
if (!ios)
@@ -246,7 +246,7 @@ static void IOSNotifyResetButtonCallback(u64 userdata, s64 cyclesLate)
std::static_pointer_cast<IOS::HLE::STMEventHookDevice>(stm)->ResetButton();
}

static void IOSNotifyPowerButtonCallback(u64 userdata, s64 cyclesLate)
static void IOSNotifyPowerButtonCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
const auto ios = IOS::HLE::GetIOS();
if (!ios)
@@ -243,10 +243,10 @@ static void SetNoResponse(u32 channel)
}
}

static void ChangeDeviceCallback(u64 user_data, s64 cycles_late)
static void ChangeDeviceCallback(Core::System& system, u64 user_data, s64 cycles_late)
{
// The purpose of this callback is to simply re-enable device changes.
auto& state = Core::System::GetInstance().GetSerialInterfaceState().GetData();
auto& state = system.GetSerialInterfaceState().GetData();
state.channel[user_data].has_recent_device_change = false;
}

@@ -295,9 +295,9 @@ constexpr s32 ConvertSILengthField(u32 field)
return ((field - 1) & SI_XFER_LENGTH_MASK) + 1;
}

static void RunSIBuffer(u64 user_data, s64 cycles_late)
static void RunSIBuffer(Core::System& system, u64 user_data, s64 cycles_late)
{
auto& state = Core::System::GetInstance().GetSerialInterfaceState().GetData();
auto& state = system.GetSerialInterfaceState().GetData();
if (state.com_csr.TSTART)
{
const s32 request_length = ConvertSILengthField(state.com_csr.OUTLNGTH);
@@ -380,9 +380,9 @@ void DoState(PointerWrap& p)
}

template <int device_number>
static void DeviceEventCallback(u64 userdata, s64 cyclesLate)
static void DeviceEventCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
auto& state = Core::System::GetInstance().GetSerialInterfaceState().GetData();
auto& state = system.GetSerialInterfaceState().GetData();
state.channel[device_number].device->OnEvent(userdata, cyclesLate);
}

@@ -555,7 +555,8 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)

mmio->Register(base | SI_COM_CSR, MMIO::DirectRead<u32>(&state.com_csr.hex),
MMIO::ComplexWrite<u32>([](u32, u32 val) {
auto& state = Core::System::GetInstance().GetSerialInterfaceState().GetData();
auto& system = Core::System::GetInstance();
auto& state = system.GetSerialInterfaceState().GetData();
const USIComCSR tmp_com_csr(val);

state.com_csr.CHANNEL = tmp_com_csr.CHANNEL.Value();
@@ -575,7 +576,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
if (state.com_csr.TSTART)
CoreTiming::RemoveEvent(state.event_type_tranfer_pending);
state.com_csr.TSTART = 1;
RunSIBuffer(0, 0);
RunSIBuffer(system, 0, 0);
}

if (!state.com_csr.TSTART)

0 comments on commit a47ed21

Please sign in to comment.