From 466cfe96e603bc11b706a39b0aaa1dd434f73e65 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 5 Sep 2023 14:28:52 +0300 Subject: [PATCH] more completed (but not finished) sceVideoOutAddFlipEvent --- src/Core/PS4/HLE/Graphics/video_out.cpp | 8 ++++---- .../PS4/HLE/Kernel/Objects/event_queue.cpp | 19 +++++++++++++++++++ src/Core/PS4/HLE/Kernel/Objects/event_queue.h | 9 ++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Core/PS4/HLE/Graphics/video_out.cpp b/src/Core/PS4/HLE/Graphics/video_out.cpp index d3dc804c..04a17f89 100644 --- a/src/Core/PS4/HLE/Graphics/video_out.cpp +++ b/src/Core/PS4/HLE/Graphics/video_out.cpp @@ -81,12 +81,12 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(LibKernel::EventQueues::SceKernelEqueue event.event.udata = udata; event.event.fflags = 0; event.event.data = 0; - // event.filter.delete_event_func = flip_event_delete_func;//called in sceKernelDeleteEvent - // event.filter.reset_event_func = flip_event_reset_func;//called in sceKernelWaitEqueue - // event.filter.trigger_event_func = flip_event_trigger_func;//called in sceKernelTriggerEvent + // event.filter.delete_event_func = flip_event_delete_func;//called in sceKernelDeleteEvent //TODO + // event.filter.reset_event_func = flip_event_reset_func;//called in sceKernelWaitEqueue //TODO + // event.filter.trigger_event_func = flip_event_trigger_func;//called in sceKernelTriggerEvent //TODO event.filter.data = ctx; - int result = 0; // sceKernelAddEvent(eq, event); + int result = eq->addEvent(event); ctx->m_flip_evtEq.push_back(eq); diff --git a/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp b/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp index 7f3ab986..7b60822d 100644 --- a/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp +++ b/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp @@ -1,5 +1,24 @@ #include "event_queue.h" +#include "debug.h" + namespace HLE::Kernel::Objects { EqueueInternal::~EqueueInternal() {} + +int EqueueInternal::addEvent(const EqueueEvent& event) { + Lib::LockMutexGuard lock(m_mutex); + + if (m_events.size() > 0) { + BREAKPOINT(); + } + // TODO check if event is already exists and return it. Currently we just add in m_events array + m_events.push_back(event); + + if (event.isTriggered) { + BREAKPOINT(); // we don't support that either yet + } + + return 0; +} + }; // namespace HLE::Kernel::Objects \ No newline at end of file diff --git a/src/Core/PS4/HLE/Kernel/Objects/event_queue.h b/src/Core/PS4/HLE/Kernel/Objects/event_queue.h index f88e8442..6651107c 100644 --- a/src/Core/PS4/HLE/Kernel/Objects/event_queue.h +++ b/src/Core/PS4/HLE/Kernel/Objects/event_queue.h @@ -1,7 +1,8 @@ #pragma once #include - +#include #include +#include namespace HLE::Kernel::Objects { @@ -60,12 +61,14 @@ struct EqueueEvent { }; class EqueueInternal { - public: + public: EqueueInternal() = default; virtual ~EqueueInternal(); void setName(const std::string& m_name) { this->m_name = m_name; } - + int addEvent(const EqueueEvent& event); private: std::string m_name; + Lib::Mutex m_mutex; + std::vector m_events; }; }; // namespace HLE::Kernel::Objects \ No newline at end of file