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