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