From 8caa6e37d39c94d6fc21cdf7192359fc45137094 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Tue, 4 Nov 2025 22:42:18 +0100 Subject: [PATCH] fix overlay :) --- .../hle/service/am/display_layer_manager.cpp | 4 ++++ src/core/hle/service/am/window_system.cpp | 16 ++++++++++++++-- .../hle/service/nvnflinger/hardware_composer.cpp | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/am/display_layer_manager.cpp b/src/core/hle/service/am/display_layer_manager.cpp index e31cae4da6..b13b0f9e81 100644 --- a/src/core/hle/service/am/display_layer_manager.cpp +++ b/src/core/hle/service/am/display_layer_manager.cpp @@ -158,10 +158,14 @@ void DisplayLayerManager::SetWindowVisibility(bool visible) { if (m_manager_display_service) { if (m_system_shared_layer_id) { + LOG_INFO(Service_VI, "DLM: SetWindowVisibility shared_layer={} visible={} applet_id={}", + m_system_shared_layer_id, m_visible, static_cast(m_applet_id)); m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id); } for (const auto layer_id : m_managed_display_layers) { + LOG_INFO(Service_VI, "DLM: SetWindowVisibility managed_layer={} visible={} applet_id={}", + layer_id, m_visible, static_cast(m_applet_id)); m_manager_display_service->SetLayerVisibility(m_visible, layer_id); } } diff --git a/src/core/hle/service/am/window_system.cpp b/src/core/hle/service/am/window_system.cpp index 1efffc2e40..6f13e7e0e9 100644 --- a/src/core/hle/service/am/window_system.cpp +++ b/src/core/hle/service/am/window_system.cpp @@ -312,10 +312,22 @@ void WindowSystem::UpdateAppletStateLocked(Applet* applet, bool is_foreground) { }(); // Update visibility state. - applet->display_layer_manager.SetWindowVisibility(is_foreground && applet->window_visible); + // Overlay applets should always be visible when window_visible is true, regardless of foreground state + const bool should_be_visible = (applet->applet_id == AppletId::OverlayDisplay) + ? applet->window_visible + : (is_foreground && applet->window_visible); + if (applet->applet_id == AppletId::OverlayDisplay) { + LOG_INFO(Service_AM, "WindowSystem: Overlay visibility update - window_visible={} should_be_visible={} is_foreground={}", + applet->window_visible, should_be_visible, is_foreground); + } + applet->display_layer_manager.SetWindowVisibility(should_be_visible); // Update interactibility state. - applet->SetInteractibleLocked(is_foreground && applet->window_visible); + // Overlay applets should be interactible when visible, as they need to handle input (e.g. home button) + const bool should_be_interactible = (applet->applet_id == AppletId::OverlayDisplay) + ? applet->window_visible + : (is_foreground && applet->window_visible); + applet->SetInteractibleLocked(should_be_interactible); // Update focus state and suspension. const bool is_obscured = has_obscuring_child_applets || !applet->window_visible; diff --git a/src/core/hle/service/nvnflinger/hardware_composer.cpp b/src/core/hle/service/nvnflinger/hardware_composer.cpp index b960821253..26a78ae7ac 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.cpp +++ b/src/core/hle/service/nvnflinger/hardware_composer.cpp @@ -130,7 +130,7 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, if (has_acquired_buffer && !composition_stack.empty()) { // Sort back-to-front: lower z first, higher z last so top-most draws last (on top). std::stable_sort(composition_stack.begin(), composition_stack.end(), - [&](const HwcLayer& l, const HwcLayer& r) { return l.z_index > r.z_index; }); + [&](const HwcLayer& l, const HwcLayer& r) { return l.z_index < r.z_index; }); // Composite. nvdisp.Composite(composition_stack);