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

Commit 9225761c authored by Chia-I Wu's avatar Chia-I Wu
Browse files

resolve merge conflicts of 8a213534 to stage-aosp-master

Test: I solemnly swear I tested this conflict resolution.
Merged-In: I68bbf392a6681c6512fc0be68a7d17df122f7308
Change-Id: I7fa7ac49d397b6288f34faa97644147f47cfb8e7
parents 4256a729 8a213534
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -401,6 +401,14 @@ const Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
    return mVisibleLayersSortedByZ;
}

void DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) {
    mLayersNeedingFences = layers;
}

const Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const {
    return mLayersNeedingFences;
}

Region DisplayDevice::getDirtyRegion(bool repaintEverything) const {
    Region dirty;
    if (repaintEverything) {
+4 −0
Original line number Diff line number Diff line
@@ -124,6 +124,8 @@ public:

    void                    setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers);
    const Vector< sp<Layer> >& getVisibleLayersSortedByZ() const;
    void                    setLayersNeedingFences(const Vector< sp<Layer> >& layers);
    const Vector< sp<Layer> >& getLayersNeedingFences() const;
    Region                  getDirtyRegion(bool repaintEverything) const;

    void                    setLayerStack(uint32_t stack);
@@ -241,6 +243,8 @@ private:

    // list of visible layers on that display
    Vector< sp<Layer> > mVisibleLayersSortedByZ;
    // list of layers needing fences
    Vector< sp<Layer> > mLayersNeedingFences;

    /*
     * Transaction state
+4 −5
Original line number Diff line number Diff line
@@ -217,9 +217,6 @@ Layer::~Layer() {

#ifdef USE_HWC2
void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
    if (mHwcLayers.empty()) {
        return;
    }
    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
}
#else
@@ -395,9 +392,9 @@ bool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) {
    return true;
}

void Layer::destroyHwcLayer(int32_t hwcId) {
bool Layer::destroyHwcLayer(int32_t hwcId) {
    if (mHwcLayers.count(hwcId) == 0) {
        return;
        return false;
    }
    auto& hwcInfo = mHwcLayers[hwcId];
    LOG_ALWAYS_FATAL_IF(hwcInfo.layer == nullptr,
@@ -408,6 +405,8 @@ void Layer::destroyHwcLayer(int32_t hwcId) {
    // mHwcLayers. Verify that.
    LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0,
            "Stale layer entry in mHwcLayers");

    return true;
}

void Layer::destroyAllHwcLayers() {
+1 −1
Original line number Diff line number Diff line
@@ -454,7 +454,7 @@ public:
    // -----------------------------------------------------------------------

    bool createHwcLayer(HWComposer* hwc, int32_t hwcId);
    void destroyHwcLayer(int32_t hwcId);
    bool destroyHwcLayer(int32_t hwcId);
    void destroyAllHwcLayers();

    bool hasHwcLayer(int32_t hwcId) {
+29 −2
Original line number Diff line number Diff line
@@ -1754,6 +1754,7 @@ void SurfaceFlinger::rebuildLayerStacks() {
            Region opaqueRegion;
            Region dirtyRegion;
            Vector<sp<Layer>> layersSortedByZ;
            Vector<sp<Layer>> layersNeedingFences;
            const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
            const Transform& tr(displayDevice->getTransform());
            const Rect bounds(displayDevice->getBounds());
@@ -1761,6 +1762,7 @@ void SurfaceFlinger::rebuildLayerStacks() {
                computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion);

                mDrawingState.traverseInZOrder([&](Layer* layer) {
                    bool hwcLayerDestroyed = false;
                    if (layer->belongsToDisplay(displayDevice->getLayerStack(),
                                displayDevice->isPrimary())) {
                        Region drawRegion(tr.transform(
@@ -1771,18 +1773,32 @@ void SurfaceFlinger::rebuildLayerStacks() {
                        } else {
                            // Clear out the HWC layer if this layer was
                            // previously visible, but no longer is
                            layer->destroyHwcLayer(
                            hwcLayerDestroyed = layer->destroyHwcLayer(
                                    displayDevice->getHwcDisplayId());
                        }
                    } else {
                        // WM changes displayDevice->layerStack upon sleep/awake.
                        // Here we make sure we delete the HWC layers even if
                        // WM changed their layer stack.
                        layer->destroyHwcLayer(displayDevice->getHwcDisplayId());
                        hwcLayerDestroyed = layer->destroyHwcLayer(
                                displayDevice->getHwcDisplayId());
                    }

                    // If a layer is not going to get a release fence because
                    // it is invisible, but it is also going to release its
                    // old buffer, add it to the list of layers needing
                    // fences.
                    if (hwcLayerDestroyed) {
                        auto found = std::find(mLayersWithQueuedFrames.cbegin(),
                                mLayersWithQueuedFrames.cend(), layer);
                        if (found != mLayersWithQueuedFrames.cend()) {
                            layersNeedingFences.add(layer);
                        }
                    }
                });
            }
            displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);
            displayDevice->setLayersNeedingFences(layersNeedingFences);
            displayDevice->undefinedRegion.set(bounds);
            displayDevice->undefinedRegion.subtractSelf(
                    tr.transform(opaqueRegion));
@@ -2018,6 +2034,17 @@ void SurfaceFlinger::postFramebuffer()

            layer->onLayerDisplayed(releaseFence);
        }

        // We've got a list of layers needing fences, that are disjoint with
        // displayDevice->getVisibleLayersSortedByZ.  The best we can do is to
        // supply them with the present fence.
        if (!displayDevice->getLayersNeedingFences().isEmpty()) {
            sp<Fence> presentFence = mHwc->getPresentFence(hwcId);
            for (auto& layer : displayDevice->getLayersNeedingFences()) {
                layer->onLayerDisplayed(presentFence);
            }
        }

        if (hwcId >= 0) {
            mHwc->clearReleaseFences(hwcId);
        }