diff options
Diffstat (limited to 'Source/Core/VideoCommon/PixelEngine.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/PixelEngine.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/Source/Core/VideoCommon/PixelEngine.cpp b/Source/Core/VideoCommon/PixelEngine.cpp index 87d58eb010..747328b3c6 100644 --- a/Source/Core/VideoCommon/PixelEngine.cpp +++ b/Source/Core/VideoCommon/PixelEngine.cpp @@ -277,7 +277,7 @@ static void SetTokenFinish_OnMainThread(u64 userdata, s64 cyclesLate) // Raise the event handler above on the CPU thread. // s_token_finish_mutex must be locked. // THIS IS EXECUTED FROM VIDEO THREAD -static void RaiseEvent() +static void RaiseEvent(int cycles_into_future) { if (s_event_raised) return; @@ -285,14 +285,21 @@ static void RaiseEvent() s_event_raised = true; CoreTiming::FromThread from = CoreTiming::FromThread::NON_CPU; + s64 cycles = 0; // we don't care about timings for dual core mode. if (!SConfig::GetInstance().bCPUThread || Fifo::UseDeterministicGPUThread()) + { from = CoreTiming::FromThread::CPU; - CoreTiming::ScheduleEvent(0, et_SetTokenFinishOnMainThread, 0, from); + + // Hack: Dolphin's single-core gpu timings are way too fast. Enforce a minimum delay to give + // games time to setup any interrupt state + cycles = std::max(500, cycles_into_future); + } + CoreTiming::ScheduleEvent(cycles, et_SetTokenFinishOnMainThread, 0, from); } // SetToken // THIS IS EXECUTED FROM VIDEO THREAD -void SetToken(const u16 token, const bool interrupt) +void SetToken(const u16 token, const bool interrupt, int cycles_into_future) { DEBUG_LOG_FMT(PIXELENGINE, "VIDEO Backend raises INT_CAUSE_PE_TOKEN (btw, token: {:04x})", token); @@ -301,12 +308,12 @@ void SetToken(const u16 token, const bool interrupt) s_token_pending = token; s_token_interrupt_pending |= interrupt; - RaiseEvent(); + RaiseEvent(cycles_into_future); } // SetFinish // THIS IS EXECUTED FROM VIDEO THREAD (BPStructs.cpp) when a new frame has been drawn -void SetFinish() +void SetFinish(int cycles_into_future) { DEBUG_LOG_FMT(PIXELENGINE, "VIDEO Set Finish"); @@ -314,7 +321,7 @@ void SetFinish() s_finish_interrupt_pending |= true; - RaiseEvent(); + RaiseEvent(cycles_into_future); } UPEAlphaReadReg GetAlphaReadMode() |
