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

Commit 68e316eb authored by Chia-I Wu's avatar Chia-I Wu Committed by Android (Google) Code Review
Browse files

Merge "surfaceflinger: fix fencing when layers become invisible"

parents 3b3111d5 83806897
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -262,9 +262,6 @@ void BufferLayer::onDraw(const RenderArea& renderArea, const Region& clip,
}

void BufferLayer::onLayerDisplayed(const sp<Fence>& releaseFence) {
    if (mHwcLayers.empty()) {
        return;
    }
    mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
}

+8 −0
Original line number Diff line number Diff line
@@ -325,6 +325,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
@@ -113,6 +113,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);
@@ -214,6 +216,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 −2
Original line number Diff line number Diff line
@@ -217,9 +217,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, "Attempt to destroy null layer");
@@ -228,6 +228,8 @@ void Layer::destroyHwcLayer(int32_t hwcId) {
    // The layer destroyed listener should have cleared the entry from
    // 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
@@ -414,7 +414,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) { return mHwcLayers.count(hwcId) > 0; }
Loading