12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Michal Pichlinski <[email protected]>
- 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 99657563e117d243af1466dd1d4ad736da85f1b9..13bf3608ab9b8f6753a9474b2ce4c0a8eda60d90 100644
- --- a/ui/compositor/compositor.cc
- +++ b/ui/compositor/compositor.cc
- @@ -344,7 +344,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_));
- @@ -555,7 +556,9 @@ void Compositor::SetVisible(bool visible) {
- // updated then. We need to call this even if the visibility hasn't changed,
- // for the same reason.
- if (display_private_)
- - display_private_->SetDisplayVisible(visible);
- + // Invisible display is throttling itself.
- + display_private_->SetDisplayVisible(
- + background_throttling_ ? visible : true);
-
- if (changed) {
- observer_list_.Notify(&CompositorObserver::OnCompositorVisibilityChanged,
- @@ -1008,6 +1011,15 @@ void Compositor::MaybeUpdateObserveBeginFrame() {
- host_begin_frame_observer_->GetBoundRemote());
- }
-
- +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);
- + }
- +}
- +
- #if BUILDFLAG(IS_CHROMEOS_ASH)
- void Compositor::SetSeamlessRefreshRates(
- const std::vector<float>& seamless_refresh_rates) {
- diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
- index 916a33ebd06e6750cef57ff433b1826424482d26..06a9e039beeb9ac6880a06bf15ec5e8bbbdb76f5 100644
- --- a/ui/compositor/compositor.h
- +++ b/ui/compositor/compositor.h
- @@ -510,6 +510,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();
- }
- @@ -658,6 +662,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();
|