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

Commit b9723b88 authored by Ady Abraham's avatar Ady Abraham Committed by Android (Google) Code Review
Browse files

Merge "SF: register layers with scheduler when added to current state" into sc-dev

parents 18c79705 be09aadd
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -221,7 +221,10 @@ void Layer::removeRelativeZ(const std::vector<Layer*>& layersInTree) {
}

void Layer::removeFromCurrentState() {
    if (!mRemovedFromCurrentState) {
        mRemovedFromCurrentState = true;
        mFlinger->mScheduler->deregisterLayer(this);
    }

    mFlinger->markLayerPendingRemovalLocked(this);
}
@@ -246,7 +249,10 @@ void Layer::onRemovedFromCurrentState() {
}

void Layer::addToCurrentState() {
    if (mRemovedFromCurrentState) {
        mRemovedFromCurrentState = false;
        mFlinger->mScheduler->registerLayer(this);
    }

    for (const auto& child : mCurrentChildren) {
        child->addToCurrentState();
+10 −3
Original line number Diff line number Diff line
@@ -84,8 +84,11 @@ LayerHistory::LayerHistory(const RefreshRateConfigs& refreshRateConfigs)
LayerHistory::~LayerHistory() = default;

void LayerHistory::registerLayer(Layer* layer, LayerVoteType type) {
    auto info = std::make_unique<LayerInfo>(layer->getName(), layer->getOwnerUid(), type);
    std::lock_guard lock(mLock);
    for (const auto& info : mLayerInfos) {
        LOG_ALWAYS_FATAL_IF(info.first == layer, "%s already registered", layer->getName().c_str());
    }
    auto info = std::make_unique<LayerInfo>(layer->getName(), layer->getOwnerUid(), type);
    mLayerInfos.emplace_back(layer, std::move(info));
}

@@ -94,7 +97,7 @@ void LayerHistory::deregisterLayer(Layer* layer) {

    const auto it = std::find_if(mLayerInfos.begin(), mLayerInfos.end(),
                                 [layer](const auto& pair) { return pair.first == layer; });
    LOG_FATAL_IF(it == mLayerInfos.end(), "%s: unknown layer %p", __FUNCTION__, layer);
    LOG_ALWAYS_FATAL_IF(it == mLayerInfos.end(), "%s: unknown layer %p", __FUNCTION__, layer);

    const size_t i = static_cast<size_t>(it - mLayerInfos.begin());
    if (i < mActiveLayersEnd) {
@@ -111,7 +114,11 @@ void LayerHistory::record(Layer* layer, nsecs_t presentTime, nsecs_t now,

    const auto it = std::find_if(mLayerInfos.begin(), mLayerInfos.end(),
                                 [layer](const auto& pair) { return pair.first == layer; });
    LOG_FATAL_IF(it == mLayerInfos.end(), "%s: unknown layer %p", __FUNCTION__, layer);
    if (it == mLayerInfos.end()) {
        // Offscreen layer
        ALOGV("LayerHistory::record: %s not registered", layer->getName().c_str());
        return;
    }

    const auto& info = it->second;
    const auto layerProps = LayerInfo::LayerProps{
+6 −2
Original line number Diff line number Diff line
@@ -6450,13 +6450,17 @@ wp<Layer> SurfaceFlinger::fromHandleLocked(const sp<IBinder>& handle) const {

void SurfaceFlinger::onLayerFirstRef(Layer* layer) {
    mNumLayers++;
    if (!layer->isRemovedFromCurrentState()) {
        mScheduler->registerLayer(layer);
    }
}

void SurfaceFlinger::onLayerDestroyed(Layer* layer) {
    mScheduler->deregisterLayer(layer);
    mNumLayers--;
    removeFromOffscreenLayers(layer);
    if (!layer->isRemovedFromCurrentState()) {
        mScheduler->deregisterLayer(layer);
    }
}

// WARNING: ONLY CALL THIS FROM LAYER DTOR