From 28ceb7471de63ac78bb0ef3796a90c3317b7b982 Mon Sep 17 00:00:00 2001 From: DH Date: Mon, 25 Nov 2024 03:06:33 +0300 Subject: [PATCH] kevent: fix graphics core events --- orbis-kernel/src/sys/sys_event.cpp | 10 ++++------ rpcsx/gpu/Pipe.cpp | 26 ++++++++++++++++++++++---- rpcsx/iodev/dce.cpp | 14 +++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/orbis-kernel/src/sys/sys_event.cpp b/orbis-kernel/src/sys/sys_event.cpp index fa77c2309..23749d511 100644 --- a/orbis-kernel/src/sys/sys_event.cpp +++ b/orbis-kernel/src/sys/sys_event.cpp @@ -184,10 +184,6 @@ static SysResult keventChange(KQueue *kq, KEvent &change, Thread *thread) { nodeIt->triggered = true; nodeIt->event.data |= 1000ull << 16; // clock - kq->cv.notify_all(kq->mtx); - } else if (change.filter == kEvFiltGraphicsCore && change.ident == 0x41) { - // hp3d idle - nodeIt->triggered = true; kq->cv.notify_all(kq->mtx); } else if (g_context.fwType == FwType::Ps5 && change.filter == kEvFiltGraphicsCore && change.ident == 0) { @@ -316,8 +312,10 @@ orbis::SysResult orbis::sys_kevent(Thread *thread, sint fd, if (note.enabled && note.triggered) { result.push_back(note.event); - if (note.event.filter == kEvFiltDisplay && - note.event.ident >> 48 != 0x6301) { + if (note.event.filter == kEvFiltDisplay) { + note.triggered = false; + } else if (note.event.filter == kEvFiltGraphicsCore && + note.event.ident != 0x84) { note.triggered = false; } diff --git a/rpcsx/gpu/Pipe.cpp b/rpcsx/gpu/Pipe.cpp index 8b6f5eae0..601860d6f 100644 --- a/rpcsx/gpu/Pipe.cpp +++ b/rpcsx/gpu/Pipe.cpp @@ -344,8 +344,15 @@ bool ComputePipe::releaseMem(Ring &ring) { } if (intSel) { - orbis::g_context.deviceEventEmitter->emit(orbis::kEvFiltGraphicsCore, 0, - kGcEventCompute0RelMem + index); + orbis::g_context.deviceEventEmitter->emit( + orbis::kEvFiltGraphicsCore, + [=, this](orbis::KNote *note) -> std::optional { + if (note->event.ident == kGcEventCompute0RelMem + index) { + return dataLo | (static_cast(dataHi) << 32); + } + + return {}; + }); } return true; @@ -1364,8 +1371,19 @@ bool GraphicsPipe::eventWriteEop(Ring &ring) { } if (intSel != 0) { - orbis::g_context.deviceEventEmitter->emit(orbis::kEvFiltGraphicsCore, 0, - kGcEventGfxEop); + orbis::g_context.deviceEventEmitter->emit( + orbis::kEvFiltGraphicsCore, + [=](orbis::KNote *note) -> std::optional { + if (note->event.ident == kGcEventGfxEop) { + return dataLo | (static_cast(dataHi) << 32); + } + + if (note->event.ident == kGcEventGfxEop + 1) { // hp3d + return dataLo | (static_cast(dataHi) << 32); + } + + return {}; + }); } if (intSel == 2 && dataSel == 2) { diff --git a/rpcsx/iodev/dce.cpp b/rpcsx/iodev/dce.cpp index b5c5252e9..30f21b2d2 100644 --- a/rpcsx/iodev/dce.cpp +++ b/rpcsx/iodev/dce.cpp @@ -488,7 +488,19 @@ static orbis::ErrorCode dce_ioctl(orbis::File *file, std::uint64_t request, } else if (args->id == 0x1e) { // TODO return {}; - } else if (args->id != 1) { // used during open/close + } else if (args->id == 1) { + + // Mode set + orbis::g_context.deviceEventEmitter->emit( + orbis::kEvFiltDisplay, + [](orbis::KNote *note) -> std::optional { + if ((note->event.ident >> 48) == 0x64) { + return 0; + } + return {}; + }); + + } else { // used during open/close ORBIS_LOG_NOTICE("dce: UNIMPLEMENTED FlipControl", args->id, args->arg2, args->ptr, args->size);