blob: 9304ea96581d7a8913f552a11d9ea264d0cd6b8f [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/aura/host_frame_rate_throttler.h"
#include "base/containers/contains.h"
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/host/host_frame_sink_manager.h"
#include "ui/aura/env.h"
#include "ui/aura/window_tree_host.h"
#include "ui/compositor/compositor.h"
namespace aura {
#if BUILDFLAG(IS_WIN)
constexpr uint8_t kDefaultThrottleFps = 1;
#else
constexpr uint8_t kDefaultThrottleFps = 20;
#endif
HostFrameRateThrottler& HostFrameRateThrottler::GetInstance() {
static base::NoDestructor<HostFrameRateThrottler> instance;
return *instance;
}
HostFrameRateThrottler::HostFrameRateThrottler() = default;
HostFrameRateThrottler::~HostFrameRateThrottler() = default;
void HostFrameRateThrottler::AddHost(WindowTreeHost* host) {
if (base::Contains(hosts_, host))
return;
hosts_.insert(host);
UpdateHostFrameSinkManager();
}
void HostFrameRateThrottler::RemoveHost(WindowTreeHost* host) {
if (!base::Contains(hosts_, host))
return;
hosts_.erase(host);
UpdateHostFrameSinkManager();
}
void HostFrameRateThrottler::UpdateHostFrameSinkManager() {
std::vector<viz::FrameSinkId> ids;
ids.reserve(hosts_.size());
for (WindowTreeHost* host : hosts_)
ids.push_back(host->compositor()->frame_sink_id());
Env::GetInstance()->context_factory()->GetHostFrameSinkManager()->Throttle(
ids, base::Hertz(kDefaultThrottleFps));
}
} // namespace aura