From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Michal Pichlinski Date: Thu, 15 Jun 2023 23:04:48 +0200 Subject: allow disabling throttling in the `viz::DisplayScheduler` per `ui::Compositor` In Chromium when the `viz::DisplayScheduler` is invisible it throttles its work by dropping frame draws and swaps. This patch allows disbling this throttling by preventing transition to invisible state of the `viz::DisplayScheduler` owned by the `ui::Compositor`. diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 33f68e9a42b5d4dd9a25309ea8b1d3955d2c4550..16660be85a2ac25bacbaf95d40acb896536ef852 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -339,7 +339,8 @@ void Compositor::SetLayerTreeFrameSink( if (display_private_) { disabled_swap_until_resize_ = false; display_private_->Resize(size()); - display_private_->SetDisplayVisible(host_->IsVisible()); + // Invisible display is throttling itself. + display_private_->SetDisplayVisible(background_throttling_ ? host_->IsVisible() : true); display_private_->SetDisplayColorSpaces(display_color_spaces_); display_private_->SetDisplayColorMatrix( gfx::SkM44ToTransform(display_color_matrix_)); @@ -531,8 +532,11 @@ void Compositor::SetVisible(bool visible) { host_->SetVisible(visible); // Visibility is reset when the output surface is lost, so this must also be // updated then. - if (display_private_) - display_private_->SetDisplayVisible(visible); + if (display_private_) { + // Invisible display is throttling itself. + display_private_->SetDisplayVisible( + background_throttling_ ? visible : true); + } } bool Compositor::IsVisible() { @@ -957,4 +961,13 @@ const cc::LayerTreeSettings& Compositor::GetLayerTreeSettings() const { return host_->GetSettings(); } +void Compositor::SetBackgroundThrottling(bool background_throttling_enabled) { + background_throttling_ = background_throttling_enabled; + if (display_private_) { + // Invisible display is throttling itself. + display_private_->SetDisplayVisible( + background_throttling_ ? host_->IsVisible() : true); + } +} + } // namespace ui diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 0c8ae51d15963796a8967dd1d47ff9f0d4ef733e..4fcfd6b900163b20420def8c92625b60cf687996 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -514,6 +514,10 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, const cc::LayerTreeSettings& GetLayerTreeSettings() const; + // Sets |background_throttling_| responsible for suspending drawing + // and switching frames. + void SetBackgroundThrottling(bool background_throttling_enabled); + size_t saved_events_metrics_count_for_testing() const { return host_->saved_events_metrics_count_for_testing(); } @@ -631,6 +635,12 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, // See go/report-ux-metrics-at-painting for details. bool animation_started_ = false; + // Background throttling is a default Chromium behaviour. It occurs + // when the |display_private_| is not visible by prevent drawing and swapping + // frames. When it is disabled we are keeping |display_private_| always + // visible in order to keep generating frames. + bool background_throttling_ = true; + TrackerId next_throughput_tracker_id_ = 1u; struct TrackerState { TrackerState();