|
|
@ -20,7 +20,7 @@ |
|
|
|
|
|
|
|
|
namespace Core::Timing { |
|
|
namespace Core::Timing { |
|
|
|
|
|
|
|
|
constexpr s64 MAX_SLICE_LENGTH = 4000; |
|
|
|
|
|
|
|
|
constexpr s64 MAX_SLICE_LENGTH = 10000; |
|
|
|
|
|
|
|
|
std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) { |
|
|
std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) { |
|
|
return std::make_shared<EventType>(std::move(callback), std::move(name)); |
|
|
return std::make_shared<EventType>(std::move(callback), std::move(name)); |
|
|
@ -65,7 +65,7 @@ void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) { |
|
|
on_thread_init = std::move(on_thread_init_); |
|
|
on_thread_init = std::move(on_thread_init_); |
|
|
event_fifo_id = 0; |
|
|
event_fifo_id = 0; |
|
|
shutting_down = false; |
|
|
shutting_down = false; |
|
|
ticks = 0; |
|
|
|
|
|
|
|
|
cpu_ticks = 0; |
|
|
const auto empty_timed_callback = [](std::uintptr_t, u64, std::chrono::nanoseconds) |
|
|
const auto empty_timed_callback = [](std::uintptr_t, u64, std::chrono::nanoseconds) |
|
|
-> std::optional<std::chrono::nanoseconds> { return std::nullopt; }; |
|
|
-> std::optional<std::chrono::nanoseconds> { return std::nullopt; }; |
|
|
ev_lost = CreateEvent("_lost_event", empty_timed_callback); |
|
|
ev_lost = CreateEvent("_lost_event", empty_timed_callback); |
|
|
@ -170,20 +170,12 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr<EventType>& event_type, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void CoreTiming::AddTicks(u64 ticks_to_add) { |
|
|
void CoreTiming::AddTicks(u64 ticks_to_add) { |
|
|
ticks += ticks_to_add; |
|
|
|
|
|
downcount -= static_cast<s64>(ticks); |
|
|
|
|
|
|
|
|
cpu_ticks += ticks_to_add; |
|
|
|
|
|
downcount -= static_cast<s64>(cpu_ticks); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void CoreTiming::Idle() { |
|
|
void CoreTiming::Idle() { |
|
|
if (!event_queue.empty()) { |
|
|
|
|
|
const u64 next_event_time = event_queue.front().time; |
|
|
|
|
|
const u64 next_ticks = Common::WallClock::NSToCNTPCT(next_event_time) + 10U; |
|
|
|
|
|
if (next_ticks > ticks) { |
|
|
|
|
|
ticks = next_ticks; |
|
|
|
|
|
} |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
ticks += 1000U; |
|
|
|
|
|
|
|
|
cpu_ticks += 1000U; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void CoreTiming::ResetTicks() { |
|
|
void CoreTiming::ResetTicks() { |
|
|
@ -194,14 +186,14 @@ u64 CoreTiming::GetClockTicks() const { |
|
|
if (is_multicore) [[likely]] { |
|
|
if (is_multicore) [[likely]] { |
|
|
return clock->GetCNTPCT(); |
|
|
return clock->GetCNTPCT(); |
|
|
} |
|
|
} |
|
|
return ticks; |
|
|
|
|
|
|
|
|
return Common::WallClock::CPUTickToCNTPCT(cpu_ticks); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
u64 CoreTiming::GetGPUTicks() const { |
|
|
u64 CoreTiming::GetGPUTicks() const { |
|
|
if (is_multicore) [[likely]] { |
|
|
if (is_multicore) [[likely]] { |
|
|
return clock->GetGPUTick(); |
|
|
return clock->GetGPUTick(); |
|
|
} |
|
|
} |
|
|
return Common::WallClock::CNTPCTToGPUTick(ticks); |
|
|
|
|
|
|
|
|
return Common::WallClock::CPUTickToGPUTick(cpu_ticks); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::optional<s64> CoreTiming::Advance() { |
|
|
std::optional<s64> CoreTiming::Advance() { |
|
|
@ -314,14 +306,14 @@ std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { |
|
|
if (is_multicore) [[likely]] { |
|
|
if (is_multicore) [[likely]] { |
|
|
return clock->GetTimeNS(); |
|
|
return clock->GetTimeNS(); |
|
|
} |
|
|
} |
|
|
return std::chrono::nanoseconds{Common::WallClock::CNTPCTToNS(ticks)}; |
|
|
|
|
|
|
|
|
return std::chrono::nanoseconds{Common::WallClock::CPUTickToNS(cpu_ticks)}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { |
|
|
std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { |
|
|
if (is_multicore) [[likely]] { |
|
|
if (is_multicore) [[likely]] { |
|
|
return clock->GetTimeUS(); |
|
|
return clock->GetTimeUS(); |
|
|
} |
|
|
} |
|
|
return std::chrono::microseconds{Common::WallClock::CNTPCTToUS(ticks)}; |
|
|
|
|
|
|
|
|
return std::chrono::microseconds{Common::WallClock::CPUTickToUS(cpu_ticks)}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} // namespace Core::Timing
|
|
|
} // namespace Core::Timing
|