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

Commit 8b7f97bb authored by Chia-I Wu's avatar Chia-I Wu Committed by android-build-merger
Browse files

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

am: 9225761c

Change-Id: I400d6283d3a2c1da881178ee61bfb4b303c9a1b8
parents 3d91a351 9225761c
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -401,6 +401,14 @@ const Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const {
    return mVisibleLayersSortedByZ;
    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 DisplayDevice::getDirtyRegion(bool repaintEverything) const {
    Region dirty;
    Region dirty;
    if (repaintEverything) {
    if (repaintEverything) {
+4 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,8 @@ public:


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


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


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


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


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


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

    return true;
}
}


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


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


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


                mDrawingState.traverseInZOrder([&](Layer* layer) {
                mDrawingState.traverseInZOrder([&](Layer* layer) {
                    bool hwcLayerDestroyed = false;
                    if (layer->belongsToDisplay(displayDevice->getLayerStack(),
                    if (layer->belongsToDisplay(displayDevice->getLayerStack(),
                                displayDevice->isPrimary())) {
                                displayDevice->isPrimary())) {
                        Region drawRegion(tr.transform(
                        Region drawRegion(tr.transform(
@@ -1799,18 +1801,32 @@ void SurfaceFlinger::rebuildLayerStacks() {
                        } else {
                        } else {
                            // Clear out the HWC layer if this layer was
                            // Clear out the HWC layer if this layer was
                            // previously visible, but no longer is
                            // previously visible, but no longer is
                            layer->destroyHwcLayer(
                            hwcLayerDestroyed = layer->destroyHwcLayer(
                                    displayDevice->getHwcDisplayId());
                                    displayDevice->getHwcDisplayId());
                        }
                        }
                    } else {
                    } else {
                        // WM changes displayDevice->layerStack upon sleep/awake.
                        // WM changes displayDevice->layerStack upon sleep/awake.
                        // Here we make sure we delete the HWC layers even if
                        // Here we make sure we delete the HWC layers even if
                        // WM changed their layer stack.
                        // 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->setVisibleLayersSortedByZ(layersSortedByZ);
            displayDevice->setLayersNeedingFences(layersNeedingFences);
            displayDevice->undefinedRegion.set(bounds);
            displayDevice->undefinedRegion.set(bounds);
            displayDevice->undefinedRegion.subtractSelf(
            displayDevice->undefinedRegion.subtractSelf(
                    tr.transform(opaqueRegion));
                    tr.transform(opaqueRegion));
@@ -2050,6 +2066,17 @@ void SurfaceFlinger::postFramebuffer()


            layer->onLayerDisplayed(releaseFence);
            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) {
        if (hwcId >= 0) {
            mHwc->clearReleaseFences(hwcId);
            mHwc->clearReleaseFences(hwcId);
        }
        }