diff options
| -rw-r--r-- | src/core/hle/service/nvnflinger/display.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/nvnflinger/surface_flinger.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/nvnflinger/surface_flinger.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/vi/container.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/service/vi/container.h | 2 |
5 files changed, 13 insertions, 7 deletions
diff --git a/src/core/hle/service/nvnflinger/display.h b/src/core/hle/service/nvnflinger/display.h index 8a1956fe0..f27cbf144 100644 --- a/src/core/hle/service/nvnflinger/display.h +++ b/src/core/hle/service/nvnflinger/display.h | |||
| @@ -44,6 +44,10 @@ struct Display { | |||
| 44 | return nullptr; | 44 | return nullptr; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | bool HasLayers() { | ||
| 48 | return !stack.layers.empty(); | ||
| 49 | } | ||
| 50 | |||
| 47 | u64 id; | 51 | u64 id; |
| 48 | LayerStack stack; | 52 | LayerStack stack; |
| 49 | }; | 53 | }; |
diff --git a/src/core/hle/service/nvnflinger/surface_flinger.cpp b/src/core/hle/service/nvnflinger/surface_flinger.cpp index 0e9714a03..41a705717 100644 --- a/src/core/hle/service/nvnflinger/surface_flinger.cpp +++ b/src/core/hle/service/nvnflinger/surface_flinger.cpp | |||
| @@ -33,16 +33,17 @@ void SurfaceFlinger::RemoveDisplay(u64 display_id) { | |||
| 33 | std::erase_if(m_displays, [&](auto& display) { return display.id == display_id; }); | 33 | std::erase_if(m_displays, [&](auto& display) { return display.id == display_id; }); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | void SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, | 36 | bool SurfaceFlinger::ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, |
| 37 | u64 display_id) { | 37 | u64 display_id) { |
| 38 | auto* const display = this->FindDisplay(display_id); | 38 | auto* const display = this->FindDisplay(display_id); |
| 39 | if (!display) { | 39 | if (!display || !display->HasLayers()) { |
| 40 | return; | 40 | return false; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | *out_swap_interval = | 43 | *out_swap_interval = |
| 44 | m_composer.ComposeLocked(out_compose_speed_scale, *display, | 44 | m_composer.ComposeLocked(out_compose_speed_scale, *display, |
| 45 | *nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd)); | 45 | *nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>(disp_fd)); |
| 46 | return true; | ||
| 46 | } | 47 | } |
| 47 | 48 | ||
| 48 | void SurfaceFlinger::AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id) { | 49 | void SurfaceFlinger::AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id) { |
diff --git a/src/core/hle/service/nvnflinger/surface_flinger.h b/src/core/hle/service/nvnflinger/surface_flinger.h index a2e661430..d8c53fbda 100644 --- a/src/core/hle/service/nvnflinger/surface_flinger.h +++ b/src/core/hle/service/nvnflinger/surface_flinger.h | |||
| @@ -34,7 +34,7 @@ public: | |||
| 34 | 34 | ||
| 35 | void AddDisplay(u64 display_id); | 35 | void AddDisplay(u64 display_id); |
| 36 | void RemoveDisplay(u64 display_id); | 36 | void RemoveDisplay(u64 display_id); |
| 37 | void ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id); | 37 | bool ComposeDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id); |
| 38 | 38 | ||
| 39 | void AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id); | 39 | void AddLayerToDisplayStack(u64 display_id, s32 consumer_binder_id); |
| 40 | void RemoveLayerFromDisplayStack(u64 display_id, s32 consumer_binder_id); | 40 | void RemoveLayerFromDisplayStack(u64 display_id, s32 consumer_binder_id); |
diff --git a/src/core/hle/service/vi/container.cpp b/src/core/hle/service/vi/container.cpp index 2d6b9cbfe..310a207f1 100644 --- a/src/core/hle/service/vi/container.cpp +++ b/src/core/hle/service/vi/container.cpp | |||
| @@ -218,10 +218,11 @@ void Container::DestroyBufferQueueLocked(Layer* layer) { | |||
| 218 | layer->GetProducerBinderId()); | 218 | layer->GetProducerBinderId()); |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | void Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, | 221 | bool Container::ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, |
| 222 | u64 display_id) { | 222 | u64 display_id) { |
| 223 | std::scoped_lock lk{m_lock}; | 223 | std::scoped_lock lk{m_lock}; |
| 224 | m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale, display_id); | 224 | return m_surface_flinger->ComposeDisplay(out_swap_interval, out_compose_speed_scale, |
| 225 | display_id); | ||
| 225 | } | 226 | } |
| 226 | 227 | ||
| 227 | } // namespace Service::VI | 228 | } // namespace Service::VI |
diff --git a/src/core/hle/service/vi/container.h b/src/core/hle/service/vi/container.h index 155c4c629..cd0d2ca86 100644 --- a/src/core/hle/service/vi/container.h +++ b/src/core/hle/service/vi/container.h | |||
| @@ -76,7 +76,7 @@ private: | |||
| 76 | void DestroyBufferQueueLocked(Layer* layer); | 76 | void DestroyBufferQueueLocked(Layer* layer); |
| 77 | 77 | ||
| 78 | public: | 78 | public: |
| 79 | void ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id); | 79 | bool ComposeOnDisplay(s32* out_swap_interval, f32* out_compose_speed_scale, u64 display_id); |
| 80 | 80 | ||
| 81 | private: | 81 | private: |
| 82 | std::mutex m_lock{}; | 82 | std::mutex m_lock{}; |