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

Commit be09aadd authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: register layers with scheduler when added to current state

Scheduler shouldn't care about layers that are not part of the
current state as those layers are invisible.

Test: atest SetFrameRateTest
Bug: 186190571
Change-Id: Iee5a8ab6d54989f4a663e2fb51e3e956dd3cfa6e
parent b45e7709
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -221,7 +221,10 @@ void Layer::removeRelativeZ(const std::vector<Layer*>& layersInTree) {
}
}


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


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


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


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


void LayerHistory::registerLayer(Layer* layer, LayerVoteType type) {
void LayerHistory::registerLayer(Layer* layer, LayerVoteType type) {
    auto info = std::make_unique<LayerInfo>(layer->getName(), layer->getOwnerUid(), type);
    std::lock_guard lock(mLock);
    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));
    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(),
    const auto it = std::find_if(mLayerInfos.begin(), mLayerInfos.end(),
                                 [layer](const auto& pair) { return pair.first == layer; });
                                 [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());
    const size_t i = static_cast<size_t>(it - mLayerInfos.begin());
    if (i < mActiveLayersEnd) {
    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(),
    const auto it = std::find_if(mLayerInfos.begin(), mLayerInfos.end(),
                                 [layer](const auto& pair) { return pair.first == layer; });
                                 [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& info = it->second;
    const auto layerProps = LayerInfo::LayerProps{
    const auto layerProps = LayerInfo::LayerProps{
+6 −2
Original line number Original line Diff line number Diff line
@@ -6437,13 +6437,17 @@ wp<Layer> SurfaceFlinger::fromHandleLocked(const sp<IBinder>& handle) const {


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


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


// WARNING: ONLY CALL THIS FROM LAYER DTOR
// WARNING: ONLY CALL THIS FROM LAYER DTOR