summaryrefslogtreecommitdiffstats
path: root/src/core/core_timing.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-03-28 20:23:28 +0100
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-06-27 17:36:01 +0200
commitf5e32935ca9d1727624c86ca78aff91027caf819 (patch)
treea041186cd47fcea90880b300af3351a56fb819aa /src/core/core_timing.cpp
parentScheduler: Correct Reload/Unload (diff)
downloadyuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.gz
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.bz2
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.lz
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.xz
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.zst
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.zip
Diffstat (limited to 'src/core/core_timing.cpp')
-rw-r--r--src/core/core_timing.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 189d4aa34..12e9e60a4 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -14,6 +14,8 @@
namespace Core::Timing {
+constexpr u64 MAX_SLICE_LENGTH = 4000;
+
std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) {
return std::make_shared<EventType>(std::move(callback), std::move(name));
}
@@ -53,6 +55,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) {
void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) {
on_thread_init = std::move(on_thread_init_);
event_fifo_id = 0;
+ ticks = 0;
const auto empty_timed_callback = [](u64, s64) {};
ev_lost = CreateEvent("_lost_event", empty_timed_callback);
if (is_multicore) {
@@ -126,20 +129,36 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u
basic_lock.unlock();
}
-void CoreTiming::AddTicks(std::size_t core_index, u64 ticks) {
- ticks_count[core_index] += ticks;
+void CoreTiming::AddTicks(u64 ticks) {
+ this->ticks += ticks;
+ downcount -= ticks;
}
-void CoreTiming::ResetTicks(std::size_t core_index) {
- ticks_count[core_index] = 0;
+void CoreTiming::Idle() {
+ if (!event_queue.empty()) {
+ u64 next_event_time = event_queue.front().time;
+ ticks = nsToCycles(std::chrono::nanoseconds(next_event_time)) + 10U;
+ return;
+ }
+ ticks += 1000U;
+}
+
+void CoreTiming::ResetTicks() {
+ downcount = MAX_SLICE_LENGTH;
}
u64 CoreTiming::GetCPUTicks() const {
- return clock->GetCPUCycles();
+ if (is_multicore) {
+ return clock->GetCPUCycles();
+ }
+ return ticks;
}
u64 CoreTiming::GetClockTicks() const {
- return clock->GetClockCycles();
+ if (is_multicore) {
+ return clock->GetClockCycles();
+ }
+ return CpuCyclesToClockCycles(ticks);
}
void CoreTiming::ClearPendingEvents() {
@@ -217,11 +236,17 @@ void CoreTiming::ThreadLoop() {
}
std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const {
- return clock->GetTimeNS();
+ if (is_multicore) {
+ return clock->GetTimeNS();
+ }
+ return CyclesToNs(ticks);
}
std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const {
- return clock->GetTimeUS();
+ if (is_multicore) {
+ return clock->GetTimeUS();
+ }
+ return CyclesToUs(ticks);
}
} // namespace Core::Timing