• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include "FrontEnd/DisplayInfo.h"
20 #include "FrontEnd/LayerLifecycleManager.h"
21 #include "LayerHierarchy.h"
22 #include "LayerSnapshot.h"
23 #include "RequestedLayerState.h"
24 
25 namespace android::surfaceflinger::frontend {
26 
27 // Walks through the layer hierarchy to build an ordered list
28 // of LayerSnapshots that can be passed on to CompositionEngine.
29 // This builder does a minimum amount of work to update
30 // an existing set of snapshots based on hierarchy changes
31 // and RequestedLayerState changes.
32 
33 // The builder also uses a fast path to update
34 // snapshots when there are only buffer updates.
35 class LayerSnapshotBuilder {
36 public:
37     enum class ForceUpdateFlags {
38         NONE,
39         ALL,
40         HIERARCHY,
41     };
42     struct Args {
43         LayerHierarchy root;
44         const LayerLifecycleManager& layerLifecycleManager;
45         ForceUpdateFlags forceUpdate = ForceUpdateFlags::NONE;
46         bool includeMetadata = false;
47         const DisplayInfos& displays;
48         // Set to true if there were display changes since last update.
49         bool displayChanges = false;
50         const renderengine::ShadowSettings& globalShadowSettings;
51         bool supportsBlur = true;
52         bool forceFullDamage = false;
53         std::optional<FloatRect> parentCrop = std::nullopt;
54         std::unordered_set<uint32_t> excludeLayerIds;
55         const std::unordered_map<std::string, bool>& supportedLayerGenericMetadata;
56         const std::unordered_map<std::string, uint32_t>& genericLayerMetadataKeyMap;
57     };
58     LayerSnapshotBuilder();
59 
60     // Rebuild the snapshots from scratch.
61     LayerSnapshotBuilder(Args);
62 
63     // Update an existing set of snapshot using change flags in RequestedLayerState
64     // and LayerLifecycleManager. This needs to be called before
65     // LayerLifecycleManager.commitChanges is called as that function will clear all
66     // change flags.
67     void update(const Args&);
68     std::vector<std::unique_ptr<LayerSnapshot>>& getSnapshots();
69     LayerSnapshot* getSnapshot(uint32_t layerId) const;
70     LayerSnapshot* getSnapshot(const LayerHierarchy::TraversalPath& id) const;
71 
72     typedef std::function<void(const LayerSnapshot& snapshot)> ConstVisitor;
73 
74     // Visit each visible snapshot in z-order
75     void forEachVisibleSnapshot(const ConstVisitor& visitor) const;
76 
77     // Visit each visible snapshot in z-order
78     void forEachVisibleSnapshot(const ConstVisitor& visitor, const LayerHierarchy& root) const;
79 
80     typedef std::function<void(std::unique_ptr<LayerSnapshot>& snapshot)> Visitor;
81     // Visit each visible snapshot in z-order and move the snapshot if needed
82     void forEachVisibleSnapshot(const Visitor& visitor);
83 
84     // Visit each snapshot interesting to input reverse z-order
85     void forEachInputSnapshot(const ConstVisitor& visitor) const;
86 
87 private:
88     friend class LayerSnapshotTest;
89     static LayerSnapshot getRootSnapshot();
90 
91     // return true if we were able to successfully update the snapshots via
92     // the fast path.
93     bool tryFastUpdate(const Args& args);
94 
95     void updateSnapshots(const Args& args);
96 
97     const LayerSnapshot& updateSnapshotsInHierarchy(const Args&, const LayerHierarchy& hierarchy,
98                                                     LayerHierarchy::TraversalPath& traversalPath,
99                                                     const LayerSnapshot& parentSnapshot, int depth);
100     void updateSnapshot(LayerSnapshot&, const Args&, const RequestedLayerState&,
101                         const LayerSnapshot& parentSnapshot, const LayerHierarchy::TraversalPath&);
102     static void updateRelativeState(LayerSnapshot& snapshot, const LayerSnapshot& parentSnapshot,
103                                     bool parentIsRelative, const Args& args);
104     static void resetRelativeState(LayerSnapshot& snapshot);
105     static void updateRoundedCorner(LayerSnapshot& snapshot, const RequestedLayerState& layerState,
106                                     const LayerSnapshot& parentSnapshot);
107     void updateLayerBounds(LayerSnapshot& snapshot, const RequestedLayerState& layerState,
108                            const LayerSnapshot& parentSnapshot, uint32_t displayRotationFlags);
109     static void updateShadows(LayerSnapshot& snapshot, const RequestedLayerState& requested,
110                               const renderengine::ShadowSettings& globalShadowSettings);
111     void updateInput(LayerSnapshot& snapshot, const RequestedLayerState& requested,
112                      const LayerSnapshot& parentSnapshot, const LayerHierarchy::TraversalPath& path,
113                      const Args& args);
114     // Return true if there are unreachable snapshots
115     bool sortSnapshotsByZ(const Args& args);
116     LayerSnapshot* createSnapshot(const LayerHierarchy::TraversalPath& id,
117                                   const RequestedLayerState& layer,
118                                   const LayerSnapshot& parentSnapshot);
119     void updateChildState(LayerSnapshot& snapshot, const LayerSnapshot& childSnapshot,
120                           const Args& args);
121     void updateTouchableRegionCrop(const Args& args);
122 
123     std::unordered_map<LayerHierarchy::TraversalPath, LayerSnapshot*,
124                        LayerHierarchy::TraversalPathHash>
125             mPathToSnapshot;
126     std::multimap<uint32_t, LayerSnapshot*> mIdToSnapshots;
127 
128     // Track snapshots that needs touchable region crop from other snapshots
129     std::unordered_set<LayerHierarchy::TraversalPath, LayerHierarchy::TraversalPathHash>
130             mNeedsTouchableRegionCrop;
131     std::vector<std::unique_ptr<LayerSnapshot>> mSnapshots;
132     LayerSnapshot mRootSnapshot;
133     bool mResortSnapshots = false;
134     int mNumInterestingSnapshots = 0;
135 };
136 
137 } // namespace android::surfaceflinger::frontend
138