diff options
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 11 | ||||
| -rw-r--r-- | src/core/core_cpu.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 1 | 
3 files changed, 11 insertions, 2 deletions
| diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index ceb3f7683..0996f129c 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -86,7 +86,16 @@ public:      }      void AddTicks(u64 ticks) override { -        CoreTiming::AddTicks(ticks - num_interpreted_instructions); +        // Divide the number of ticks by the amount of CPU cores. TODO(Subv): This yields only a +        // rough approximation of the amount of executed ticks in the system, it may be thrown off +        // if not all cores are doing a similar amount of work. Instead of doing this, we should +        // device a way so that timing is consistent across all cores without increasing the ticks 4 +        // times. +        u64 amortized_ticks = (ticks - num_interpreted_instructions) / Core::NUM_CPU_CORES; +        // Always execute at least one tick. +        amortized_ticks = std::max<u64>(amortized_ticks, 1); + +        CoreTiming::AddTicks(amortized_ticks);          num_interpreted_instructions = 0;      }      u64 GetTicksRemaining() override { diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp index 9b306faf6..b042ee02b 100644 --- a/src/core/core_cpu.cpp +++ b/src/core/core_cpu.cpp @@ -91,6 +91,7 @@ void Cpu::RunLoop(bool tight_loop) {          LOG_TRACE(Core, "Core-{} idling", core_index);          if (IsMainCore()) { +            // TODO(Subv): Only let CoreTiming idle if all 4 cores are idling.              CoreTiming::Idle();              CoreTiming::Advance();          } diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 5818cc06d..b24f409b3 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -532,7 +532,6 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V      CASCADE_RESULT(thread->guest_handle, g_handle_table.Create(thread));      *out_handle = thread->guest_handle; -    Core::System::GetInstance().PrepareReschedule();      Core::System::GetInstance().CpuCore(thread->processor_id).PrepareReschedule();      LOG_TRACE(Kernel_SVC, | 
