mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-07-04 23:31:19 +01:00
core: Port all current usages of Event to Readable/WritableEvent
This commit is contained in:
parent
a56fc84e7a
commit
ff610103b5
29 changed files with 287 additions and 164 deletions
|
@ -8,7 +8,7 @@
|
||||||
#include "audio_core/codec.h"
|
#include "audio_core/codec.h"
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/hle/kernel/event.h"
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
|
@ -72,7 +72,7 @@ private:
|
||||||
EffectInStatus info{};
|
EffectInStatus info{};
|
||||||
};
|
};
|
||||||
AudioRenderer::AudioRenderer(AudioRendererParameter params,
|
AudioRenderer::AudioRenderer(AudioRendererParameter params,
|
||||||
Kernel::SharedPtr<Kernel::Event> buffer_event)
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_event)
|
||||||
: worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count),
|
: worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count),
|
||||||
effects(params.effect_count) {
|
effects(params.effect_count) {
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "core/hle/kernel/object.h"
|
#include "core/hle/kernel/object.h"
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class Event;
|
class WritableEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
|
@ -208,7 +208,8 @@ static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has wrong size
|
||||||
|
|
||||||
class AudioRenderer {
|
class AudioRenderer {
|
||||||
public:
|
public:
|
||||||
AudioRenderer(AudioRendererParameter params, Kernel::SharedPtr<Kernel::Event> buffer_event);
|
AudioRenderer(AudioRendererParameter params,
|
||||||
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_event);
|
||||||
~AudioRenderer();
|
~AudioRenderer();
|
||||||
|
|
||||||
std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
|
std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
|
||||||
|
@ -224,7 +225,7 @@ private:
|
||||||
class VoiceState;
|
class VoiceState;
|
||||||
|
|
||||||
AudioRendererParameter worker_params;
|
AudioRendererParameter worker_params;
|
||||||
Kernel::SharedPtr<Kernel::Event> buffer_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_event;
|
||||||
std::vector<VoiceState> voices;
|
std::vector<VoiceState> voices;
|
||||||
std::vector<EffectState> effects;
|
std::vector<EffectState> effects;
|
||||||
std::unique_ptr<AudioOut> audio_out;
|
std::unique_ptr<AudioOut> audio_out;
|
||||||
|
|
|
@ -20,17 +20,18 @@
|
||||||
#include "core/hle/kernel/address_arbiter.h"
|
#include "core/hle/kernel/address_arbiter.h"
|
||||||
#include "core/hle/kernel/client_port.h"
|
#include "core/hle/kernel/client_port.h"
|
||||||
#include "core/hle/kernel/client_session.h"
|
#include "core/hle/kernel/client_session.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/handle_table.h"
|
#include "core/hle/kernel/handle_table.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/mutex.h"
|
#include "core/hle/kernel/mutex.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
|
#include "core/hle/kernel/readable_event.h"
|
||||||
#include "core/hle/kernel/resource_limit.h"
|
#include "core/hle/kernel/resource_limit.h"
|
||||||
#include "core/hle/kernel/scheduler.h"
|
#include "core/hle/kernel/scheduler.h"
|
||||||
#include "core/hle/kernel/shared_memory.h"
|
#include "core/hle/kernel/shared_memory.h"
|
||||||
#include "core/hle/kernel/svc.h"
|
#include "core/hle/kernel/svc.h"
|
||||||
#include "core/hle/kernel/svc_wrap.h"
|
#include "core/hle/kernel/svc_wrap.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/hle/lock.h"
|
#include "core/hle/lock.h"
|
||||||
#include "core/hle/result.h"
|
#include "core/hle/result.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
@ -1361,11 +1362,11 @@ static ResultCode ResetSignal(Handle handle) {
|
||||||
LOG_DEBUG(Kernel_SVC, "called handle 0x{:08X}", handle);
|
LOG_DEBUG(Kernel_SVC, "called handle 0x{:08X}", handle);
|
||||||
|
|
||||||
const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
|
const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
|
||||||
auto event = handle_table.Get<Event>(handle);
|
auto event = handle_table.Get<ReadableEvent>(handle);
|
||||||
|
|
||||||
ASSERT(event != nullptr);
|
ASSERT(event != nullptr);
|
||||||
|
|
||||||
event->Clear();
|
event->PromoteToWritable()->Clear();
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1524,13 +1525,13 @@ static ResultCode ClearEvent(Handle handle) {
|
||||||
LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle);
|
LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle);
|
||||||
|
|
||||||
const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
|
const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
|
||||||
SharedPtr<Event> evt = handle_table.Get<Event>(handle);
|
SharedPtr<ReadableEvent> evt = handle_table.Get<ReadableEvent>(handle);
|
||||||
if (evt == nullptr) {
|
if (evt == nullptr) {
|
||||||
LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle);
|
LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle);
|
||||||
return ERR_INVALID_HANDLE;
|
return ERR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
evt->Clear();
|
evt->PromoteToWritable()->Clear();
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,11 @@
|
||||||
#include "audio_core/audio_renderer.h"
|
#include "audio_core/audio_renderer.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.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/process.h"
|
||||||
|
#include "core/hle/kernel/readable_event.h"
|
||||||
#include "core/hle/kernel/shared_memory.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/acc/profile_manager.h"
|
||||||
#include "core/hle/service/am/am.h"
|
#include "core/hle/service/am/am.h"
|
||||||
#include "core/hle/service/am/applet_ae.h"
|
#include "core/hle/service/am/applet_ae.h"
|
||||||
|
@ -208,8 +210,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
launchable_event =
|
launchable_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "ISelfController:LaunchableEvent");
|
kernel, Kernel::ResetType::Sticky, "ISelfController:LaunchableEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
ISelfController::~ISelfController() = default;
|
ISelfController::~ISelfController() = default;
|
||||||
|
@ -299,8 +301,7 @@ void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext&
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(launchable_event);
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) {
|
void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
@ -348,20 +349,26 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c
|
||||||
|
|
||||||
AppletMessageQueue::AppletMessageQueue() {
|
AppletMessageQueue::AppletMessageQueue() {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
on_new_message = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky,
|
on_new_message = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"AMMessageQueue:OnMessageRecieved");
|
kernel, Kernel::ResetType::Sticky, "AMMessageQueue:OnMessageRecieved");
|
||||||
on_operation_mode_changed = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
on_operation_mode_changed = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"AMMessageQueue:OperationModeChanged");
|
kernel, Kernel::ResetType::OneShot, "AMMessageQueue:OperationModeChanged");
|
||||||
}
|
}
|
||||||
|
|
||||||
AppletMessageQueue::~AppletMessageQueue() = default;
|
AppletMessageQueue::~AppletMessageQueue() = default;
|
||||||
|
|
||||||
const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetMesssageRecieveEvent() const {
|
const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent()
|
||||||
return on_new_message;
|
const {
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("AMMessageQueue:OnMessageRecieved")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetOperationModeChangedEvent() const {
|
const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent()
|
||||||
return on_operation_mode_changed;
|
const {
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("AMMessageQueue:OperationModeChanged")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppletMessageQueue::PushMessage(AppletMessage msg) {
|
void AppletMessageQueue::PushMessage(AppletMessage msg) {
|
||||||
|
@ -426,9 +433,6 @@ ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_q
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
|
||||||
event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "ICommonStateGetter:Event");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ICommonStateGetter::~ICommonStateGetter() = default;
|
ICommonStateGetter::~ICommonStateGetter() = default;
|
||||||
|
@ -564,8 +568,8 @@ private:
|
||||||
void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) {
|
void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_AM, "called");
|
LOG_DEBUG(Service_AM, "called");
|
||||||
|
|
||||||
|
applet->GetBroker().SignalStateChanged();
|
||||||
const auto event = applet->GetBroker().GetStateChangedEvent();
|
const auto event = applet->GetBroker().GetStateChangedEvent();
|
||||||
event->Signal();
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
|
@ -9,8 +9,9 @@
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class Event;
|
class ReadableEvent;
|
||||||
}
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace NVFlinger {
|
namespace NVFlinger {
|
||||||
|
@ -52,8 +53,8 @@ public:
|
||||||
AppletMessageQueue();
|
AppletMessageQueue();
|
||||||
~AppletMessageQueue();
|
~AppletMessageQueue();
|
||||||
|
|
||||||
const Kernel::SharedPtr<Kernel::Event>& GetMesssageRecieveEvent() const;
|
const Kernel::SharedPtr<Kernel::ReadableEvent>& GetMesssageRecieveEvent() const;
|
||||||
const Kernel::SharedPtr<Kernel::Event>& GetOperationModeChangedEvent() const;
|
const Kernel::SharedPtr<Kernel::ReadableEvent>& GetOperationModeChangedEvent() const;
|
||||||
void PushMessage(AppletMessage msg);
|
void PushMessage(AppletMessage msg);
|
||||||
AppletMessage PopMessage();
|
AppletMessage PopMessage();
|
||||||
std::size_t GetMessageCount() const;
|
std::size_t GetMessageCount() const;
|
||||||
|
@ -61,8 +62,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::queue<AppletMessage> messages;
|
std::queue<AppletMessage> messages;
|
||||||
Kernel::SharedPtr<Kernel::Event> on_new_message;
|
Kernel::SharedPtr<Kernel::WritableEvent> on_new_message;
|
||||||
Kernel::SharedPtr<Kernel::Event> on_operation_mode_changed;
|
Kernel::SharedPtr<Kernel::WritableEvent> on_operation_mode_changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
class IWindowController final : public ServiceFramework<IWindowController> {
|
class IWindowController final : public ServiceFramework<IWindowController> {
|
||||||
|
@ -122,7 +123,7 @@ private:
|
||||||
void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
|
std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
|
||||||
Kernel::SharedPtr<Kernel::Event> launchable_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> launchable_event;
|
||||||
u32 idle_time_detection_extension = 0;
|
u32 idle_time_detection_extension = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -151,7 +152,6 @@ private:
|
||||||
void GetBootMode(Kernel::HLERequestContext& ctx);
|
void GetBootMode(Kernel::HLERequestContext& ctx);
|
||||||
void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx);
|
void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> event;
|
|
||||||
std::shared_ptr<AppletMessageQueue> msg_queue;
|
std::shared_ptr<AppletMessageQueue> msg_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/core.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/server_port.h"
|
||||||
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/hle/service/am/am.h"
|
#include "core/hle/service/am/am.h"
|
||||||
#include "core/hle/service/am/applets/applets.h"
|
#include "core/hle/service/am/applets/applets.h"
|
||||||
|
|
||||||
|
@ -14,11 +15,11 @@ namespace Service::AM::Applets {
|
||||||
|
|
||||||
AppletDataBroker::AppletDataBroker() {
|
AppletDataBroker::AppletDataBroker() {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
state_changed_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
state_changed_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"ILibraryAppletAccessor:StateChangedEvent");
|
kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:StateChangedEvent");
|
||||||
pop_out_data_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
pop_out_data_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"ILibraryAppletAccessor:PopDataOutEvent");
|
kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopDataOutEvent");
|
||||||
pop_interactive_out_data_event = Kernel::Event::Create(
|
pop_interactive_out_data_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent");
|
kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,16 +83,22 @@ void AppletDataBroker::SignalStateChanged() const {
|
||||||
state_changed_event->Signal();
|
state_changed_event->Signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetNormalDataEvent() const {
|
Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const {
|
||||||
return pop_out_data_event;
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
|
||||||
|
"ILibraryAppletAccessor:PopDataOutEvent")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetInteractiveDataEvent() const {
|
Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const {
|
||||||
return pop_interactive_out_data_event;
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
|
||||||
|
"ILibraryAppletAccessor:PopInteractiveDataOutEvent")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetStateChangedEvent() const {
|
Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const {
|
||||||
return state_changed_event;
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
|
||||||
|
"ILibraryAppletAccessor:StateChangedEvent")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Applet::Applet() = default;
|
Applet::Applet() = default;
|
||||||
|
|
|
@ -12,8 +12,9 @@
|
||||||
union ResultCode;
|
union ResultCode;
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class Event;
|
class ReadableEvent;
|
||||||
}
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
|
@ -40,9 +41,9 @@ public:
|
||||||
|
|
||||||
void SignalStateChanged() const;
|
void SignalStateChanged() const;
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> GetNormalDataEvent() const;
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetNormalDataEvent() const;
|
||||||
Kernel::SharedPtr<Kernel::Event> GetInteractiveDataEvent() const;
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetInteractiveDataEvent() const;
|
||||||
Kernel::SharedPtr<Kernel::Event> GetStateChangedEvent() const;
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetStateChangedEvent() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Queues are named from applet's perspective
|
// Queues are named from applet's perspective
|
||||||
|
@ -59,13 +60,13 @@ private:
|
||||||
// PopInteractiveDataToGame and PushInteractiveDataFromApplet
|
// PopInteractiveDataToGame and PushInteractiveDataFromApplet
|
||||||
std::queue<std::unique_ptr<IStorage>> out_interactive_channel;
|
std::queue<std::unique_ptr<IStorage>> out_interactive_channel;
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> state_changed_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> state_changed_event;
|
||||||
|
|
||||||
// Signaled on PushNormalDataFromApplet
|
// Signaled on PushNormalDataFromApplet
|
||||||
Kernel::SharedPtr<Kernel::Event> pop_out_data_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> pop_out_data_event;
|
||||||
|
|
||||||
// Signaled on PushInteractiveDataFromApplet
|
// Signaled on PushInteractiveDataFromApplet
|
||||||
Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> pop_interactive_out_data_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Applet {
|
class Applet {
|
||||||
|
|
|
@ -13,8 +13,10 @@
|
||||||
#include "core/file_sys/patch_manager.h"
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include "core/file_sys/registered_cache.h"
|
#include "core/file_sys/registered_cache.h"
|
||||||
#include "core/hle/ipc_helpers.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/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/aoc/aoc_u.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
|
@ -61,8 +63,8 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
aoc_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky,
|
aoc_change_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"GetAddOnContentListChanged:Event");
|
kernel, Kernel::ResetType::Sticky, "GetAddOnContentListChanged:Event");
|
||||||
}
|
}
|
||||||
|
|
||||||
AOC_U::~AOC_U() = default;
|
AOC_U::~AOC_U() = default;
|
||||||
|
@ -142,9 +144,12 @@ void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) {
|
void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_AOC, "(STUBBED) called");
|
LOG_WARNING(Service_AOC, "(STUBBED) called");
|
||||||
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("GetAddOnContentListChanged:Event")};
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(aoc_change_event);
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstallInterfaces(SM::ServiceManager& service_manager) {
|
void InstallInterfaces(SM::ServiceManager& service_manager) {
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
|
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class WritableEvent;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service::AOC {
|
namespace Service::AOC {
|
||||||
|
|
||||||
class AOC_U final : public ServiceFramework<AOC_U> {
|
class AOC_U final : public ServiceFramework<AOC_U> {
|
||||||
|
@ -21,7 +25,7 @@ private:
|
||||||
void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx);
|
void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
std::vector<u64> add_on_content;
|
std::vector<u64> add_on_content;
|
||||||
Kernel::SharedPtr<Kernel::Event> aoc_change_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> aoc_change_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Registers all AOC services with the specified service manager.
|
/// Registers all AOC services with the specified service manager.
|
||||||
|
|
|
@ -13,8 +13,10 @@
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/hle_ipc.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/hle/service/audio/audout_u.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
|
@ -67,8 +69,8 @@ public:
|
||||||
|
|
||||||
// This is the event handle used to check if the audio buffer was released
|
// This is the event handle used to check if the audio buffer was released
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
buffer_event =
|
buffer_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioOutBufferReleased");
|
kernel, Kernel::ResetType::Sticky, "IAudioOutBufferReleased");
|
||||||
|
|
||||||
stream = audio_core.OpenStream(audio_params.sample_rate, audio_params.channel_count,
|
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->Signal(); });
|
||||||
|
@ -121,7 +123,9 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(buffer_event);
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IAudioOutBufferReleased")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) {
|
void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -188,7 +192,7 @@ private:
|
||||||
AudoutParams audio_params{};
|
AudoutParams audio_params{};
|
||||||
|
|
||||||
/// This is the evend handle used to check if the audio buffer was released
|
/// This is the evend handle used to check if the audio buffer was released
|
||||||
Kernel::SharedPtr<Kernel::Event> buffer_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) {
|
void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
|
@ -12,8 +12,10 @@
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/hle_ipc.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"
|
#include "core/hle/service/audio/audren_u.h"
|
||||||
|
|
||||||
namespace Service::Audio {
|
namespace Service::Audio {
|
||||||
|
@ -41,8 +43,8 @@ public:
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
system_event =
|
system_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioRenderer:SystemEvent");
|
kernel, Kernel::ResetType::Sticky, "IAudioRenderer:SystemEvent");
|
||||||
renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event);
|
renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +114,9 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(system_event);
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IAudioRenderer:SystemEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) {
|
void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -135,7 +139,7 @@ private:
|
||||||
rb.Push(rendering_time_limit_percent);
|
rb.Push(rendering_time_limit_percent);
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> system_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> system_event;
|
||||||
std::unique_ptr<AudioCore::AudioRenderer> renderer;
|
std::unique_ptr<AudioCore::AudioRenderer> renderer;
|
||||||
u32 rendering_time_limit_percent = 100;
|
u32 rendering_time_limit_percent = 100;
|
||||||
};
|
};
|
||||||
|
@ -162,8 +166,8 @@ public:
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
buffer_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
buffer_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"IAudioOutBufferReleasedEvent");
|
kernel, Kernel::ResetType::OneShot, "IAudioOutBufferReleasedEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -211,7 +215,9 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(buffer_event);
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IAudioOutBufferReleasedEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetActiveChannelCount(Kernel::HLERequestContext& ctx) {
|
void GetActiveChannelCount(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -222,7 +228,7 @@ private:
|
||||||
rb.Push<u32>(1);
|
rb.Push<u32>(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> buffer_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_event;
|
||||||
|
|
||||||
}; // namespace Audio
|
}; // namespace Audio
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/hle_ipc.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/btdrv/btdrv.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
@ -30,20 +32,22 @@ public:
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
|
register_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "BT:RegisterEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void RegisterEvent(Kernel::HLERequestContext& ctx) {
|
void RegisterEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
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};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(register_event);
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("BT:RegisterEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
Kernel::SharedPtr<Kernel::Event> register_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> register_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BtDrv final : public ServiceFramework<BtDrv> {
|
class BtDrv final : public ServiceFramework<BtDrv> {
|
||||||
|
|
|
@ -6,8 +6,10 @@
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/hle_ipc.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/btm/btm.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
@ -53,53 +55,64 @@ public:
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
|
scan_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ScanEvent");
|
||||||
|
connection_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConnectionEvent");
|
||||||
|
service_discovery = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery");
|
||||||
|
config_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConfigEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GetScanEvent(Kernel::HLERequestContext& ctx) {
|
void GetScanEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
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};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(scan_event);
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ScanEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
void GetConnectionEvent(Kernel::HLERequestContext& ctx) {
|
void GetConnectionEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
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};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(connection_event);
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ConnectionEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) {
|
void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
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};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(service_discovery);
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:Discovery")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
void GetConfigEvent(Kernel::HLERequestContext& ctx) {
|
void GetConfigEvent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
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};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(config_event);
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ConfigEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
Kernel::SharedPtr<Kernel::Event> scan_event;
|
|
||||||
Kernel::SharedPtr<Kernel::Event> connection_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> scan_event;
|
||||||
Kernel::SharedPtr<Kernel::Event> service_discovery;
|
Kernel::SharedPtr<Kernel::WritableEvent> connection_event;
|
||||||
Kernel::SharedPtr<Kernel::Event> config_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> service_discovery;
|
||||||
|
Kernel::SharedPtr<Kernel::WritableEvent> config_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BTM_USR final : public ServiceFramework<BTM_USR> {
|
class BTM_USR final : public ServiceFramework<BTM_USR> {
|
||||||
|
|
|
@ -12,7 +12,9 @@
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/frontend/input.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/hle/service/hid/controllers/npad.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
|
|
||||||
|
@ -167,8 +169,8 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
|
||||||
|
|
||||||
void Controller_NPad::OnInit() {
|
void Controller_NPad::OnInit() {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
styleset_changed_event =
|
styleset_changed_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged");
|
kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged");
|
||||||
|
|
||||||
if (!IsControllerActivated()) {
|
if (!IsControllerActivated()) {
|
||||||
return;
|
return;
|
||||||
|
@ -538,11 +540,13 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids,
|
||||||
last_processed_vibration = vibrations.back();
|
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
|
// 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?
|
// be signalled at least once, and signaled after a new controller is connected?
|
||||||
styleset_changed_event->Signal();
|
styleset_changed_event->Signal();
|
||||||
return styleset_changed_event;
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("npad:NpadStyleSetChanged")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller_NPad::Vibration Controller_NPad::GetLastVibration() const {
|
Controller_NPad::Vibration Controller_NPad::GetLastVibration() const {
|
||||||
|
|
|
@ -8,10 +8,15 @@
|
||||||
#include "common/bit_field.h"
|
#include "common/bit_field.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/frontend/input.h"
|
#include "core/frontend/input.h"
|
||||||
#include "core/hle/kernel/event.h"
|
#include "core/hle/kernel/object.h"
|
||||||
#include "core/hle/service/hid/controllers/controller_base.h"
|
#include "core/hle/service/hid/controllers/controller_base.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class ReadableEvent;
|
||||||
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
|
|
||||||
constexpr u32 NPAD_HANDHELD = 32;
|
constexpr u32 NPAD_HANDHELD = 32;
|
||||||
|
@ -108,7 +113,7 @@ public:
|
||||||
void VibrateController(const std::vector<u32>& controller_ids,
|
void VibrateController(const std::vector<u32>& controller_ids,
|
||||||
const std::vector<Vibration>& vibrations);
|
const std::vector<Vibration>& vibrations);
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> GetStyleSetChangedEvent() const;
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetStyleSetChangedEvent() const;
|
||||||
Vibration GetLastVibration() const;
|
Vibration GetLastVibration() const;
|
||||||
|
|
||||||
void AddNewController(NPadControllerType controller);
|
void AddNewController(NPadControllerType controller);
|
||||||
|
@ -303,7 +308,7 @@ private:
|
||||||
sticks;
|
sticks;
|
||||||
std::vector<u32> supported_npad_id_types{};
|
std::vector<u32> supported_npad_id_types{};
|
||||||
NpadHoldType hold_type{NpadHoldType::Vertical};
|
NpadHoldType hold_type{NpadHoldType::Vertical};
|
||||||
Kernel::SharedPtr<Kernel::Event> styleset_changed_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> styleset_changed_event;
|
||||||
Vibration last_processed_vibration{};
|
Vibration last_processed_vibration{};
|
||||||
std::array<ControllerHolder, 10> connected_controllers{};
|
std::array<ControllerHolder, 10> connected_controllers{};
|
||||||
bool can_controllers_vibrate{true};
|
bool can_controllers_vibrate{true};
|
||||||
|
|
|
@ -13,8 +13,9 @@
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/client_port.h"
|
#include "core/hle/kernel/client_port.h"
|
||||||
#include "core/hle/kernel/client_session.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/shared_memory.h"
|
||||||
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/hle/service/hid/hid.h"
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/hid/irs.h"
|
#include "core/hle/service/hid/irs.h"
|
||||||
#include "core/hle/service/hid/xcd.h"
|
#include "core/hle/service/hid/xcd.h"
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.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/lock.h"
|
||||||
#include "core/hle/service/hid/hid.h"
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/nfp/nfp.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)
|
Module::Interface::Interface(std::shared_ptr<Module> module, const char* name)
|
||||||
: ServiceFramework(name), module(std::move(module)) {
|
: ServiceFramework(name), module(std::move(module)) {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
nfc_tag_load =
|
nfc_tag_load = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:NFCTagDetected");
|
kernel, Kernel::ResetType::OneShot, "IUser:NFCTagDetected");
|
||||||
}
|
}
|
||||||
|
|
||||||
Module::Interface::~Interface() = default;
|
Module::Interface::~Interface() = default;
|
||||||
|
@ -63,10 +65,10 @@ public:
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
deactivate_event =
|
deactivate_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent");
|
kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent");
|
||||||
availability_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
availability_change_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
"IUser:AvailabilityChangeEvent");
|
kernel, Kernel::ResetType::OneShot, "IUser:AvailabilityChangeEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -164,7 +166,10 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(deactivate_event);
|
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IUser:DeactivateEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopDetection(Kernel::HLERequestContext& ctx) {
|
void StopDetection(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -264,7 +269,9 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(availability_change_event);
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("IUser:AvailabilityChangeEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetRegisterInfo(Kernel::HLERequestContext& ctx) {
|
void GetRegisterInfo(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -319,8 +326,8 @@ private:
|
||||||
const u32 npad_id{0}; // Player 1 controller
|
const u32 npad_id{0}; // Player 1 controller
|
||||||
State state{State::NonInitialized};
|
State state{State::NonInitialized};
|
||||||
DeviceState device_state{DeviceState::Initialized};
|
DeviceState device_state{DeviceState::Initialized};
|
||||||
Kernel::SharedPtr<Kernel::Event> deactivate_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> deactivate_event;
|
||||||
Kernel::SharedPtr<Kernel::Event> availability_change_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> availability_change_event;
|
||||||
const Module::Interface& nfp_interface;
|
const Module::Interface& nfp_interface;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -342,8 +349,10 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
|
||||||
nfc_tag_load->Signal();
|
nfc_tag_load->Signal();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const {
|
|
||||||
return nfc_tag_load;
|
const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const {
|
||||||
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("IUser:NFCTagDetected")};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const {
|
const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const {
|
||||||
return amiibo;
|
return amiibo;
|
||||||
|
|
|
@ -6,9 +6,13 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class ReadableEvent;
|
||||||
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service::NFP {
|
namespace Service::NFP {
|
||||||
|
|
||||||
class Module final {
|
class Module final {
|
||||||
|
@ -33,11 +37,11 @@ public:
|
||||||
|
|
||||||
void CreateUserInterface(Kernel::HLERequestContext& ctx);
|
void CreateUserInterface(Kernel::HLERequestContext& ctx);
|
||||||
bool LoadAmiibo(const std::vector<u8>& buffer);
|
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;
|
const AmiiboFile& GetAmiiboBuffer() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Kernel::SharedPtr<Kernel::Event> nfc_tag_load{};
|
Kernel::SharedPtr<Kernel::WritableEvent> nfc_tag_load{};
|
||||||
AmiiboFile amiibo{};
|
AmiiboFile amiibo{};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.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/nifm/nifm.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
@ -56,8 +58,10 @@ public:
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
event1 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event1");
|
event1 = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
event2 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event2");
|
kernel, Kernel::ResetType::OneShot, "IRequest:Event1");
|
||||||
|
event2 = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "IRequest:Event2");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -88,7 +92,11 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 2};
|
IPC::ResponseBuilder rb{ctx, 2, 2};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(event1, event2);
|
|
||||||
|
const auto& event1{Core::System::GetInstance().Kernel().FindNamedEvent("IRequest:Event1")};
|
||||||
|
const auto& event2{Core::System::GetInstance().Kernel().FindNamedEvent("IRequest:Event2")};
|
||||||
|
|
||||||
|
rb.PushCopyObjects(event1->second, event2->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cancel(Kernel::HLERequestContext& ctx) {
|
void Cancel(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -105,7 +113,7 @@ private:
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> event1, event2;
|
Kernel::SharedPtr<Kernel::WritableEvent> event1, event2;
|
||||||
};
|
};
|
||||||
|
|
||||||
class INetworkProfile final : public ServiceFramework<INetworkProfile> {
|
class INetworkProfile final : public ServiceFramework<INetworkProfile> {
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.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/nim/nim.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
@ -138,13 +140,13 @@ public:
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
finished_event =
|
finished_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
|
kernel, Kernel::ResetType::OneShot,
|
||||||
"IEnsureNetworkClockAvailabilityService:FinishEvent");
|
"IEnsureNetworkClockAvailabilityService:FinishEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Kernel::SharedPtr<Kernel::Event> finished_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> finished_event;
|
||||||
|
|
||||||
void StartTask(Kernel::HLERequestContext& ctx) {
|
void StartTask(Kernel::HLERequestContext& ctx) {
|
||||||
// No need to connect to the internet, just finish the task straight away.
|
// No need to connect to the internet, just finish the task straight away.
|
||||||
|
@ -160,7 +162,9 @@ private:
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(finished_event);
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
|
||||||
|
"IEnsureNetworkClockAvailabilityService:FinishEvent")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetResult(Kernel::HLERequestContext& ctx) {
|
void GetResult(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/ipc_helpers.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/interface.h"
|
||||||
#include "core/hle/service/nvdrv/nvdrv.h"
|
#include "core/hle/service/nvdrv/nvdrv.h"
|
||||||
|
|
||||||
|
@ -69,7 +71,9 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3, 1};
|
IPC::ResponseBuilder rb{ctx, 3, 1};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushCopyObjects(query_event);
|
|
||||||
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("NVDRV::query_event")};
|
||||||
|
rb.PushCopyObjects(event->second);
|
||||||
rb.Push<u32>(0);
|
rb.Push<u32>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +131,8 @@ NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name)
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
query_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "NVDRV::query_event");
|
query_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::OneShot, "NVDRV::query_event");
|
||||||
}
|
}
|
||||||
|
|
||||||
NVDRV::~NVDRV() = default;
|
NVDRV::~NVDRV() = default;
|
||||||
|
|
|
@ -5,10 +5,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/service/nvdrv/nvdrv.h"
|
#include "core/hle/service/nvdrv/nvdrv.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class WritableEvent;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service::Nvidia {
|
namespace Service::Nvidia {
|
||||||
|
|
||||||
class NVDRV final : public ServiceFramework<NVDRV> {
|
class NVDRV final : public ServiceFramework<NVDRV> {
|
||||||
|
@ -31,7 +34,7 @@ private:
|
||||||
|
|
||||||
u64 pid{};
|
u64 pid{};
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> query_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> query_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::Nvidia
|
} // namespace Service::Nvidia
|
||||||
|
|
|
@ -7,14 +7,17 @@
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/core.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"
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
||||||
|
|
||||||
namespace Service::NVFlinger {
|
namespace Service::NVFlinger {
|
||||||
|
|
||||||
BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) {
|
BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
buffer_wait_event =
|
buffer_wait_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle");
|
kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle");
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferQueue::~BufferQueue() = default;
|
BufferQueue::~BufferQueue() = default;
|
||||||
|
@ -104,4 +107,14 @@ u32 BufferQueue::Query(QueryType type) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const {
|
||||||
|
return buffer_wait_event;
|
||||||
|
}
|
||||||
|
|
||||||
|
Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const {
|
||||||
|
const auto& event{
|
||||||
|
Core::System::GetInstance().Kernel().FindNamedEvent("BufferQueue NativeHandle")};
|
||||||
|
return event->second;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::NVFlinger
|
} // namespace Service::NVFlinger
|
||||||
|
|
|
@ -10,12 +10,17 @@
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/hle/kernel/event.h"
|
#include "core/hle/kernel/object.h"
|
||||||
|
|
||||||
namespace CoreTiming {
|
namespace CoreTiming {
|
||||||
struct EventType;
|
struct EventType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class ReadableEvent;
|
||||||
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service::NVFlinger {
|
namespace Service::NVFlinger {
|
||||||
|
|
||||||
struct IGBPBuffer {
|
struct IGBPBuffer {
|
||||||
|
@ -86,16 +91,16 @@ public:
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> GetBufferWaitEvent() const {
|
Kernel::SharedPtr<Kernel::WritableEvent> GetWritableBufferWaitEvent() const;
|
||||||
return buffer_wait_event;
|
|
||||||
}
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetBufferWaitEvent() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
u32 id;
|
u32 id;
|
||||||
u64 layer_id;
|
u64 layer_id;
|
||||||
|
|
||||||
std::vector<Buffer> queue;
|
std::vector<Buffer> queue;
|
||||||
Kernel::SharedPtr<Kernel::Event> buffer_wait_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> buffer_wait_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::NVFlinger
|
} // namespace Service::NVFlinger
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/core_timing_util.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/devices/nvdisp_disp0.h"
|
||||||
#include "core/hle/service/nvdrv/nvdrv.h"
|
#include "core/hle/service/nvdrv/nvdrv.h"
|
||||||
#include "core/hle/service/nvflinger/buffer_queue.h"
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
||||||
|
@ -83,9 +86,10 @@ u32 NVFlinger::GetBufferQueueId(u64 display_id, u64 layer_id) {
|
||||||
return layer.buffer_queue->GetId();
|
return layer.buffer_queue->GetId();
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::Event> NVFlinger::GetVsyncEvent(u64 display_id) {
|
Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) {
|
||||||
const auto& display = GetDisplay(display_id);
|
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
|
||||||
return display.vsync_event;
|
fmt::format("Display VSync Event {}", display_id))};
|
||||||
|
return event->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const {
|
std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const {
|
||||||
|
@ -164,7 +168,8 @@ Layer::~Layer() = default;
|
||||||
|
|
||||||
Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) {
|
Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) {
|
||||||
auto& kernel = Core::System::GetInstance().Kernel();
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
vsync_event = Kernel::Event::Create(kernel, Kernel::ResetType::Pulse, "Display VSync Event");
|
vsync_event = Kernel::WritableEvent::CreateRegisteredEventPair(
|
||||||
|
kernel, Kernel::ResetType::Pulse, fmt::format("Display VSync Event {}", id));
|
||||||
}
|
}
|
||||||
|
|
||||||
Display::~Display() = default;
|
Display::~Display() = default;
|
||||||
|
|
|
@ -10,12 +10,17 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/hle/kernel/event.h"
|
#include "core/hle/kernel/object.h"
|
||||||
|
|
||||||
namespace CoreTiming {
|
namespace CoreTiming {
|
||||||
struct EventType;
|
struct EventType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class ReadableEvent;
|
||||||
|
class WritableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
namespace Service::Nvidia {
|
namespace Service::Nvidia {
|
||||||
class Module;
|
class Module;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +45,7 @@ struct Display {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
std::vector<Layer> layers;
|
std::vector<Layer> layers;
|
||||||
Kernel::SharedPtr<Kernel::Event> vsync_event;
|
Kernel::SharedPtr<Kernel::WritableEvent> vsync_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NVFlinger final {
|
class NVFlinger final {
|
||||||
|
@ -61,7 +66,7 @@ public:
|
||||||
u32 GetBufferQueueId(u64 display_id, u64 layer_id);
|
u32 GetBufferQueueId(u64 display_id, u64 layer_id);
|
||||||
|
|
||||||
/// Gets the vsync event for the specified display.
|
/// 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.
|
/// Obtains a buffer queue identified by the id.
|
||||||
std::shared_ptr<BufferQueue> GetBufferQueue(u32 id) const;
|
std::shared_ptr<BufferQueue> GetBufferQueue(u32 id) const;
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/ipc_helpers.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/nvdrv/nvdrv.h"
|
||||||
#include "core/hle/service/nvflinger/buffer_queue.h"
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
||||||
#include "core/hle/service/nvflinger/nvflinger.h"
|
#include "core/hle/service/nvflinger/nvflinger.h"
|
||||||
|
@ -547,7 +548,7 @@ private:
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
},
|
},
|
||||||
buffer_queue->GetBufferWaitEvent());
|
buffer_queue->GetWritableBufferWaitEvent(), buffer_queue->GetBufferWaitEvent());
|
||||||
}
|
}
|
||||||
} else if (transaction == TransactionId::RequestBuffer) {
|
} else if (transaction == TransactionId::RequestBuffer) {
|
||||||
IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()};
|
IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()};
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/kernel/event.h"
|
|
||||||
#include "core/hle/kernel/handle_table.h"
|
#include "core/hle/kernel/handle_table.h"
|
||||||
#include "core/hle/kernel/mutex.h"
|
#include "core/hle/kernel/mutex.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
|
@ -15,6 +14,7 @@
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
#include "core/hle/kernel/timer.h"
|
#include "core/hle/kernel/timer.h"
|
||||||
#include "core/hle/kernel/wait_object.h"
|
#include "core/hle/kernel/wait_object.h"
|
||||||
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
|
|
||||||
WaitTreeItem::WaitTreeItem() = default;
|
WaitTreeItem::WaitTreeItem() = default;
|
||||||
|
@ -154,7 +154,7 @@ QString WaitTreeWaitObject::GetText() const {
|
||||||
std::unique_ptr<WaitTreeWaitObject> WaitTreeWaitObject::make(const Kernel::WaitObject& object) {
|
std::unique_ptr<WaitTreeWaitObject> WaitTreeWaitObject::make(const Kernel::WaitObject& object) {
|
||||||
switch (object.GetHandleType()) {
|
switch (object.GetHandleType()) {
|
||||||
case Kernel::HandleType::Event:
|
case Kernel::HandleType::Event:
|
||||||
return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::Event&>(object));
|
return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::WritableEvent&>(object));
|
||||||
case Kernel::HandleType::Timer:
|
case Kernel::HandleType::Timer:
|
||||||
return std::make_unique<WaitTreeTimer>(static_cast<const Kernel::Timer&>(object));
|
return std::make_unique<WaitTreeTimer>(static_cast<const Kernel::Timer&>(object));
|
||||||
case Kernel::HandleType::Thread:
|
case Kernel::HandleType::Thread:
|
||||||
|
@ -332,7 +332,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitTreeEvent::WaitTreeEvent(const Kernel::Event& object) : WaitTreeWaitObject(object) {}
|
WaitTreeEvent::WaitTreeEvent(const Kernel::WritableEvent& object) : WaitTreeWaitObject(object) {}
|
||||||
WaitTreeEvent::~WaitTreeEvent() = default;
|
WaitTreeEvent::~WaitTreeEvent() = default;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
|
std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
|
||||||
|
@ -340,7 +340,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
|
||||||
|
|
||||||
list.push_back(std::make_unique<WaitTreeText>(
|
list.push_back(std::make_unique<WaitTreeText>(
|
||||||
tr("reset type = %1")
|
tr("reset type = %1")
|
||||||
.arg(GetResetTypeQString(static_cast<const Kernel::Event&>(object).GetResetType()))));
|
.arg(GetResetTypeQString(
|
||||||
|
static_cast<const Kernel::WritableEvent&>(object).GetResetType()))));
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ class EmuThread;
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
class WaitObject;
|
class WaitObject;
|
||||||
class Event;
|
class WritableEvent;
|
||||||
class Thread;
|
class Thread;
|
||||||
class Timer;
|
class Timer;
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
@ -144,7 +144,7 @@ public:
|
||||||
class WaitTreeEvent : public WaitTreeWaitObject {
|
class WaitTreeEvent : public WaitTreeWaitObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit WaitTreeEvent(const Kernel::Event& object);
|
explicit WaitTreeEvent(const Kernel::WritableEvent& object);
|
||||||
~WaitTreeEvent() override;
|
~WaitTreeEvent() override;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
|
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
|
||||||
|
|
Loading…
Reference in a new issue