1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/client/frame_evictor.h"
#include <utility>
#include "base/containers/contains.h"
#include "base/feature_list.h"
#include "build/buildflag.h"
#include "components/viz/common/features.h"
namespace viz {
FrameEvictorClient::EvictIds::EvictIds() = default;
FrameEvictorClient::EvictIds::~EvictIds() = default;
FrameEvictorClient::EvictIds::EvictIds(EvictIds&& other) = default;
FrameEvictorClient::EvictIds& FrameEvictorClient::EvictIds::operator=(
EvictIds&& other) = default;
FrameEvictor::FrameEvictor(FrameEvictorClient* client) : client_(client) {}
FrameEvictor::~FrameEvictor() {
OnSurfaceDiscarded();
}
void FrameEvictor::OnNewSurfaceEmbedded() {
has_surface_ = true;
FrameEvictionManager::GetInstance()->AddFrame(this, visible_);
}
void FrameEvictor::OnSurfaceDiscarded() {
FrameEvictionManager::GetInstance()->RemoveFrame(this);
has_surface_ = false;
}
void FrameEvictor::SetVisible(bool visible) {
if (visible_ == visible)
return;
visible_ = visible;
if (has_surface_) {
if (visible)
FrameEvictionManager::GetInstance()->LockFrame(this);
else
FrameEvictionManager::GetInstance()->UnlockFrame(this);
}
}
std::vector<SurfaceId> FrameEvictor::CollectSurfaceIdsForEviction() const {
auto ids = client_->CollectSurfaceIdsForEviction();
std::vector<SurfaceId> output_ids = std::move(ids.embedded_ids);
auto current = client_->GetCurrentSurfaceId();
DCHECK(output_ids.empty() || !current.is_valid() ||
base::Contains(output_ids, current));
if (output_ids.empty() && current.is_valid()) {
output_ids.push_back(current);
}
auto pre_nav_surface_id = client_->GetPreNavigationSurfaceId();
if (pre_nav_surface_id.is_valid()) {
output_ids.push_back(pre_nav_surface_id);
}
std::ranges::sort(output_ids.begin(), output_ids.end());
return output_ids;
}
void FrameEvictor::EvictCurrentFrame() {
client_->EvictDelegatedFrame(CollectSurfaceIdsForEviction());
}
} // namespace viz
|