aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorGravatar bunnei <bunneidev@gmail.com>2014-07-22 22:59:26 -0400
committerGravatar bunnei <bunneidev@gmail.com>2014-08-05 23:57:53 -0400
commitec14ffe1cda04cd098ce07f3d3ad96c253e91eed (patch)
treefe459fc75a4ba62ed1a730e8a4ccbdffa2846dca /src/core/core.cpp
parentc48ab0bd9e6ca20c3b83e64636d9e3bd9e306e94 (diff)
GSP: Implements preliminary command synchronization via GPU interrupts.
Core: Added a comment to explain the logic for the RunLoop iterations.
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 7dc0809d..fc990937 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -26,21 +26,25 @@ ARM_Interface* g_sys_core = nullptr; ///< ARM11 system (OS) core
/// Run the core CPU loop
void RunLoop() {
for (;;){
- g_app_core->Run(GPU::kFrameTicks);
+ // This function loops for 100 instructions in the CPU before trying to update hardware.
+ // This is a little bit faster than SingleStep, and should be pretty much equivalent. The
+ // number of instructions chosen is fairly arbitrary, however a large number will more
+ // drastically affect the frequency of GSP interrupts and likely break things. The point of
+ // this is to just loop in the CPU for more than 1 instruction to reduce overhead and make
+ // it a little bit faster...
+ g_app_core->Run(100);
HW::Update();
- Kernel::Reschedule();
+ if (HLE::g_reschedule) {
+ Kernel::Reschedule();
+ }
}
}
/// Step the CPU one instruction
void SingleStep() {
g_app_core->Step();
-
- // 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();
+ HW::Update();
+ if (HLE::g_reschedule) {
Kernel::Reschedule();
}
}