mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	Merge pull request #1803 from DarkLordZach/k-able-event
kernel: Divide Event into ReadableEvent and WritableEvent
This commit is contained in:
		| @@ -9,9 +9,11 @@ | ||||
| #include "audio_core/audio_renderer.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/shared_memory.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/acc/profile_manager.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applet_ae.h" | ||||
| @@ -208,8 +210,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     launchable_event = | ||||
|         Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "ISelfController:LaunchableEvent"); | ||||
|     launchable_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                               "ISelfController:LaunchableEvent"); | ||||
| } | ||||
|  | ||||
| ISelfController::~ISelfController() = default; | ||||
| @@ -295,11 +297,11 @@ void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) { | ||||
| void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called"); | ||||
|  | ||||
|     launchable_event->Signal(); | ||||
|     launchable_event.writable->Signal(); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(launchable_event); | ||||
|     rb.PushCopyObjects(launchable_event.readable); | ||||
| } | ||||
|  | ||||
| void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { | ||||
| @@ -348,36 +350,38 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c | ||||
|  | ||||
| AppletMessageQueue::AppletMessageQueue() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     on_new_message = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, | ||||
|                                            "AMMessageQueue:OnMessageRecieved"); | ||||
|     on_operation_mode_changed = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                                       "AMMessageQueue:OperationModeChanged"); | ||||
|     on_new_message = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                             "AMMessageQueue:OnMessageRecieved"); | ||||
|     on_operation_mode_changed = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::OneShot, "AMMessageQueue:OperationModeChanged"); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::~AppletMessageQueue() = default; | ||||
|  | ||||
| const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetMesssageRecieveEvent() const { | ||||
|     return on_new_message; | ||||
| const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent() | ||||
|     const { | ||||
|     return on_new_message.readable; | ||||
| } | ||||
|  | ||||
| const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetOperationModeChangedEvent() const { | ||||
|     return on_operation_mode_changed; | ||||
| const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() | ||||
|     const { | ||||
|     return on_operation_mode_changed.readable; | ||||
| } | ||||
|  | ||||
| void AppletMessageQueue::PushMessage(AppletMessage msg) { | ||||
|     messages.push(msg); | ||||
|     on_new_message->Signal(); | ||||
|     on_new_message.writable->Signal(); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | ||||
|     if (messages.empty()) { | ||||
|         on_new_message->Clear(); | ||||
|         on_new_message.writable->Clear(); | ||||
|         return AppletMessage::NoMessage; | ||||
|     } | ||||
|     auto msg = messages.front(); | ||||
|     messages.pop(); | ||||
|     if (messages.empty()) { | ||||
|         on_new_message->Clear(); | ||||
|         on_new_message.writable->Clear(); | ||||
|     } | ||||
|     return msg; | ||||
| } | ||||
| @@ -389,7 +393,7 @@ std::size_t AppletMessageQueue::GetMessageCount() const { | ||||
| void AppletMessageQueue::OperationModeChanged() { | ||||
|     PushMessage(AppletMessage::OperationModeChanged); | ||||
|     PushMessage(AppletMessage::PerformanceModeChanged); | ||||
|     on_operation_mode_changed->Signal(); | ||||
|     on_operation_mode_changed.writable->Signal(); | ||||
| } | ||||
|  | ||||
| ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) | ||||
| @@ -426,9 +430,6 @@ ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_q | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "ICommonStateGetter:Event"); | ||||
| } | ||||
|  | ||||
| ICommonStateGetter::~ICommonStateGetter() = default; | ||||
| @@ -564,8 +565,8 @@ private: | ||||
|     void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_DEBUG(Service_AM, "called"); | ||||
|  | ||||
|         applet->GetBroker().SignalStateChanged(); | ||||
|         const auto event = applet->GetBroker().GetStateChangedEvent(); | ||||
|         event->Signal(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|   | ||||
| @@ -6,12 +6,9 @@ | ||||
|  | ||||
| #include <memory> | ||||
| #include <queue> | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class Event; | ||||
| } | ||||
|  | ||||
| namespace Service { | ||||
| namespace NVFlinger { | ||||
| class NVFlinger; | ||||
| @@ -52,8 +49,8 @@ public: | ||||
|     AppletMessageQueue(); | ||||
|     ~AppletMessageQueue(); | ||||
|  | ||||
|     const Kernel::SharedPtr<Kernel::Event>& GetMesssageRecieveEvent() const; | ||||
|     const Kernel::SharedPtr<Kernel::Event>& GetOperationModeChangedEvent() const; | ||||
|     const Kernel::SharedPtr<Kernel::ReadableEvent>& GetMesssageRecieveEvent() const; | ||||
|     const Kernel::SharedPtr<Kernel::ReadableEvent>& GetOperationModeChangedEvent() const; | ||||
|     void PushMessage(AppletMessage msg); | ||||
|     AppletMessage PopMessage(); | ||||
|     std::size_t GetMessageCount() const; | ||||
| @@ -61,8 +58,8 @@ public: | ||||
|  | ||||
| private: | ||||
|     std::queue<AppletMessage> messages; | ||||
|     Kernel::SharedPtr<Kernel::Event> on_new_message; | ||||
|     Kernel::SharedPtr<Kernel::Event> on_operation_mode_changed; | ||||
|     Kernel::EventPair on_new_message; | ||||
|     Kernel::EventPair on_operation_mode_changed; | ||||
| }; | ||||
|  | ||||
| class IWindowController final : public ServiceFramework<IWindowController> { | ||||
| @@ -122,7 +119,7 @@ private: | ||||
|     void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     std::shared_ptr<NVFlinger::NVFlinger> nvflinger; | ||||
|     Kernel::SharedPtr<Kernel::Event> launchable_event; | ||||
|     Kernel::EventPair launchable_event; | ||||
|     u32 idle_time_detection_extension = 0; | ||||
| }; | ||||
|  | ||||
| @@ -151,7 +148,6 @@ private: | ||||
|     void GetBootMode(Kernel::HLERequestContext& ctx); | ||||
|     void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> event; | ||||
|     std::shared_ptr<AppletMessageQueue> msg_queue; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -5,8 +5,9 @@ | ||||
| #include <cstring> | ||||
| #include "common/assert.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/server_port.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| @@ -14,11 +15,11 @@ namespace Service::AM::Applets { | ||||
|  | ||||
| AppletDataBroker::AppletDataBroker() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     state_changed_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                                 "ILibraryAppletAccessor:StateChangedEvent"); | ||||
|     pop_out_data_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                                "ILibraryAppletAccessor:PopDataOutEvent"); | ||||
|     pop_interactive_out_data_event = Kernel::Event::Create( | ||||
|     state_changed_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:StateChangedEvent"); | ||||
|     pop_out_data_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopDataOutEvent"); | ||||
|     pop_interactive_out_data_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | ||||
| } | ||||
|  | ||||
| @@ -66,7 +67,7 @@ void AppletDataBroker::PushNormalDataFromGame(IStorage storage) { | ||||
|  | ||||
| void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { | ||||
|     out_channel.push(std::make_unique<IStorage>(storage)); | ||||
|     pop_out_data_event->Signal(); | ||||
|     pop_out_data_event.writable->Signal(); | ||||
| } | ||||
|  | ||||
| void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | ||||
| @@ -75,23 +76,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | ||||
|  | ||||
| void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { | ||||
|     out_interactive_channel.push(std::make_unique<IStorage>(storage)); | ||||
|     pop_interactive_out_data_event->Signal(); | ||||
|     pop_interactive_out_data_event.writable->Signal(); | ||||
| } | ||||
|  | ||||
| void AppletDataBroker::SignalStateChanged() const { | ||||
|     state_changed_event->Signal(); | ||||
|     state_changed_event.writable->Signal(); | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetNormalDataEvent() const { | ||||
|     return pop_out_data_event; | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const { | ||||
|     return pop_out_data_event.readable; | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetInteractiveDataEvent() const { | ||||
|     return pop_interactive_out_data_event; | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { | ||||
|     return pop_interactive_out_data_event.readable; | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetStateChangedEvent() const { | ||||
|     return state_changed_event; | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const { | ||||
|     return state_changed_event.readable; | ||||
| } | ||||
|  | ||||
| Applet::Applet() = default; | ||||
|   | ||||
| @@ -8,13 +8,10 @@ | ||||
| #include <queue> | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
|  | ||||
| union ResultCode; | ||||
|  | ||||
| namespace Kernel { | ||||
| class Event; | ||||
| } | ||||
|  | ||||
| namespace Service::AM { | ||||
|  | ||||
| class IStorage; | ||||
| @@ -40,9 +37,9 @@ public: | ||||
|  | ||||
|     void SignalStateChanged() const; | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> GetNormalDataEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::Event> GetInteractiveDataEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::Event> GetStateChangedEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetNormalDataEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetInteractiveDataEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetStateChangedEvent() const; | ||||
|  | ||||
| private: | ||||
|     // Queues are named from applet's perspective | ||||
| @@ -59,13 +56,13 @@ private: | ||||
|     // PopInteractiveDataToGame and PushInteractiveDataFromApplet | ||||
|     std::queue<std::unique_ptr<IStorage>> out_interactive_channel; | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> state_changed_event; | ||||
|     Kernel::EventPair state_changed_event; | ||||
|  | ||||
|     // Signaled on PushNormalDataFromApplet | ||||
|     Kernel::SharedPtr<Kernel::Event> pop_out_data_event; | ||||
|     Kernel::EventPair pop_out_data_event; | ||||
|  | ||||
|     // Signaled on PushInteractiveDataFromApplet | ||||
|     Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event; | ||||
|     Kernel::EventPair pop_interactive_out_data_event; | ||||
| }; | ||||
|  | ||||
| class Applet { | ||||
|   | ||||
| @@ -13,8 +13,10 @@ | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/aoc/aoc_u.h" | ||||
| #include "core/hle/service/filesystem/filesystem.h" | ||||
| #include "core/loader/loader.h" | ||||
| @@ -61,8 +63,8 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     aoc_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, | ||||
|                                              "GetAddOnContentListChanged:Event"); | ||||
|     aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                               "GetAddOnContentListChanged:Event"); | ||||
| } | ||||
|  | ||||
| AOC_U::~AOC_U() = default; | ||||
| @@ -144,7 +146,7 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(aoc_change_event); | ||||
|     rb.PushCopyObjects(aoc_change_event.readable); | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager) { | ||||
|   | ||||
| @@ -6,6 +6,10 @@ | ||||
|  | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class WritableEvent; | ||||
| } | ||||
|  | ||||
| namespace Service::AOC { | ||||
|  | ||||
| class AOC_U final : public ServiceFramework<AOC_U> { | ||||
| @@ -21,7 +25,7 @@ private: | ||||
|     void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     std::vector<u64> add_on_content; | ||||
|     Kernel::SharedPtr<Kernel::Event> aoc_change_event; | ||||
|     Kernel::EventPair aoc_change_event; | ||||
| }; | ||||
|  | ||||
| /// Registers all AOC services with the specified service manager. | ||||
|   | ||||
| @@ -13,8 +13,10 @@ | ||||
| #include "common/swap.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/audio/audout_u.h" | ||||
| #include "core/memory.h" | ||||
|  | ||||
| @@ -67,11 +69,12 @@ public: | ||||
|  | ||||
|         // This is the event handle used to check if the audio buffer was released | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         buffer_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioOutBufferReleased"); | ||||
|         buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                               "IAudioOutBufferReleased"); | ||||
|  | ||||
|         stream = audio_core.OpenStream(audio_params.sample_rate, audio_params.channel_count, | ||||
|                                        std::move(unique_name), [=]() { buffer_event->Signal(); }); | ||||
|                                        std::move(unique_name), | ||||
|                                        [=]() { buffer_event.writable->Signal(); }); | ||||
|     } | ||||
|  | ||||
| private: | ||||
| @@ -121,7 +124,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(buffer_event); | ||||
|         rb.PushCopyObjects(buffer_event.readable); | ||||
|     } | ||||
|  | ||||
|     void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { | ||||
| @@ -187,8 +190,8 @@ private: | ||||
|  | ||||
|     AudoutParams audio_params{}; | ||||
|  | ||||
|     /// This is the evend handle used to check if the audio buffer was released | ||||
|     Kernel::SharedPtr<Kernel::Event> buffer_event; | ||||
|     /// This is the event handle used to check if the audio buffer was released | ||||
|     Kernel::EventPair buffer_event; | ||||
| }; | ||||
|  | ||||
| void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) { | ||||
|   | ||||
| @@ -12,8 +12,10 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/audio/audren_u.h" | ||||
|  | ||||
| namespace Service::Audio { | ||||
| @@ -41,14 +43,14 @@ public: | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         system_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioRenderer:SystemEvent"); | ||||
|         renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event); | ||||
|         system_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                               "IAudioRenderer:SystemEvent"); | ||||
|         renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event.writable); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void UpdateAudioCallback() { | ||||
|         system_event->Signal(); | ||||
|         system_event.writable->Signal(); | ||||
|     } | ||||
|  | ||||
|     void GetSampleRate(Kernel::HLERequestContext& ctx) { | ||||
| @@ -112,7 +114,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(system_event); | ||||
|         rb.PushCopyObjects(system_event.readable); | ||||
|     } | ||||
|  | ||||
|     void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { | ||||
| @@ -135,7 +137,7 @@ private: | ||||
|         rb.Push(rendering_time_limit_percent); | ||||
|     } | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> system_event; | ||||
|     Kernel::EventPair system_event; | ||||
|     std::unique_ptr<AudioCore::AudioRenderer> renderer; | ||||
|     u32 rendering_time_limit_percent = 100; | ||||
| }; | ||||
| @@ -162,8 +164,8 @@ public: | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         buffer_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                              "IAudioOutBufferReleasedEvent"); | ||||
|         buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                               "IAudioOutBufferReleasedEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
| @@ -207,11 +209,11 @@ private: | ||||
|     void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_Audio, "(STUBBED) called"); | ||||
|  | ||||
|         buffer_event->Signal(); | ||||
|         buffer_event.writable->Signal(); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(buffer_event); | ||||
|         rb.PushCopyObjects(buffer_event.readable); | ||||
|     } | ||||
|  | ||||
|     void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { | ||||
| @@ -222,7 +224,7 @@ private: | ||||
|         rb.Push<u32>(1); | ||||
|     } | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> buffer_event; | ||||
|     Kernel::EventPair buffer_event; | ||||
|  | ||||
| }; // namespace Audio | ||||
|  | ||||
|   | ||||
| @@ -4,8 +4,10 @@ | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/btdrv/btdrv.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
| @@ -30,20 +32,22 @@ public: | ||||
|         }; | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         register_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                                 "BT:RegisterEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void RegisterEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         register_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "BT:RegisterEvent"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(register_event); | ||||
|         rb.PushCopyObjects(register_event.readable); | ||||
|     } | ||||
|     Kernel::SharedPtr<Kernel::Event> register_event; | ||||
|  | ||||
|     Kernel::EventPair register_event; | ||||
| }; | ||||
|  | ||||
| class BtDrv final : public ServiceFramework<BtDrv> { | ||||
|   | ||||
| @@ -6,8 +6,10 @@ | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/hle_ipc.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/btm/btm.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| @@ -53,53 +55,55 @@ public: | ||||
|         }; | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                             "IBtmUserCore:ScanEvent"); | ||||
|         connection_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConnectionEvent"); | ||||
|         service_discovery = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); | ||||
|         config_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                               "IBtmUserCore:ConfigEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void GetScanEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         scan_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ScanEvent"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(scan_event); | ||||
|         rb.PushCopyObjects(scan_event.readable); | ||||
|     } | ||||
|  | ||||
|     void GetConnectionEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         connection_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                                  "IBtmUserCore:ConnectionEvent"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(connection_event); | ||||
|         rb.PushCopyObjects(connection_event.readable); | ||||
|     } | ||||
|  | ||||
|     void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         service_discovery = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(service_discovery); | ||||
|         rb.PushCopyObjects(service_discovery.readable); | ||||
|     } | ||||
|  | ||||
|     void GetConfigEvent(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         config_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConfigEvent"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(config_event); | ||||
|         rb.PushCopyObjects(config_event.readable); | ||||
|     } | ||||
|     Kernel::SharedPtr<Kernel::Event> scan_event; | ||||
|     Kernel::SharedPtr<Kernel::Event> connection_event; | ||||
|     Kernel::SharedPtr<Kernel::Event> service_discovery; | ||||
|     Kernel::SharedPtr<Kernel::Event> config_event; | ||||
|  | ||||
|     Kernel::EventPair scan_event; | ||||
|     Kernel::EventPair connection_event; | ||||
|     Kernel::EventPair service_discovery; | ||||
|     Kernel::EventPair config_event; | ||||
| }; | ||||
|  | ||||
| class BTM_USR final : public ServiceFramework<BTM_USR> { | ||||
|   | ||||
| @@ -12,7 +12,9 @@ | ||||
| #include "core/core.h" | ||||
| #include "core/core_timing.h" | ||||
| #include "core/frontend/input.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/hid/controllers/npad.h" | ||||
| #include "core/settings.h" | ||||
|  | ||||
| @@ -167,8 +169,8 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | ||||
|  | ||||
| void Controller_NPad::OnInit() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     styleset_changed_event = | ||||
|         Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); | ||||
|     styleset_changed_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); | ||||
|  | ||||
|     if (!IsControllerActivated()) { | ||||
|         return; | ||||
| @@ -494,7 +496,7 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | ||||
|             had_controller_update = true; | ||||
|         } | ||||
|         if (had_controller_update) { | ||||
|             styleset_changed_event->Signal(); | ||||
|             styleset_changed_event.writable->Signal(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -509,7 +511,7 @@ std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const { | ||||
| } | ||||
|  | ||||
| void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { | ||||
|     styleset_changed_event->Signal(); | ||||
|     styleset_changed_event.writable->Signal(); | ||||
|     hold_type = joy_hold_type; | ||||
| } | ||||
|  | ||||
| @@ -539,11 +541,11 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | ||||
|     last_processed_vibration = vibrations.back(); | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::Event> Controller_NPad::GetStyleSetChangedEvent() const { | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { | ||||
|     // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should | ||||
|     // be signalled at least once, and signaled after a new controller is connected? | ||||
|     styleset_changed_event->Signal(); | ||||
|     return styleset_changed_event; | ||||
|     styleset_changed_event.writable->Signal(); | ||||
|     return styleset_changed_event.readable; | ||||
| } | ||||
|  | ||||
| Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | ||||
|   | ||||
| @@ -8,7 +8,8 @@ | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_types.h" | ||||
| #include "core/frontend/input.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/hid/controllers/controller_base.h" | ||||
| #include "core/settings.h" | ||||
|  | ||||
| @@ -108,7 +109,7 @@ public: | ||||
|     void VibrateController(const std::vector<u32>& controller_ids, | ||||
|                            const std::vector<Vibration>& vibrations); | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> GetStyleSetChangedEvent() const; | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetStyleSetChangedEvent() const; | ||||
|     Vibration GetLastVibration() const; | ||||
|  | ||||
|     void AddNewController(NPadControllerType controller); | ||||
| @@ -303,7 +304,7 @@ private: | ||||
|         sticks; | ||||
|     std::vector<u32> supported_npad_id_types{}; | ||||
|     NpadHoldType hold_type{NpadHoldType::Vertical}; | ||||
|     Kernel::SharedPtr<Kernel::Event> styleset_changed_event; | ||||
|     Kernel::EventPair styleset_changed_event; | ||||
|     Vibration last_processed_vibration{}; | ||||
|     std::array<ControllerHolder, 10> connected_controllers{}; | ||||
|     bool can_controllers_vibrate{true}; | ||||
|   | ||||
| @@ -13,8 +13,9 @@ | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/client_session.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/shared_memory.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/hid/hid.h" | ||||
| #include "core/hle/service/hid/irs.h" | ||||
| #include "core/hle/service/hid/xcd.h" | ||||
|   | ||||
| @@ -7,7 +7,9 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/lock.h" | ||||
| #include "core/hle/service/hid/hid.h" | ||||
| #include "core/hle/service/nfp/nfp.h" | ||||
| @@ -23,8 +25,8 @@ constexpr ResultCode ERR_TAG_FAILED(ErrorModule::NFP, | ||||
| Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | ||||
|     : ServiceFramework(name), module(std::move(module)) { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     nfc_tag_load = | ||||
|         Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:NFCTagDetected"); | ||||
|     nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                           "IUser:NFCTagDetected"); | ||||
| } | ||||
|  | ||||
| Module::Interface::~Interface() = default; | ||||
| @@ -63,10 +65,10 @@ public: | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         deactivate_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); | ||||
|         availability_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                                           "IUser:AvailabilityChangeEvent"); | ||||
|         deactivate_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); | ||||
|         availability_change_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::OneShot, "IUser:AvailabilityChangeEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
| @@ -164,7 +166,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(deactivate_event); | ||||
|         rb.PushCopyObjects(deactivate_event.readable); | ||||
|     } | ||||
|  | ||||
|     void StopDetection(Kernel::HLERequestContext& ctx) { | ||||
| @@ -173,7 +175,7 @@ private: | ||||
|         switch (device_state) { | ||||
|         case DeviceState::TagFound: | ||||
|         case DeviceState::TagNearby: | ||||
|             deactivate_event->Signal(); | ||||
|             deactivate_event.writable->Signal(); | ||||
|             device_state = DeviceState::Initialized; | ||||
|             break; | ||||
|         case DeviceState::SearchingForTag: | ||||
| @@ -264,7 +266,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(availability_change_event); | ||||
|         rb.PushCopyObjects(availability_change_event.readable); | ||||
|     } | ||||
|  | ||||
|     void GetRegisterInfo(Kernel::HLERequestContext& ctx) { | ||||
| @@ -319,8 +321,8 @@ private: | ||||
|     const u32 npad_id{0}; // Player 1 controller | ||||
|     State state{State::NonInitialized}; | ||||
|     DeviceState device_state{DeviceState::Initialized}; | ||||
|     Kernel::SharedPtr<Kernel::Event> deactivate_event; | ||||
|     Kernel::SharedPtr<Kernel::Event> availability_change_event; | ||||
|     Kernel::EventPair deactivate_event; | ||||
|     Kernel::EventPair availability_change_event; | ||||
|     const Module::Interface& nfp_interface; | ||||
| }; | ||||
|  | ||||
| @@ -339,12 +341,14 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | ||||
|     } | ||||
|  | ||||
|     std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); | ||||
|     nfc_tag_load->Signal(); | ||||
|     nfc_tag_load.writable->Signal(); | ||||
|     return true; | ||||
| } | ||||
| const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const { | ||||
|     return nfc_tag_load; | ||||
|  | ||||
| const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const { | ||||
|     return nfc_tag_load.readable; | ||||
| } | ||||
|  | ||||
| const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { | ||||
|     return amiibo; | ||||
| } | ||||
|   | ||||
| @@ -6,7 +6,8 @@ | ||||
|  | ||||
| #include <array> | ||||
| #include <vector> | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service::NFP { | ||||
| @@ -33,11 +34,11 @@ public: | ||||
|  | ||||
|         void CreateUserInterface(Kernel::HLERequestContext& ctx); | ||||
|         bool LoadAmiibo(const std::vector<u8>& buffer); | ||||
|         const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const; | ||||
|         const Kernel::SharedPtr<Kernel::ReadableEvent>& GetNFCEvent() const; | ||||
|         const AmiiboFile& GetAmiiboBuffer() const; | ||||
|  | ||||
|     private: | ||||
|         Kernel::SharedPtr<Kernel::Event> nfc_tag_load{}; | ||||
|         Kernel::EventPair nfc_tag_load{}; | ||||
|         AmiiboFile amiibo{}; | ||||
|  | ||||
|     protected: | ||||
|   | ||||
| @@ -4,7 +4,9 @@ | ||||
|  | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nifm/nifm.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| @@ -56,8 +58,10 @@ public: | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         event1 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event1"); | ||||
|         event2 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event2"); | ||||
|         event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                         "IRequest:Event1"); | ||||
|         event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                         "IRequest:Event2"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
| @@ -88,7 +92,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 2}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(event1, event2); | ||||
|         rb.PushCopyObjects(event1.readable, event2.readable); | ||||
|     } | ||||
|  | ||||
|     void Cancel(Kernel::HLERequestContext& ctx) { | ||||
| @@ -105,7 +109,7 @@ private: | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|     } | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> event1, event2; | ||||
|     Kernel::EventPair event1, event2; | ||||
| }; | ||||
|  | ||||
| class INetworkProfile final : public ServiceFramework<INetworkProfile> { | ||||
|   | ||||
| @@ -6,7 +6,9 @@ | ||||
| #include <ctime> | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nim/nim.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
| @@ -138,19 +140,18 @@ public: | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|         finished_event = | ||||
|             Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||||
|                                   "IEnsureNetworkClockAvailabilityService:FinishEvent"); | ||||
|         finished_event = Kernel::WritableEvent::CreateEventPair( | ||||
|             kernel, Kernel::ResetType::OneShot, | ||||
|             "IEnsureNetworkClockAvailabilityService:FinishEvent"); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     Kernel::SharedPtr<Kernel::Event> finished_event; | ||||
|     Kernel::EventPair finished_event; | ||||
|  | ||||
|     void StartTask(Kernel::HLERequestContext& ctx) { | ||||
|         // No need to connect to the internet, just finish the task straight away. | ||||
|         LOG_DEBUG(Service_NIM, "called"); | ||||
|  | ||||
|         finished_event->Signal(); | ||||
|         finished_event.writable->Signal(); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|     } | ||||
| @@ -160,7 +161,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushCopyObjects(finished_event); | ||||
|         rb.PushCopyObjects(finished_event.readable); | ||||
|     } | ||||
|  | ||||
|     void GetResult(Kernel::HLERequestContext& ctx) { | ||||
| @@ -172,8 +173,7 @@ private: | ||||
|  | ||||
|     void Cancel(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_DEBUG(Service_NIM, "called"); | ||||
|  | ||||
|         finished_event->Clear(); | ||||
|         finished_event.writable->Clear(); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|     } | ||||
|   | ||||
| @@ -6,7 +6,9 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nvdrv/interface.h" | ||||
| #include "core/hle/service/nvdrv/nvdrv.h" | ||||
|  | ||||
| @@ -69,7 +71,7 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) { | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(query_event); | ||||
|     rb.PushCopyObjects(query_event.readable); | ||||
|     rb.Push<u32>(0); | ||||
| } | ||||
|  | ||||
| @@ -127,7 +129,8 @@ NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name) | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     query_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "NVDRV::query_event"); | ||||
|     query_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||||
|                                                          "NVDRV::query_event"); | ||||
| } | ||||
|  | ||||
| NVDRV::~NVDRV() = default; | ||||
|   | ||||
| @@ -5,10 +5,13 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/service/nvdrv/nvdrv.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class WritableEvent; | ||||
| } | ||||
|  | ||||
| namespace Service::Nvidia { | ||||
|  | ||||
| class NVDRV final : public ServiceFramework<NVDRV> { | ||||
| @@ -31,7 +34,7 @@ private: | ||||
|  | ||||
|     u64 pid{}; | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> query_event; | ||||
|     Kernel::EventPair query_event; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::Nvidia | ||||
|   | ||||
| @@ -7,14 +7,17 @@ | ||||
| #include "common/assert.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nvflinger/buffer_queue.h" | ||||
|  | ||||
| namespace Service::NVFlinger { | ||||
|  | ||||
| BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     buffer_wait_event = | ||||
|         Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle"); | ||||
|     buffer_wait_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, | ||||
|                                                                "BufferQueue NativeHandle"); | ||||
| } | ||||
|  | ||||
| BufferQueue::~BufferQueue() = default; | ||||
| @@ -28,7 +31,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | ||||
|     buffer.status = Buffer::Status::Free; | ||||
|  | ||||
|     queue.emplace_back(buffer); | ||||
|     buffer_wait_event->Signal(); | ||||
|     buffer_wait_event.writable->Signal(); | ||||
| } | ||||
|  | ||||
| std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { | ||||
| @@ -87,7 +90,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | ||||
|     ASSERT(itr->status == Buffer::Status::Acquired); | ||||
|     itr->status = Buffer::Status::Free; | ||||
|  | ||||
|     buffer_wait_event->Signal(); | ||||
|     buffer_wait_event.writable->Signal(); | ||||
| } | ||||
|  | ||||
| u32 BufferQueue::Query(QueryType type) { | ||||
| @@ -104,4 +107,12 @@ u32 BufferQueue::Query(QueryType type) { | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { | ||||
|     return buffer_wait_event.writable; | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const { | ||||
|     return buffer_wait_event.readable; | ||||
| } | ||||
|  | ||||
| } // namespace Service::NVFlinger | ||||
|   | ||||
| @@ -10,7 +10,8 @@ | ||||
| #include "common/common_funcs.h" | ||||
| #include "common/math_util.h" | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
|  | ||||
| namespace CoreTiming { | ||||
| struct EventType; | ||||
| @@ -86,16 +87,16 @@ public: | ||||
|         return id; | ||||
|     } | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::Event> GetBufferWaitEvent() const { | ||||
|         return buffer_wait_event; | ||||
|     } | ||||
|     Kernel::SharedPtr<Kernel::WritableEvent> GetWritableBufferWaitEvent() const; | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetBufferWaitEvent() const; | ||||
|  | ||||
| private: | ||||
|     u32 id; | ||||
|     u64 layer_id; | ||||
|  | ||||
|     std::vector<Buffer> queue; | ||||
|     Kernel::SharedPtr<Kernel::Event> buffer_wait_event; | ||||
|     Kernel::EventPair buffer_wait_event; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::NVFlinger | ||||
|   | ||||
| @@ -13,6 +13,9 @@ | ||||
| #include "core/core.h" | ||||
| #include "core/core_timing.h" | ||||
| #include "core/core_timing_util.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | ||||
| #include "core/hle/service/nvdrv/nvdrv.h" | ||||
| #include "core/hle/service/nvflinger/buffer_queue.h" | ||||
| @@ -83,9 +86,8 @@ u32 NVFlinger::GetBufferQueueId(u64 display_id, u64 layer_id) { | ||||
|     return layer.buffer_queue->GetId(); | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::Event> NVFlinger::GetVsyncEvent(u64 display_id) { | ||||
|     const auto& display = GetDisplay(display_id); | ||||
|     return display.vsync_event; | ||||
| Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) { | ||||
|     return GetDisplay(display_id).vsync_event.readable; | ||||
| } | ||||
|  | ||||
| std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { | ||||
| @@ -117,7 +119,7 @@ Layer& NVFlinger::GetLayer(u64 display_id, u64 layer_id) { | ||||
| void NVFlinger::Compose() { | ||||
|     for (auto& display : displays) { | ||||
|         // Trigger vsync for this display at the end of drawing | ||||
|         SCOPE_EXIT({ display.vsync_event->Signal(); }); | ||||
|         SCOPE_EXIT({ display.vsync_event.writable->Signal(); }); | ||||
|  | ||||
|         // Don't do anything for displays without layers. | ||||
|         if (display.layers.empty()) | ||||
| @@ -164,7 +166,8 @@ Layer::~Layer() = default; | ||||
|  | ||||
| Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     vsync_event = Kernel::Event::Create(kernel, Kernel::ResetType::Pulse, "Display VSync Event"); | ||||
|     vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Pulse, | ||||
|                                                          fmt::format("Display VSync Event {}", id)); | ||||
| } | ||||
|  | ||||
| Display::~Display() = default; | ||||
|   | ||||
| @@ -10,12 +10,17 @@ | ||||
| #include <vector> | ||||
|  | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
|  | ||||
| namespace CoreTiming { | ||||
| struct EventType; | ||||
| } | ||||
|  | ||||
| namespace Kernel { | ||||
| class ReadableEvent; | ||||
| class WritableEvent; | ||||
| } // namespace Kernel | ||||
|  | ||||
| namespace Service::Nvidia { | ||||
| class Module; | ||||
| } | ||||
| @@ -40,7 +45,7 @@ struct Display { | ||||
|     std::string name; | ||||
|  | ||||
|     std::vector<Layer> layers; | ||||
|     Kernel::SharedPtr<Kernel::Event> vsync_event; | ||||
|     Kernel::EventPair vsync_event; | ||||
| }; | ||||
|  | ||||
| class NVFlinger final { | ||||
| @@ -61,7 +66,7 @@ public: | ||||
|     u32 GetBufferQueueId(u64 display_id, u64 layer_id); | ||||
|  | ||||
|     /// Gets the vsync event for the specified display. | ||||
|     Kernel::SharedPtr<Kernel::Event> GetVsyncEvent(u64 display_id); | ||||
|     Kernel::SharedPtr<Kernel::ReadableEvent> GetVsyncEvent(u64 display_id); | ||||
|  | ||||
|     /// Obtains a buffer queue identified by the id. | ||||
|     std::shared_ptr<BufferQueue> GetBufferQueue(u32 id) const; | ||||
|   | ||||
| @@ -18,7 +18,8 @@ | ||||
| #include "common/swap.h" | ||||
| #include "core/core_timing.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/event.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/nvdrv/nvdrv.h" | ||||
| #include "core/hle/service/nvflinger/buffer_queue.h" | ||||
| #include "core/hle/service/nvflinger/nvflinger.h" | ||||
| @@ -549,7 +550,7 @@ private: | ||||
|                         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|                         rb.Push(RESULT_SUCCESS); | ||||
|                     }, | ||||
|                     buffer_queue->GetBufferWaitEvent()); | ||||
|                     buffer_queue->GetWritableBufferWaitEvent()); | ||||
|             } | ||||
|         } else if (transaction == TransactionId::RequestBuffer) { | ||||
|             IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei