blob: 016efa84eacf5554c19ea248e58356ffe23b5018 [file] [log] [blame]
Avi Drissman3e1a26c2022-09-15 20:26:031// Copyright 2018 The Chromium Authors
Xiyuan Xia40cd41d2018-12-18 16:22:432// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/aura/window_occlusion_change_builder.h"
6
Hans Wennborg8586102b2020-05-05 13:43:297#include "base/check_op.h"
Xiyuan Xia40cd41d2018-12-18 16:22:438#include "base/containers/flat_map.h"
Xiyuan Xiad7e4d942019-06-12 22:32:529#include "components/viz/client/frame_eviction_manager.h"
Xiyuan Xia40cd41d2018-12-18 16:22:4310#include "third_party/skia/include/core/SkRegion.h"
11#include "ui/aura/window_tracker.h"
12
13namespace aura {
14
15// Provide updating of occlusion info on aura::Window.
16class DefaultWindowOcclusionChangeBuilder
17 : public WindowOcclusionChangeBuilder {
18 public:
19 DefaultWindowOcclusionChangeBuilder() = default;
Peter Boströmc8c12352021-09-21 23:37:1520
21 DefaultWindowOcclusionChangeBuilder(
22 const DefaultWindowOcclusionChangeBuilder&) = delete;
23 DefaultWindowOcclusionChangeBuilder& operator=(
24 const DefaultWindowOcclusionChangeBuilder&) = delete;
25
Xiyuan Xia40cd41d2018-12-18 16:22:4326 ~DefaultWindowOcclusionChangeBuilder() override {
Xiyuan Xiad7e4d942019-06-12 22:32:5227 // No frame eviction until all occlusion state changes are applied.
28 viz::FrameEvictionManager::ScopedPause scoped_frame_eviction_pause;
29
Xiyuan Xia40cd41d2018-12-18 16:22:4330 while (!windows_.windows().empty()) {
31 Window* window = windows_.Pop();
32 auto it = changes_.find(window);
33 if (it == changes_.end())
34 continue;
Xiyuan Xia40cd41d2018-12-18 16:22:4335 window->SetOcclusionInfo(it->second.occlusion_state,
36 it->second.occluded_region);
37 }
38 changes_.clear();
39 }
40
41 private:
42 struct OcclusionData {
43 Window::OcclusionState occlusion_state;
44 SkRegion occluded_region;
45 };
46
47 // WindowOcclusionChangeBuilder:
48 void Add(Window* window,
49 Window::OcclusionState occlusion_state,
50 SkRegion occluded_region) override {
51 // Change back to UNKNOWN is not allowed.
52 DCHECK_NE(occlusion_state, Window::OcclusionState::UNKNOWN);
53
54 windows_.Add(window);
55 changes_[window] = {occlusion_state, occluded_region};
56 }
57
58 // Tracks live windows that has a change. This is needed in addition to the
59 // keys in |changes_| because the window tree may change while changes are
60 // accumulated or being applied.
61 WindowTracker windows_;
62
63 // Stores the accumulated occlusion changes.
64 base::flat_map<Window*, OcclusionData> changes_;
Xiyuan Xia40cd41d2018-12-18 16:22:4365};
66
67// static
68std::unique_ptr<WindowOcclusionChangeBuilder>
69WindowOcclusionChangeBuilder::Create() {
70 return std::make_unique<DefaultWindowOcclusionChangeBuilder>();
71}
72
73} // namespace aura