Loading libs/gui/include/gui/LayerState.h +38 −18 Original line number Diff line number Diff line Loading @@ -206,26 +206,46 @@ struct layer_state_t { uint64_t diff(const layer_state_t& other) const; bool hasBufferChanges() const; // Changes to the tree structure. static constexpr uint64_t HIERARCHY_CHANGES = layer_state_t::eLayerChanged | layer_state_t::eRelativeLayerChanged | layer_state_t::eReparent | layer_state_t::eBackgroundColorChanged; // Layer hierarchy updates. static constexpr uint64_t HIERARCHY_CHANGES = layer_state_t::eBackgroundColorChanged | layer_state_t::eLayerChanged | layer_state_t::eRelativeLayerChanged | layer_state_t::eReparent; // Geometry updates. static constexpr uint64_t GEOMETRY_CHANGES = layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eCropChanged | layer_state_t::eDestinationFrameChanged | layer_state_t::eMatrixChanged | layer_state_t::ePositionChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eTransparentRegionChanged; // Buffer and related updates. static constexpr uint64_t BUFFER_CHANGES = layer_state_t::eApiChanged | layer_state_t::eBufferChanged | layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eDataspaceChanged | layer_state_t::eSidebandStreamChanged | layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eTransparentRegionChanged; // Content updates. static constexpr uint64_t CONTENT_CHANGES = layer_state_t::eAlphaChanged | layer_state_t::eTransparentRegionChanged | layer_state_t::eShadowRadiusChanged | layer_state_t::eRenderBorderChanged | layer_state_t::eColorChanged | layer_state_t::eBufferChanged | layer_state_t::eDataspaceChanged | layer_state_t::eApiChanged | layer_state_t::eSidebandStreamChanged | static constexpr uint64_t CONTENT_CHANGES = layer_state_t::BUFFER_CHANGES | layer_state_t::eAlphaChanged | layer_state_t::eAutoRefreshChanged | layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBackgroundColorChanged | layer_state_t::eBlurRegionsChanged | layer_state_t::eColorChanged | layer_state_t::eColorSpaceAgnosticChanged | layer_state_t::eColorTransformChanged | layer_state_t::eCornerRadiusChanged | layer_state_t::eHdrMetadataChanged | layer_state_t::eRenderBorderChanged | layer_state_t::eShadowRadiusChanged | layer_state_t::eStretchChanged; // Changes which invalidates the layer's visible region in CE. static constexpr uint64_t CONTENT_DIRTY = layer_state_t::CONTENT_CHANGES | layer_state_t::GEOMETRY_CHANGES | layer_state_t::HIERARCHY_CHANGES; // Changes affecting child states. static constexpr uint64_t AFFECTS_CHILDREN = layer_state_t::GEOMETRY_CHANGES | layer_state_t::HIERARCHY_CHANGES | layer_state_t::eAlphaChanged | layer_state_t::eColorTransformChanged | layer_state_t::eCornerRadiusChanged | layer_state_t::eBackgroundColorChanged | layer_state_t::eColorSpaceAgnosticChanged | layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBlurRegionsChanged | layer_state_t::eAutoRefreshChanged | layer_state_t::eStretchChanged; // Changes to content or children size. static constexpr uint64_t GEOMETRY_CHANGES = layer_state_t::ePositionChanged | layer_state_t::eMatrixChanged | layer_state_t::eTransparentRegionChanged | layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eCropChanged | layer_state_t::eDestinationFrameChanged; layer_state_t::eFlagsChanged | layer_state_t::eLayerStackChanged | layer_state_t::eTrustedOverlayChanged; bool hasValidBuffer() const; void sanitize(int32_t permissions); Loading services/surfaceflinger/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,8 @@ filegroup { "EventLog/EventLog.cpp", "FrontEnd/LayerCreationArgs.cpp", "FrontEnd/LayerHandle.cpp", "FrontEnd/LayerSnapshot.cpp", "FrontEnd/LayerSnapshotBuilder.cpp", "FrontEnd/LayerHierarchy.cpp", "FrontEnd/LayerLifecycleManager.cpp", "FrontEnd/RequestedLayerState.cpp", Loading services/surfaceflinger/FrontEnd/LayerHierarchy.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ const RequestedLayerState* LayerHierarchy::getLayer() const { std::string LayerHierarchy::getDebugStringShort() const { std::string debug = "LayerHierarchy{"; debug += ((mLayer) ? mLayer->getDebugStringShort() : "root") + " "; debug += ((mLayer) ? mLayer->getDebugString() : "root") + " "; if (mChildren.empty()) { debug += "no children"; } else { Loading Loading @@ -401,10 +401,13 @@ LayerHierarchy* LayerHierarchyBuilder::getHierarchyFromId(uint32_t layerId, bool return it->second; } LayerHierarchy::TraversalPath LayerHierarchy::TraversalPath::ROOT_TRAVERSAL_ID = const LayerHierarchy::TraversalPath LayerHierarchy::TraversalPath::ROOT = {.id = UNASSIGNED_LAYER_ID, .variant = LayerHierarchy::Attached}; std::string LayerHierarchy::TraversalPath::toString() const { if (id == UNASSIGNED_LAYER_ID) { return "TraversalPath{ROOT}"; } std::string debugString = "TraversalPath{.id = " + std::to_string(id); if (!mirrorRootIds.empty()) { Loading Loading @@ -437,20 +440,22 @@ LayerHierarchy::ScopedAddToTraversalPath::ScopedAddToTraversalPath(TraversalPath LayerHierarchy::Variant variant) : mTraversalPath(traversalPath), mParentId(traversalPath.id), mParentVariant(traversalPath.variant) { mParentVariant(traversalPath.variant), mParentDetached(traversalPath.detached) { // Update the traversal id with the child layer id and variant. Parent id and variant are // stored to reset the id upon destruction. traversalPath.id = layerId; traversalPath.variant = variant; if (variant == LayerHierarchy::Variant::Mirror) { traversalPath.mirrorRootIds.emplace_back(layerId); } if (variant == LayerHierarchy::Variant::Relative) { } else if (variant == LayerHierarchy::Variant::Relative) { if (std::find(traversalPath.relativeRootIds.begin(), traversalPath.relativeRootIds.end(), layerId) != traversalPath.relativeRootIds.end()) { traversalPath.invalidRelativeRootId = layerId; } traversalPath.relativeRootIds.emplace_back(layerId); } else if (variant == LayerHierarchy::Variant::Detached) { traversalPath.detached = true; } } LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { Loading @@ -458,8 +463,7 @@ LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { // the constructor. if (mTraversalPath.variant == LayerHierarchy::Variant::Mirror) { mTraversalPath.mirrorRootIds.pop_back(); } if (mTraversalPath.variant == LayerHierarchy::Variant::Relative) { } else if (mTraversalPath.variant == LayerHierarchy::Variant::Relative) { mTraversalPath.relativeRootIds.pop_back(); } if (mTraversalPath.invalidRelativeRootId == mTraversalPath.id) { Loading @@ -467,6 +471,7 @@ LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { } mTraversalPath.id = mParentId; mTraversalPath.variant = mParentVariant; mTraversalPath.detached = mParentDetached; } } // namespace android::surfaceflinger::frontend services/surfaceflinger/FrontEnd/LayerHierarchy.h +14 −4 Original line number Diff line number Diff line Loading @@ -63,15 +63,22 @@ public: // First duplicate relative root id found. If this is a valid layer id that means we are // in a loop. uint32_t invalidRelativeRootId = UNASSIGNED_LAYER_ID; // See isAttached() bool detached = false; bool hasRelZLoop() const { return invalidRelativeRootId != UNASSIGNED_LAYER_ID; } bool isRelative() { return !relativeRootIds.empty(); } // Returns true if this node is reached via one or more relative parents. bool isRelative() const { return !relativeRootIds.empty(); } // Returns true if the node or its parents are not Detached. bool isAttached() const { return !detached; } // Returns true if the node is a clone. bool isClone() const { return !mirrorRootIds.empty(); } bool operator==(const TraversalPath& other) const { return id == other.id && mirrorRootIds == other.mirrorRootIds; } std::string toString() const; static TraversalPath ROOT_TRAVERSAL_ID; static const TraversalPath ROOT; }; // Helper class to add nodes to an existing traversal id and removes the Loading @@ -86,6 +93,7 @@ public: TraversalPath& mTraversalPath; uint32_t mParentId; LayerHierarchy::Variant mParentVariant; bool mParentDetached; }; LayerHierarchy(RequestedLayerState* layer); Loading @@ -98,12 +106,14 @@ public: // Traverse the hierarchy and visit all child variants. void traverse(const Visitor& visitor) const { traverse(visitor, TraversalPath::ROOT_TRAVERSAL_ID); TraversalPath root = TraversalPath::ROOT; traverse(visitor, root); } // Traverse the hierarchy in z-order, skipping children that have relative parents. void traverseInZOrder(const Visitor& visitor) const { traverseInZOrder(visitor, TraversalPath::ROOT_TRAVERSAL_ID); TraversalPath root = TraversalPath::ROOT; traverseInZOrder(visitor, root); } const RequestedLayerState* getLayer() const; Loading services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -210,10 +210,7 @@ void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState layer->touchCropId = linkLayer(layer->touchCropId, layer->id); } mGlobalChanges |= layer->changes & (RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::Geometry | RequestedLayerState::Changes::Content); mGlobalChanges |= layer->changes; } } } Loading Loading
libs/gui/include/gui/LayerState.h +38 −18 Original line number Diff line number Diff line Loading @@ -206,26 +206,46 @@ struct layer_state_t { uint64_t diff(const layer_state_t& other) const; bool hasBufferChanges() const; // Changes to the tree structure. static constexpr uint64_t HIERARCHY_CHANGES = layer_state_t::eLayerChanged | layer_state_t::eRelativeLayerChanged | layer_state_t::eReparent | layer_state_t::eBackgroundColorChanged; // Layer hierarchy updates. static constexpr uint64_t HIERARCHY_CHANGES = layer_state_t::eBackgroundColorChanged | layer_state_t::eLayerChanged | layer_state_t::eRelativeLayerChanged | layer_state_t::eReparent; // Geometry updates. static constexpr uint64_t GEOMETRY_CHANGES = layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eCropChanged | layer_state_t::eDestinationFrameChanged | layer_state_t::eMatrixChanged | layer_state_t::ePositionChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eTransparentRegionChanged; // Buffer and related updates. static constexpr uint64_t BUFFER_CHANGES = layer_state_t::eApiChanged | layer_state_t::eBufferChanged | layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eDataspaceChanged | layer_state_t::eSidebandStreamChanged | layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eTransparentRegionChanged; // Content updates. static constexpr uint64_t CONTENT_CHANGES = layer_state_t::eAlphaChanged | layer_state_t::eTransparentRegionChanged | layer_state_t::eShadowRadiusChanged | layer_state_t::eRenderBorderChanged | layer_state_t::eColorChanged | layer_state_t::eBufferChanged | layer_state_t::eDataspaceChanged | layer_state_t::eApiChanged | layer_state_t::eSidebandStreamChanged | static constexpr uint64_t CONTENT_CHANGES = layer_state_t::BUFFER_CHANGES | layer_state_t::eAlphaChanged | layer_state_t::eAutoRefreshChanged | layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBackgroundColorChanged | layer_state_t::eBlurRegionsChanged | layer_state_t::eColorChanged | layer_state_t::eColorSpaceAgnosticChanged | layer_state_t::eColorTransformChanged | layer_state_t::eCornerRadiusChanged | layer_state_t::eHdrMetadataChanged | layer_state_t::eRenderBorderChanged | layer_state_t::eShadowRadiusChanged | layer_state_t::eStretchChanged; // Changes which invalidates the layer's visible region in CE. static constexpr uint64_t CONTENT_DIRTY = layer_state_t::CONTENT_CHANGES | layer_state_t::GEOMETRY_CHANGES | layer_state_t::HIERARCHY_CHANGES; // Changes affecting child states. static constexpr uint64_t AFFECTS_CHILDREN = layer_state_t::GEOMETRY_CHANGES | layer_state_t::HIERARCHY_CHANGES | layer_state_t::eAlphaChanged | layer_state_t::eColorTransformChanged | layer_state_t::eCornerRadiusChanged | layer_state_t::eBackgroundColorChanged | layer_state_t::eColorSpaceAgnosticChanged | layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBlurRegionsChanged | layer_state_t::eAutoRefreshChanged | layer_state_t::eStretchChanged; // Changes to content or children size. static constexpr uint64_t GEOMETRY_CHANGES = layer_state_t::ePositionChanged | layer_state_t::eMatrixChanged | layer_state_t::eTransparentRegionChanged | layer_state_t::eBufferCropChanged | layer_state_t::eBufferTransformChanged | layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eCropChanged | layer_state_t::eDestinationFrameChanged; layer_state_t::eFlagsChanged | layer_state_t::eLayerStackChanged | layer_state_t::eTrustedOverlayChanged; bool hasValidBuffer() const; void sanitize(int32_t permissions); Loading
services/surfaceflinger/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,8 @@ filegroup { "EventLog/EventLog.cpp", "FrontEnd/LayerCreationArgs.cpp", "FrontEnd/LayerHandle.cpp", "FrontEnd/LayerSnapshot.cpp", "FrontEnd/LayerSnapshotBuilder.cpp", "FrontEnd/LayerHierarchy.cpp", "FrontEnd/LayerLifecycleManager.cpp", "FrontEnd/RequestedLayerState.cpp", Loading
services/surfaceflinger/FrontEnd/LayerHierarchy.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ const RequestedLayerState* LayerHierarchy::getLayer() const { std::string LayerHierarchy::getDebugStringShort() const { std::string debug = "LayerHierarchy{"; debug += ((mLayer) ? mLayer->getDebugStringShort() : "root") + " "; debug += ((mLayer) ? mLayer->getDebugString() : "root") + " "; if (mChildren.empty()) { debug += "no children"; } else { Loading Loading @@ -401,10 +401,13 @@ LayerHierarchy* LayerHierarchyBuilder::getHierarchyFromId(uint32_t layerId, bool return it->second; } LayerHierarchy::TraversalPath LayerHierarchy::TraversalPath::ROOT_TRAVERSAL_ID = const LayerHierarchy::TraversalPath LayerHierarchy::TraversalPath::ROOT = {.id = UNASSIGNED_LAYER_ID, .variant = LayerHierarchy::Attached}; std::string LayerHierarchy::TraversalPath::toString() const { if (id == UNASSIGNED_LAYER_ID) { return "TraversalPath{ROOT}"; } std::string debugString = "TraversalPath{.id = " + std::to_string(id); if (!mirrorRootIds.empty()) { Loading Loading @@ -437,20 +440,22 @@ LayerHierarchy::ScopedAddToTraversalPath::ScopedAddToTraversalPath(TraversalPath LayerHierarchy::Variant variant) : mTraversalPath(traversalPath), mParentId(traversalPath.id), mParentVariant(traversalPath.variant) { mParentVariant(traversalPath.variant), mParentDetached(traversalPath.detached) { // Update the traversal id with the child layer id and variant. Parent id and variant are // stored to reset the id upon destruction. traversalPath.id = layerId; traversalPath.variant = variant; if (variant == LayerHierarchy::Variant::Mirror) { traversalPath.mirrorRootIds.emplace_back(layerId); } if (variant == LayerHierarchy::Variant::Relative) { } else if (variant == LayerHierarchy::Variant::Relative) { if (std::find(traversalPath.relativeRootIds.begin(), traversalPath.relativeRootIds.end(), layerId) != traversalPath.relativeRootIds.end()) { traversalPath.invalidRelativeRootId = layerId; } traversalPath.relativeRootIds.emplace_back(layerId); } else if (variant == LayerHierarchy::Variant::Detached) { traversalPath.detached = true; } } LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { Loading @@ -458,8 +463,7 @@ LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { // the constructor. if (mTraversalPath.variant == LayerHierarchy::Variant::Mirror) { mTraversalPath.mirrorRootIds.pop_back(); } if (mTraversalPath.variant == LayerHierarchy::Variant::Relative) { } else if (mTraversalPath.variant == LayerHierarchy::Variant::Relative) { mTraversalPath.relativeRootIds.pop_back(); } if (mTraversalPath.invalidRelativeRootId == mTraversalPath.id) { Loading @@ -467,6 +471,7 @@ LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() { } mTraversalPath.id = mParentId; mTraversalPath.variant = mParentVariant; mTraversalPath.detached = mParentDetached; } } // namespace android::surfaceflinger::frontend
services/surfaceflinger/FrontEnd/LayerHierarchy.h +14 −4 Original line number Diff line number Diff line Loading @@ -63,15 +63,22 @@ public: // First duplicate relative root id found. If this is a valid layer id that means we are // in a loop. uint32_t invalidRelativeRootId = UNASSIGNED_LAYER_ID; // See isAttached() bool detached = false; bool hasRelZLoop() const { return invalidRelativeRootId != UNASSIGNED_LAYER_ID; } bool isRelative() { return !relativeRootIds.empty(); } // Returns true if this node is reached via one or more relative parents. bool isRelative() const { return !relativeRootIds.empty(); } // Returns true if the node or its parents are not Detached. bool isAttached() const { return !detached; } // Returns true if the node is a clone. bool isClone() const { return !mirrorRootIds.empty(); } bool operator==(const TraversalPath& other) const { return id == other.id && mirrorRootIds == other.mirrorRootIds; } std::string toString() const; static TraversalPath ROOT_TRAVERSAL_ID; static const TraversalPath ROOT; }; // Helper class to add nodes to an existing traversal id and removes the Loading @@ -86,6 +93,7 @@ public: TraversalPath& mTraversalPath; uint32_t mParentId; LayerHierarchy::Variant mParentVariant; bool mParentDetached; }; LayerHierarchy(RequestedLayerState* layer); Loading @@ -98,12 +106,14 @@ public: // Traverse the hierarchy and visit all child variants. void traverse(const Visitor& visitor) const { traverse(visitor, TraversalPath::ROOT_TRAVERSAL_ID); TraversalPath root = TraversalPath::ROOT; traverse(visitor, root); } // Traverse the hierarchy in z-order, skipping children that have relative parents. void traverseInZOrder(const Visitor& visitor) const { traverseInZOrder(visitor, TraversalPath::ROOT_TRAVERSAL_ID); TraversalPath root = TraversalPath::ROOT; traverseInZOrder(visitor, root); } const RequestedLayerState* getLayer() const; Loading
services/surfaceflinger/FrontEnd/LayerLifecycleManager.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -210,10 +210,7 @@ void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState layer->touchCropId = linkLayer(layer->touchCropId, layer->id); } mGlobalChanges |= layer->changes & (RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::Geometry | RequestedLayerState::Changes::Content); mGlobalChanges |= layer->changes; } } } Loading