From 4992e2226e1f0de5d7cc8bbc39fc73a7fa712217 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sat, 5 Sep 2026 17:50:40 +0300 Subject: [PATCH] ac3 again --- .../hle/service/am/display_layer_manager.cpp | 36 +++++++++++++++++++ .../hle/service/am/display_layer_manager.h | 3 ++ 2 files changed, 39 insertions(+) diff --git a/src/core/hle/service/am/display_layer_manager.cpp b/src/core/hle/service/am/display_layer_manager.cpp index 4e549781a6..58c45a3852 100644 --- a/src/core/hle/service/am/display_layer_manager.cpp +++ b/src/core/hle/service/am/display_layer_manager.cpp @@ -6,6 +6,7 @@ #include "core/core.h" #include "core/hle/service/am/display_layer_manager.h" +#include "core/hle/service/nvnflinger/hwc_layer.h" #include "core/hle/service/sm/sm.h" #include "core/hle/service/vi/application_display_service.h" #include "core/hle/service/vi/container.h" @@ -33,6 +34,7 @@ void DisplayLayerManager::Initialize(Core::System& system, Kernel::KProcess* pro m_system_shared_buffer_id = 0; m_system_shared_layer_id = 0; m_applet_id = applet_id; + m_library_applet_mode = mode; m_buffer_sharing_enabled = false; m_blending_enabled = mode == LibraryAppletMode::PartialForeground || mode == LibraryAppletMode::PartialForegroundIndirectDisplay; @@ -72,6 +74,8 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) { out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()})); m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id); + (void)m_display_service->GetContainer()->SetLayerStackMask(*out_layer_id, + this->GetLayerStackMask()); if (m_applet_id != AppletId::Application) { (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id); @@ -122,6 +126,8 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() { // Ensure the overlay layer is visible m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id); + (void)m_display_service->GetContainer()->SetLayerStackMask(m_system_shared_layer_id, + this->GetLayerStackMask()); m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); s32 initial_z = 1; if (m_applet_id == AppletId::OverlayDisplay) { @@ -142,6 +148,36 @@ Result DisplayLayerManager::GetSystemSharedLayerHandle(u64* out_system_shared_bu R_SUCCEED(); } +u32 DisplayLayerManager::GetLayerStackMask() const { + using Nvnflinger::LayerStackBit; + using Nvnflinger::LayerStackId; + + constexpr u32 Displayed = LayerStackBit(LayerStackId::Default); + constexpr u32 Screenshot = LayerStackBit(LayerStackId::Screenshot); + constexpr u32 Recording = LayerStackBit(LayerStackId::Recording); + constexpr u32 LastFrame = LayerStackBit(LayerStackId::LastFrame); + constexpr u32 Debug = LayerStackBit(LayerStackId::ApplicationForDebug); + + switch (m_applet_id) { + case AppletId::Application: + return Displayed | Screenshot | Recording | LastFrame | Debug; + case AppletId::OverlayDisplay: + return Displayed; + case AppletId::QLaunch: + return Displayed; + default: + break; + } + + switch (m_library_applet_mode) { + case LibraryAppletMode::AllForeground: + case LibraryAppletMode::AllForegroundInitiallyHidden: + return Displayed | Screenshot | LastFrame; + default: + return Displayed | Screenshot; + } +} + void DisplayLayerManager::SetWindowVisibility(bool visible) { if (m_visible == visible) { return; diff --git a/src/core/hle/service/am/display_layer_manager.h b/src/core/hle/service/am/display_layer_manager.h index 393da69707..1469ca08f8 100644 --- a/src/core/hle/service/am/display_layer_manager.h +++ b/src/core/hle/service/am/display_layer_manager.h @@ -51,6 +51,8 @@ public: Result WriteAppletCaptureBuffer(bool* out_was_written, s32* out_fbshare_layer_index); private: + u32 GetLayerStackMask() const; + Kernel::KProcess* m_process{}; std::shared_ptr m_display_service{}; std::shared_ptr m_manager_display_service{}; @@ -59,6 +61,7 @@ private: u64 m_system_shared_buffer_id{}; u64 m_system_shared_layer_id{}; AppletId m_applet_id{}; + LibraryAppletMode m_library_applet_mode{}; bool m_buffer_sharing_enabled{}; bool m_blending_enabled{}; bool m_visible{true};