Browse Source

fix overlay :)

pull/2953/head
Maufeat 3 months ago
parent
commit
8caa6e37d3
  1. 4
      src/core/hle/service/am/display_layer_manager.cpp
  2. 16
      src/core/hle/service/am/window_system.cpp
  3. 2
      src/core/hle/service/nvnflinger/hardware_composer.cpp

4
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<u32>(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<u32>(m_applet_id));
m_manager_display_service->SetLayerVisibility(m_visible, layer_id);
}
}

16
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;

2
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);

Loading…
Cancel
Save