aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorGravatar bunnei <ericbunnie@gmail.com>2014-06-14 12:13:16 -0400
committerGravatar bunnei <ericbunnie@gmail.com>2014-06-14 12:13:16 -0400
commit004df767953a949817da89bddcd5d1379240f769 (patch)
treeb2d54928dcbf3cb4dde0cd5d3277afe7999b7bd9 /src/core/core.cpp
parentc34ba380011921a9d984136381c3a65a1e2389d5 (diff)
parentb45a38f55794e47b0429a8667441a20433e19e42 (diff)
Merge branch 'threading' of https://github.com/bunnei/citra
Conflicts: src/core/hle/function_wrappers.h src/core/hle/service/gsp.cpp
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index f88bcd70..7dc0809d 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -9,21 +9,24 @@
#include "core/core.h"
#include "core/mem_map.h"
#include "core/hw/hw.h"
+#include "core/hw/gpu.h"
#include "core/arm/disassembler/arm_disasm.h"
#include "core/arm/interpreter/arm_interpreter.h"
+#include "core/hle/hle.h"
#include "core/hle/kernel/thread.h"
namespace Core {
-ARM_Disasm* g_disasm = NULL; ///< ARM disassembler
-ARM_Interface* g_app_core = NULL; ///< ARM11 application core
-ARM_Interface* g_sys_core = NULL; ///< ARM11 system (OS) core
+u64 g_last_ticks = 0; ///< Last CPU ticks
+ARM_Disasm* g_disasm = nullptr; ///< ARM disassembler
+ARM_Interface* g_app_core = nullptr; ///< ARM11 application core
+ARM_Interface* g_sys_core = nullptr; ///< ARM11 system (OS) core
/// Run the core CPU loop
void RunLoop() {
for (;;){
- g_app_core->Run(100);
+ g_app_core->Run(GPU::kFrameTicks);
HW::Update();
Kernel::Reschedule();
}
@@ -32,8 +35,14 @@ void RunLoop() {
/// Step the CPU one instruction
void SingleStep() {
g_app_core->Step();
- HW::Update();
- Kernel::Reschedule();
+
+ // Update and reschedule after approx. 1 frame
+ u64 current_ticks = Core::g_app_core->GetTicks();
+ if ((current_ticks - g_last_ticks) >= GPU::kFrameTicks || HLE::g_reschedule) {
+ g_last_ticks = current_ticks;
+ HW::Update();
+ Kernel::Reschedule();
+ }
}
/// Halt the core
@@ -54,6 +63,8 @@ int Init() {
g_app_core = new ARM_Interpreter();
g_sys_core = new ARM_Interpreter();
+ g_last_ticks = Core::g_app_core->GetTicks();
+
return 0;
}