Use CoreTiming for input polling, sync to vblank

This commit is contained in:
Daniel Stuart Baxter 2015-05-26 00:43:22 -05:00
parent 9dcbb07840
commit 614da6bc17
3 changed files with 31 additions and 4 deletions

View File

@ -5,8 +5,6 @@
#include "common/common_types.h"
#include "common/logging/log.h"
#include "input_common/input_common.h"
#include "core/core.h"
#include "core/core_timing.h"
@ -62,8 +60,6 @@ int Init() {
g_sys_core = new ARM_DynCom(USER32MODE);
g_app_core = new ARM_DynCom(USER32MODE);
InputCommon::Init(InputCommon::SDL2_JOY);
LOG_DEBUG(Core, "Initialized OK");
return 0;
}

View File

@ -12,6 +12,8 @@
#include "video_core/video_core.h"
#include "input_common/input_common.h"
namespace System {
void Init(EmuWindow* emu_window) {
@ -22,9 +24,11 @@ void Init(EmuWindow* emu_window) {
Kernel::Init();
HLE::Init();
VideoCore::Init(emu_window);
InputCommon::Init(InputCommon::SDL2_JOY);
}
void Shutdown() {
//InputCommon::Shutdown();
VideoCore::Shutdown();
HLE::Shutdown();
Kernel::Shutdown();

View File

@ -5,11 +5,32 @@
#include "input_common/input_common.h"
#include "input_common/sdl_input/sdl_input.h"
#include "core/core_timing.h"
#include "core/settings.h"
namespace InputCommon {
//Set to nullptr until initialized by a backend
ControllerBase* g_user_input = nullptr;
//Event id for CoreTiming
static int input_event;
//Ticks for CoreTiming event, same as VBlank in GPU
static u64 frame_ticks;
///Callback for CoreTiming
static void InputCallback(u64 userdata, int cycles_late) {
//Call user input plugin Poll()
if(g_user_input != nullptr) {
g_user_input->Poll();
}
// Reschedule recurrent event
CoreTiming::ScheduleEvent(frame_ticks - cycles_late, input_event);
}
std::string ControllerBase::GetDeviceName() const {
return device_name;
}
@ -30,6 +51,12 @@ void Init(ControllerBackends backend) {
default:
break;
}
//Setup CoreTiming
frame_ticks = 268123480 / Settings::values.gpu_refresh_rate;
input_event = CoreTiming::RegisterEvent("InputCommon::InputCallback", InputCallback);
CoreTiming::ScheduleEvent(frame_ticks, input_event);
}
} // namespace