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 private:
37     static LayerSnapshot getRootSnapshot();
38 
39 public:
40     enum class ForceUpdateFlags {
41         NONE,
42         ALL,
43         HIERARCHY,
44     };
45     struct Args {
46         LayerHierarchy root;
47         const LayerLifecycleManager& layerLifecycleManager;
48         ForceUpdateFlags forceUpdate = ForceUpdateFlags::NONE;
49         bool includeMetadata = false;
50         const DisplayInfos& displays;
51         // Set to true if there were display changes since last update.
52         bool displayChanges = false;
53         const ShadowSettings& globalShadowSettings;
54         bool supportsBlur = true;
55         bool forceFullDamage = false;
56         std::optional<FloatRect> parentCrop = std::nullopt;
57         std::unordered_set<uint32_t> excludeLayerIds;
58         const std::unordered_map<std::string, bool>& supportedLayerGenericMetadata;
59         const std::unordered_map<std::string, uint32_t>& genericLayerMetadataKeyMap;
60         bool skipRoundCornersWhenProtected = false;
61         LayerSnapshot rootSnapshot = getRootSnapshot();
62     };
63     LayerSnapshotBuilder();
64 
65     // Rebuild the snapshots from scratch.
66     LayerSnapshotBuilder(Args);
67 
68     // Update an existing set of snapshot using change flags in RequestedLayerState
69     // and LayerLifecycleManager. This needs to be called before
70     // LayerLifecycleManager.commitChanges is called as that function will clear all
71     // change flags.
72     void update(const Args&);
73     std::vector<std::unique_ptr<LayerSnapshot>>& getSnapshots();
74     LayerSnapshot* getSnapshot(uint32_t layerId) const;
75     LayerSnapshot* getSnapshot(const LayerHierarchy::TraversalPath& id) const;
76 
77     typedef std::function<void(const LayerSnapshot& snapshot)> ConstVisitor;
78 
79     // Visit each visible snapshot in z-order
80     void forEachVisibleSnapshot(const ConstVisitor& visitor) const;
81 
82     // Visit each visible snapshot in z-order
83     void forEachVisibleSnapshot(const ConstVisitor& visitor, const LayerHierarchy& root) const;
84 
85     typedef std::function<void(std::unique_ptr<LayerSnapshot>& snapshot)> Visitor;
86     // Visit each visible snapshot in z-order and move the snapshot if needed
87     void forEachVisibleSnapshot(const Visitor& visitor);
88 
89     // Visit each snapshot interesting to input reverse z-order
90     void forEachInputSnapshot(const ConstVisitor& visitor) const;
91 
92 private:
93     friend class LayerSnapshotTest;
94 
95     // return true if we were able to successfully update the snapshots via
96     // the fast path.
97     bool tryFastUpdate(const Args& args);
98 
99     void updateSnapshots(const Args& args);
100 
101     const LayerSnapshot& updateSnapshotsInHierarchy(const Args&, const LayerHierarchy& hierarchy,
102                                                     LayerHierarchy::TraversalPath& traversalPath,
103                                                     const LayerSnapshot& parentSnapshot, int depth);
104     void updateSnapshot(LayerSnapshot&, const Args&, const RequestedLayerState&,
105                         const LayerSnapshot& parentSnapshot, const LayerHierarchy::TraversalPath&);
106     static void updateRelativeState(LayerSnapshot& snapshot, const LayerSnapshot& parentSnapshot,
107                                     bool parentIsRelative, const Args& args);
108     static void resetRelativeState(LayerSnapshot& snapshot);
109     static void updateRoundedCorner(LayerSnapshot& snapshot, const RequestedLayerState& layerState,
110                                     const LayerSnapshot& parentSnapshot, const Args& args);
111     void updateLayerBounds(LayerSnapshot& snapshot, const RequestedLayerState& layerState,
112                            const LayerSnapshot& parentSnapshot, uint32_t displayRotationFlags);
113     static void updateShadows(LayerSnapshot& snapshot, const RequestedLayerState& requested,
114                               const ShadowSettings& globalShadowSettings);
115     void updateInput(LayerSnapshot& snapshot, const RequestedLayerState& requested,
116                      const LayerSnapshot& parentSnapshot, const LayerHierarchy::TraversalPath& path,
117                      const Args& args);
118     // Return true if there are unreachable snapshots
119     bool sortSnapshotsByZ(const Args& args);
120     LayerSnapshot* createSnapshot(const LayerHierarchy::TraversalPath& id,
121                                   const RequestedLayerState& layer,
122                                   const LayerSnapshot& parentSnapshot);
123     void updateFrameRateFromChildSnapshot(LayerSnapshot& snapshot,
124                                           const LayerSnapshot& childSnapshot, const Args& args);
125     void updateTouchableRegionCrop(const Args& args);
126 
127     std::unordered_map<LayerHierarchy::TraversalPath, LayerSnapshot*,
128                        LayerHierarchy::TraversalPathHash>
129             mPathToSnapshot;
130     std::multimap<uint32_t, LayerSnapshot*> mIdToSnapshots;
131 
132     // Track snapshots that needs touchable region crop from other snapshots
133     std::unordered_set<LayerHierarchy::TraversalPath, LayerHierarchy::TraversalPathHash>
134             mNeedsTouchableRegionCrop;
135     std::vector<std::unique_ptr<LayerSnapshot>> mSnapshots;
136     bool mResortSnapshots = false;
137     int mNumInterestingSnapshots = 0;
138 };
139 
140 } // namespace android::surfaceflinger::frontend
141