diff options
author | bunnei <ericbunnie@gmail.com> | 2014-06-01 16:41:23 +0200 |
---|---|---|
committer | bunnei <ericbunnie@gmail.com> | 2014-06-01 16:41:23 +0200 |
commit | 7dd18a8df97f7497447ff121d8ad07c5a708a5c5 (patch) | |
tree | 0a229eaa4933f09cb68ff048f8c38d097e0a6e5d | |
parent | svc: updated waitSychronization to not overwrite handle on return, added stub for SleepThread (does nothing) (diff) | |
download | yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar.gz yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar.bz2 yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar.lz yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar.xz yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.tar.zst yuzu-7dd18a8df97f7497447ff121d8ad07c5a708a5c5.zip |
-rw-r--r-- | src/core/hle/service/gsp.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/core/hle/service/gsp.cpp b/src/core/hle/service/gsp.cpp index 575db86c1..2635a2eb8 100644 --- a/src/core/hle/service/gsp.cpp +++ b/src/core/hle/service/gsp.cpp @@ -8,6 +8,7 @@ #include "core/mem_map.h" #include "core/hle/hle.h" +#include "core/hle/kernel/event.h" #include "core/hle/service/gsp.h" #include "core/hw/lcd.h" @@ -52,6 +53,7 @@ void GX_FinishCommand(u32 thread_id) { namespace GSP_GPU { +Handle g_event_handle = 0; u32 g_thread_id = 0; enum { @@ -100,7 +102,20 @@ void ReadHWRegs(Service::Interface* self) { void RegisterInterruptRelayQueue(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); u32 flags = cmd_buff[1]; - u32 event_handle = cmd_buff[3]; // TODO(bunnei): Implement event handling + u32 event_handle = cmd_buff[3]; + + _assert_msg_(GSP, event_handle, "called, but event is NULL!"); + + g_event_handle = event_handle; + + Kernel::SetEventLocked(event_handle, false); + + // Hack - This function will permanently set the state of the GSP event such that GPU command + // synchronization barriers always passthrough. Correct solution would be to set this after the + // GPU as processed all queued up commands, but due to the emulator being single-threaded they + // will always be ready. + Kernel::SetPermanentLock(event_handle, true); + cmd_buff[2] = g_thread_id; // ThreadID } |