Update DSP semaphore on semaphore event signal

Fixes Pokemon X and other DSP-needy games...
This commit is contained in:
wheremyfoodat 2024-02-18 03:54:00 +02:00
parent d3dc9e2f71
commit f58354af06
7 changed files with 53 additions and 15 deletions

View file

@ -12,9 +12,9 @@ const char* Kernel::resetTypeToString(u32 type) {
}
}
Handle Kernel::makeEvent(ResetType resetType) {
Handle Kernel::makeEvent(ResetType resetType, Event::CallbackType callback) {
Handle ret = makeObject(KernelObjectType::Event);
objects[ret].data = new Event(resetType);
objects[ret].data = new Event(resetType, callback);
return ret;
}
@ -42,8 +42,13 @@ bool Kernel::signalEvent(Handle handle) {
event->fired = false;
}
}
rescheduleThreads();
// Run the callback for events that require a special callback
if (event->callback != Event::CallbackType::None) [[unlikely]] {
runEventCallback(event->callback);
}
return true;
}
@ -230,4 +235,12 @@ void Kernel::waitSynchronizationN() {
} else {
Helpers::panic("WaitSynchronizationN with waitAll");
}
}
void Kernel::runEventCallback(Event::CallbackType callback) {
switch (callback) {
case Event::CallbackType::None: break;
case Event::CallbackType::DSPSemaphore: serviceManager.getDSP().onSemaphoreEventSignal(); break;
default: Helpers::panic("Unimplemented special callback for kernel event!"); break;
}
}