38 changed files with 754 additions and 68 deletions
-
4src/core/CMakeLists.txt
-
1src/core/hle/service/am/am_types.h
-
2src/core/hle/service/am/applet.cpp
-
1src/core/hle/service/am/applet.h
-
14src/core/hle/service/am/applet_manager.cpp
-
27src/core/hle/service/am/display_layer_manager.cpp
-
19src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
-
4src/core/hle/service/am/service/all_system_applet_proxies_service.h
-
10src/core/hle/service/am/service/applet_common_functions.cpp
-
1src/core/hle/service/am/service/applet_common_functions.h
-
4src/core/hle/service/am/service/application_creator.cpp
-
37src/core/hle/service/am/service/common_state_getter.cpp
-
2src/core/hle/service/am/service/common_state_getter.h
-
122src/core/hle/service/am/service/overlay_applet_proxy.cpp
-
55src/core/hle/service/am/service/overlay_applet_proxy.h
-
82src/core/hle/service/am/service/overlay_functions.cpp
-
33src/core/hle/service/am/service/overlay_functions.h
-
42src/core/hle/service/am/service/system_applet_proxy.cpp
-
6src/core/hle/service/am/service/system_applet_proxy.h
-
25src/core/hle/service/am/window_system.cpp
-
1src/core/hle/service/am/window_system.h
-
8src/core/hle/service/caps/caps_a.cpp
-
2src/core/hle/service/caps/caps_a.h
-
33src/core/hle/service/npns/npns.cpp
-
3src/core/hle/service/nvnflinger/display.h
-
8src/core/hle/service/nvnflinger/hardware_composer.cpp
-
5src/core/hle/service/nvnflinger/surface_flinger.h
-
9src/core/hle/service/psc/ovln/ovln_types.h
-
105src/core/hle/service/psc/ovln/receiver.cpp
-
31src/core/hle/service/psc/ovln/receiver.h
-
2src/core/hle/service/psc/ovln/receiver_service.cpp
-
33src/core/hle/service/vi/container.cpp
-
2src/core/hle/service/vi/container.h
-
4src/core/hle/service/vi/manager_display_service.cpp
-
3src/core/hle/service/vi/manager_display_service.h
-
61src/core/hle/service/vi/shared_buffer_manager.cpp
-
18src/core/hle/service/vi/system_display_service.cpp
-
3src/core/hle/service/vi/system_display_service.h
@ -0,0 +1,122 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
|||
#include "core/hle/service/am/service/common_state_getter.h"
|
|||
#include "core/hle/service/am/service/display_controller.h"
|
|||
#include "core/hle/service/am/service/global_state_controller.h"
|
|||
#include "core/hle/service/am/service/audio_controller.h"
|
|||
#include "core/hle/service/am/service/applet_common_functions.h"
|
|||
#include "core/hle/service/am/service/overlay_applet_proxy.h"
|
|||
#include "core/hle/service/am/service/library_applet_creator.h"
|
|||
#include "core/hle/service/am/service/process_winding_controller.h"
|
|||
#include "core/hle/service/am/service/self_controller.h"
|
|||
#include "core/hle/service/am/service/window_controller.h"
|
|||
#include "core/hle/service/am/service/debug_functions.h"
|
|||
#include "core/hle/service/cmif_serialization.h"
|
|||
|
|||
namespace Service::AM { |
|||
|
|||
IOverlayAppletProxy::IOverlayAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet, |
|||
Kernel::KProcess* process, WindowSystem& window_system) |
|||
: ServiceFramework{system_, "IOverlayAppletProxy"}, |
|||
m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { |
|||
// clang-format off
|
|||
static const FunctionInfo functions[] = { |
|||
{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, |
|||
{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"}, |
|||
{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"}, |
|||
{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"}, |
|||
{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"}, |
|||
{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, |
|||
{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, |
|||
{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"}, |
|||
{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, |
|||
{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, |
|||
{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, |
|||
}; |
|||
// clang-format on
|
|||
|
|||
RegisterHandlers(functions); |
|||
} |
|||
|
|||
IOverlayAppletProxy::~IOverlayAppletProxy() = default; |
|||
|
|||
Result IOverlayAppletProxy::GetCommonStateGetter( |
|||
Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetSelfController( |
|||
Out<SharedPointer<ISelfController>> out_self_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetWindowController( |
|||
Out<SharedPointer<IWindowController>> out_window_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetAudioController( |
|||
Out<SharedPointer<IAudioController>> out_audio_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_audio_controller = std::make_shared<IAudioController>(system); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetDisplayController( |
|||
Out<SharedPointer<IDisplayController>> out_display_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_display_controller = std::make_shared<IDisplayController>(system, m_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetProcessWindingController( |
|||
Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetLibraryAppletCreator( |
|||
Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_library_applet_creator = |
|||
std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetOverlayFunctions( |
|||
Out<SharedPointer<IOverlayFunctions>> out_overlay_functions) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetAppletCommonFunctions( |
|||
Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetGlobalStateController( |
|||
Out<SharedPointer<IGlobalStateController>> out_global_state_controller) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_global_state_controller = std::make_shared<IGlobalStateController>(system); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayAppletProxy::GetDebugFunctions( |
|||
Out<SharedPointer<IDebugFunctions>> out_debug_functions) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
*out_debug_functions = std::make_shared<IDebugFunctions>(system); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
} // namespace Service::AM
|
|||
@ -0,0 +1,55 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/cmif_types.h" |
|||
#include "core/hle/service/service.h" |
|||
#include "core/hle/service/am/service/overlay_functions.h" |
|||
|
|||
namespace Service::AM { |
|||
|
|||
struct Applet; |
|||
class IAppletCommonFunctions; |
|||
class IAudioController; |
|||
class ICommonStateGetter; |
|||
class IDebugFunctions; |
|||
class IDisplayController; |
|||
class IHomeMenuFunctions; |
|||
class IGlobalStateController; |
|||
class ILibraryAppletCreator; |
|||
class ILibraryAppletSelfAccessor; |
|||
class IProcessWindingController; |
|||
class ISelfController; |
|||
class IWindowController; |
|||
class WindowSystem; |
|||
|
|||
class IOverlayAppletProxy final : public ServiceFramework<IOverlayAppletProxy> { |
|||
public: |
|||
explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet, |
|||
Kernel::KProcess* process, WindowSystem& window_system); |
|||
~IOverlayAppletProxy(); |
|||
|
|||
private: |
|||
Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter); |
|||
Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller); |
|||
Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller); |
|||
Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller); |
|||
Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller); |
|||
Result GetProcessWindingController( |
|||
Out<SharedPointer<IProcessWindingController>> out_process_winding_controller); |
|||
Result GetLibraryAppletCreator( |
|||
Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator); |
|||
Result GetOverlayFunctions(Out<SharedPointer<IOverlayFunctions>> out_overlay_functions); |
|||
Result GetAppletCommonFunctions( |
|||
Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions); |
|||
Result GetGlobalStateController( |
|||
Out<SharedPointer<IGlobalStateController>> out_global_state_controller); |
|||
Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions); |
|||
|
|||
WindowSystem& m_window_system; |
|||
Kernel::KProcess* const m_process; |
|||
const std::shared_ptr<Applet> m_applet; |
|||
}; |
|||
|
|||
} // namespace Service::AM |
|||
@ -0,0 +1,82 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
|||
#include "core/hle/service/am/applet.h"
|
|||
#include "core/hle/service/am/service/overlay_functions.h"
|
|||
#include "core/hle/service/cmif_serialization.h"
|
|||
|
|||
namespace Service::AM { |
|||
|
|||
IOverlayFunctions::IOverlayFunctions(Core::System& system_, std::shared_ptr<Applet> applet) |
|||
: ServiceFramework{system_, "IOverlayFunctions"}, m_applet{std::move(applet)} { |
|||
// clang-format off
|
|||
static const FunctionInfo functions[] = { |
|||
{0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"}, |
|||
{1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"}, |
|||
{2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"}, |
|||
{3, nullptr, "SetGpuTimeSliceBoost"}, |
|||
{4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"}, |
|||
{5, nullptr, "TerminateApplicationAndSetReason"}, |
|||
{6, nullptr, "SetScreenShotPermissionGlobally"}, |
|||
{10, nullptr, "StartShutdownSequenceForOverlay"}, |
|||
{11, nullptr, "StartRebootSequenceForOverlay"}, |
|||
{20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, |
|||
{21, nullptr, "SetHandlingTouchScreenInputEnabled"}, |
|||
{30, nullptr, "SetHealthWarningShowingState"}, |
|||
{31, nullptr, "IsHealthWarningRequired"}, |
|||
{40, nullptr, "GetApplicationNintendoLogo"}, |
|||
{41, nullptr, "GetApplicationStartupMovie"}, |
|||
{50, nullptr, "SetGpuTimeSliceBoostForApplication"}, |
|||
{60, nullptr, "Unknown60"}, |
|||
{90, nullptr, "SetRequiresGpuResourceUse"}, |
|||
{101, nullptr, "BeginToObserveHidInputForDevelop"}, |
|||
}; |
|||
// clang-format on
|
|||
|
|||
RegisterHandlers(functions); |
|||
} |
|||
|
|||
IOverlayFunctions::~IOverlayFunctions() = default; |
|||
|
|||
Result IOverlayFunctions::BeginToWatchShortHomeButtonMessage() { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
std::scoped_lock lk{m_applet->lock}; |
|||
m_applet->home_button_short_pressed_blocked = false; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayFunctions::EndToWatchShortHomeButtonMessage() { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
std::scoped_lock lk{m_applet->lock}; |
|||
m_applet->home_button_short_pressed_blocked = true; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayFunctions::GetApplicationIdForLogo(Out<u64> out_application_id) { |
|||
LOG_DEBUG(Service_AM, "called"); |
|||
|
|||
// Prefer explicit application_id if available, else fall back to program_id
|
|||
std::scoped_lock lk{m_applet->lock}; |
|||
u64 id = m_applet->screen_shot_identity.application_id; |
|||
if (id == 0) { |
|||
id = m_applet->program_id; |
|||
} |
|||
*out_application_id = id; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled) { |
|||
LOG_WARNING(Service_AM, "(STUBBED) called, enabled={}", enabled); |
|||
std::scoped_lock lk{m_applet->lock}; |
|||
m_applet->auto_sleep_disabled = !enabled; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled(bool enabled) { |
|||
LOG_DEBUG(Service_AM, "called, enabled={}", enabled); |
|||
std::scoped_lock lk{m_applet->lock}; |
|||
m_applet->home_button_short_pressed_blocked = !enabled; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
} // namespace Service::AM
|
|||
@ -0,0 +1,33 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/service.h" |
|||
|
|||
namespace Service::AM { |
|||
|
|||
struct Applet; |
|||
|
|||
class IOverlayFunctions final : public ServiceFramework<IOverlayFunctions> { |
|||
public: |
|||
explicit IOverlayFunctions(Core::System& system_, std::shared_ptr<Applet> applet); |
|||
~IOverlayFunctions() override; |
|||
|
|||
private: |
|||
// 0 |
|||
Result BeginToWatchShortHomeButtonMessage(); |
|||
// 1 |
|||
Result EndToWatchShortHomeButtonMessage(); |
|||
// 2 |
|||
Result GetApplicationIdForLogo(Out<u64> out_application_id); |
|||
// 4 |
|||
Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); |
|||
// 20 |
|||
Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); |
|||
|
|||
private: |
|||
const std::shared_ptr<Applet> m_applet; |
|||
}; |
|||
|
|||
} // namespace Service::AM |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue