mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-20 22:05:12 +00:00
orbis-kernel: sys_event: cache triggered events
add hp3d event stub
This commit is contained in:
parent
ce99af234c
commit
aaec1484a1
2 changed files with 67 additions and 52 deletions
|
|
@ -7,6 +7,8 @@
|
||||||
namespace orbis {
|
namespace orbis {
|
||||||
struct KQueue : orbis::File {
|
struct KQueue : orbis::File {
|
||||||
shared_cv cv;
|
shared_cv cv;
|
||||||
|
kstring name;
|
||||||
|
kvector<KEvent> triggeredEvents;
|
||||||
std::list<KNote, kallocator<KNote>> notes;
|
std::list<KNote, kallocator<KNote>> notes;
|
||||||
};
|
};
|
||||||
} // namespace orbis
|
} // namespace orbis
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ orbis::SysResult orbis::sys_kqueueex(Thread *thread, ptr<char> name,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fd = thread->tproc->fileDescriptors.insert(queue);
|
auto fd = thread->tproc->fileDescriptors.insert(queue);
|
||||||
|
if (name != nullptr) {
|
||||||
|
queue->name = name;
|
||||||
|
}
|
||||||
ORBIS_LOG_TODO(__FUNCTION__, name, flags, fd);
|
ORBIS_LOG_TODO(__FUNCTION__, name, flags, fd);
|
||||||
thread->retval[0] = fd;
|
thread->retval[0] = fd;
|
||||||
return {};
|
return {};
|
||||||
|
|
@ -181,6 +184,10 @@ static SysResult keventChange(KQueue *kq, KEvent &change, Thread *thread) {
|
||||||
nodeIt->triggered = true;
|
nodeIt->triggered = true;
|
||||||
nodeIt->event.data |= 1000ull << 16; // clock
|
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);
|
kq->cv.notify_all(kq->mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,9 +225,11 @@ orbis::SysResult orbis::sys_kevent(Thread *thread, sint fd,
|
||||||
for (auto &changePtr : std::span(changelist, nchanges)) {
|
for (auto &changePtr : std::span(changelist, nchanges)) {
|
||||||
KEvent change;
|
KEvent change;
|
||||||
ORBIS_RET_ON_ERROR(uread(change, &changePtr));
|
ORBIS_RET_ON_ERROR(uread(change, &changePtr));
|
||||||
ORBIS_LOG_TODO(__FUNCTION__, fd, change.ident, change.filter,
|
if (change.filter != kEvFiltUser) {
|
||||||
change.flags, change.fflags, change.data, change.udata);
|
ORBIS_LOG_NOTICE(__FUNCTION__, fd, change.ident, change.filter,
|
||||||
|
change.flags, change.fflags, change.data,
|
||||||
|
change.udata);
|
||||||
|
}
|
||||||
if (auto result = keventChange(kq.get(), change, thread);
|
if (auto result = keventChange(kq.get(), change, thread);
|
||||||
result.value() != 0) {
|
result.value() != 0) {
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -264,75 +273,79 @@ orbis::SysResult orbis::sys_kevent(Thread *thread, sint fd,
|
||||||
ErrorCode errorCode{};
|
ErrorCode errorCode{};
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
bool waitHack = false;
|
|
||||||
bool canSleep = true;
|
bool canSleep = true;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard lock(kq->mtx);
|
std::lock_guard lock(kq->mtx);
|
||||||
for (auto it = kq->notes.begin(); it != kq->notes.end();) {
|
while (result.size() < nevents && !kq->triggeredEvents.empty()) {
|
||||||
if (result.size() >= nevents) {
|
result.push_back(kq->triggeredEvents.back());
|
||||||
break;
|
kq->triggeredEvents.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ¬e = *it;
|
if (result.empty()) {
|
||||||
bool erase = false;
|
for (auto it = kq->notes.begin(); it != kq->notes.end();) {
|
||||||
{
|
auto ¬e = *it;
|
||||||
std::lock_guard lock(note.mutex);
|
bool erase = false;
|
||||||
|
{
|
||||||
|
std::lock_guard lock(note.mutex);
|
||||||
|
|
||||||
if (!note.triggered) {
|
if (!note.triggered) {
|
||||||
if (note.event.filter == kEvFiltRead) {
|
if (note.event.filter == kEvFiltRead) {
|
||||||
if (note.file->hostFd >= 0) {
|
if (note.file->hostFd >= 0) {
|
||||||
if (isReadEventTriggered(note.file->hostFd)) {
|
if (isReadEventTriggered(note.file->hostFd)) {
|
||||||
note.triggered = true;
|
note.triggered = true;
|
||||||
} else {
|
} else {
|
||||||
canSleep = false;
|
canSleep = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (note.event.filter == kEvFiltWrite) {
|
||||||
|
if (note.file->hostFd >= 0) {
|
||||||
|
if (isWriteEventTriggered(note.file->hostFd)) {
|
||||||
|
note.triggered = true;
|
||||||
|
} else {
|
||||||
|
canSleep = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (note.event.filter == kEvFiltWrite) {
|
}
|
||||||
if (note.file->hostFd >= 0) {
|
|
||||||
if (isWriteEventTriggered(note.file->hostFd)) {
|
if (note.enabled && note.triggered) {
|
||||||
note.triggered = true;
|
result.push_back(note.event);
|
||||||
} else {
|
|
||||||
canSleep = false;
|
if (note.event.filter == kEvFiltDisplay) {
|
||||||
}
|
note.triggered = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (note.event.flags & kEvDispatch) {
|
||||||
|
note.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (note.event.flags & kEvOneshot) {
|
||||||
|
erase = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (note.event.filter == kEvFiltRead ||
|
||||||
|
note.event.filter == kEvFiltWrite) {
|
||||||
|
note.triggered = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (note.enabled && note.triggered) {
|
if (erase) {
|
||||||
result.push_back(note.event);
|
it = kq->notes.erase(it);
|
||||||
|
} else {
|
||||||
if (note.event.filter == kEvFiltDisplay) {
|
++it;
|
||||||
note.triggered = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (note.event.flags & kEvDispatch) {
|
|
||||||
note.enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (note.event.flags & kEvOneshot) {
|
|
||||||
erase = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (note.event.filter == kEvFiltRead ||
|
|
||||||
note.event.filter == kEvFiltWrite) {
|
|
||||||
note.triggered = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (erase) {
|
while (result.size() > nevents) {
|
||||||
it = kq->notes.erase(it);
|
kq->triggeredEvents.push_back(result.back());
|
||||||
} else {
|
result.pop_back();
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result.empty()) {
|
if (!result.empty()) {
|
||||||
// if (waitHack) {
|
|
||||||
// std::this_thread::sleep_for(std::chrono::milliseconds(30));
|
|
||||||
// }
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue