Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e1a3878 authored by Vishnu Nair's avatar Vishnu Nair Committed by Android (Google) Code Review
Browse files

Merge "SF: Introduce LayerSnapshot and LayerSnapshotBuilder"

parents 39bf1d61 8fc721bb
Loading
Loading
Loading
Loading
+38 −18
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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",
+12 −7
Original line number Diff line number Diff line
@@ -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 {
@@ -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()) {
@@ -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() {
@@ -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) {
@@ -467,6 +471,7 @@ LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath() {
    }
    mTraversalPath.id = mParentId;
    mTraversalPath.variant = mParentVariant;
    mTraversalPath.detached = mParentDetached;
}

} // namespace android::surfaceflinger::frontend
+14 −4
Original line number Diff line number Diff line
@@ -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
@@ -86,6 +93,7 @@ public:
        TraversalPath& mTraversalPath;
        uint32_t mParentId;
        LayerHierarchy::Variant mParentVariant;
        bool mParentDetached;
    };
    LayerHierarchy(RequestedLayerState* layer);

@@ -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;
+1 −4
Original line number Diff line number Diff line
@@ -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