From 6190918158be5e05556fc7fddad72e851b32d264 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Apr 2013 17:37:24 -0700 Subject: [PATCH] Don't allow two drawsyncs to be in play at once. --- Core/CoreTiming.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++ Core/CoreTiming.h | 1 + Core/HLE/sceGe.cpp | 2 ++ 3 files changed, 49 insertions(+) diff --git a/Core/CoreTiming.cpp b/Core/CoreTiming.cpp index d442f0bcc9..d6625ee736 100644 --- a/Core/CoreTiming.cpp +++ b/Core/CoreTiming.cpp @@ -315,6 +315,52 @@ s64 UnscheduleEvent(int event_type, u64 userdata) return result; } +s64 UnscheduleThreadsafeEvent(int event_type, u64 userdata) +{ + s64 result = 0; + std::lock_guard lk(externalEventSection); + if (!tsFirst) + return result; + while(tsFirst) + { + if (tsFirst->type == event_type && tsFirst->userdata == userdata) + { + result = tsFirst->time - globalTimer; + + Event *next = tsFirst->next; + FreeTsEvent(tsFirst); + tsFirst = next; + } + else + { + break; + } + } + if (!tsFirst) + return result; + + Event *prev = tsFirst; + Event *ptr = prev->next; + while (ptr) + { + if (ptr->type == event_type && ptr->userdata == userdata) + { + result = ptr->time - globalTimer; + + prev->next = ptr->next; + FreeTsEvent(ptr); + ptr = prev->next; + } + else + { + prev = ptr; + ptr = ptr->next; + } + } + + return result; +} + // Warning: not included in save state. void RegisterAdvanceCallback(void (*callback)(int cyclesExecuted)) { diff --git a/Core/CoreTiming.h b/Core/CoreTiming.h index 5f608df5af..d4bdd12aca 100644 --- a/Core/CoreTiming.h +++ b/Core/CoreTiming.h @@ -94,6 +94,7 @@ namespace CoreTiming void ScheduleEvent_Threadsafe(s64 cyclesIntoFuture, int event_type, u64 userdata=0); void ScheduleEvent_Threadsafe_Immediate(int event_type, u64 userdata=0); s64 UnscheduleEvent(int event_type, u64 userdata); + s64 UnscheduleThreadsafeEvent(int event_type, u64 userdata); void RemoveEvent(int event_type); void RemoveThreadsafeEvent(int event_type); diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index eb6ccd2292..1e77a249a1 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -195,6 +195,8 @@ void __GeShutdown() bool __GeTriggerSync(WaitType waitType, int id, u64 atTicks) { u64 userdata = (u64)id << 32 | (u64) waitType; + if (waitType == WAITTYPE_GEDRAWSYNC) + CoreTiming::UnscheduleThreadsafeEvent(geSyncEvent, userdata); CoreTiming::ScheduleEvent_Threadsafe(atTicks - CoreTiming::GetTicks(), geSyncEvent, userdata); return true; }