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

Commit 975424a7 authored by Jesse Hall's avatar Jesse Hall Committed by Android Git Automerger
Browse files

am a8026d21: Stop using transparent region for computing visible regions

* commit 'a8026d21':
  Stop using transparent region for computing visible regions
parents 4152d3f4 a8026d21
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -193,6 +193,12 @@ void LayerBase::setCoveredRegion(const Region& coveredRegion) {
    this->coveredRegion = coveredRegion;
}

void LayerBase::setVisibleNonTransparentRegion(const Region&
        setVisibleNonTransparentRegion) {
    // always called from main thread
    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
}

uint32_t LayerBase::doTransaction(uint32_t flags)
{
    const Layer::State& front(drawingState());
+9 −1
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ public:
            // regions below are in window-manager space
            Region      visibleRegion;
            Region      coveredRegion;
            Region      visibleNonTransparentRegion;
            int32_t     sequence;
            
            struct Geometry {
@@ -110,7 +111,7 @@ public:
            bool setSize(uint32_t w, uint32_t h);
            bool setAlpha(uint8_t alpha);
            bool setMatrix(const layer_state_t::matrix22_t& matrix);
            bool setTransparentRegionHint(const Region& opaque);
            bool setTransparentRegionHint(const Region& transparent);
            bool setFlags(uint8_t flags, uint8_t mask);
            bool setCrop(const Rect& crop);
            bool setLayerStack(uint32_t layerStack);
@@ -176,6 +177,13 @@ public:
     */
    virtual void setCoveredRegion(const Region& coveredRegion);

    /**
     * setVisibleNonTransparentRegion - called when the visible and
     * non-transparent region changes.
     */
    virtual void setVisibleNonTransparentRegion(const Region&
            visibleNonTransparentRegion);

    /**
     * latchBuffer - called each time the screen is redrawn and returns whether
     * the visible regions need to be recomputed (this is a fairly heavy
+20 −9
Original line number Diff line number Diff line
@@ -919,9 +919,10 @@ void SurfaceFlinger::rebuildLayerStacks() {
                    const sp<LayerBase>& layer(currentLayers[i]);
                    const Layer::State& s(layer->drawingState());
                    if (s.layerStack == hw->getLayerStack()) {
                        Region visibleRegion(tr.transform(layer->visibleRegion));
                        visibleRegion.andSelf(bounds);
                        if (!visibleRegion.isEmpty()) {
                        Region drawRegion(tr.transform(
                                layer->visibleNonTransparentRegion));
                        drawRegion.andSelf(bounds);
                        if (!drawRegion.isEmpty()) {
                            layersSortedByZ.add(layer);
                        }
                    }
@@ -1294,6 +1295,16 @@ void SurfaceFlinger::computeVisibleRegions(
         */
        Region coveredRegion;

        /*
         * transparentRegion: area of a surface that is hinted to be completely
         * transparent. This is only used to tell when the layer has no visible
         * non-transparent regions and can be removed from the layer list. It
         * does not affect the visibleRegion of this layer or any layers
         * beneath it. The hint may not be correct if apps don't respect the
         * SurfaceView restrictions (which, sadly, some don't).
         */
        Region transparentRegion;


        // handle hidden surfaces by setting the visible region to empty
        if (CC_LIKELY(layer->isVisible())) {
@@ -1303,21 +1314,19 @@ void SurfaceFlinger::computeVisibleRegions(
            if (!visibleRegion.isEmpty()) {
                // Remove the transparent area from the visible region
                if (translucent) {
                    Region transparentRegionScreen;
                    const Transform tr(s.transform);
                    if (tr.transformed()) {
                        if (tr.preserveRects()) {
                            // transform the transparent region
                            transparentRegionScreen = tr.transform(s.transparentRegion);
                            transparentRegion = tr.transform(s.transparentRegion);
                        } else {
                            // transformation too complex, can't do the
                            // transparent region optimization.
                            transparentRegionScreen.clear();
                            transparentRegion.clear();
                        }
                    } else {
                        transparentRegionScreen = s.transparentRegion;
                        transparentRegion = s.transparentRegion;
                    }
                    visibleRegion.subtractSelf(transparentRegionScreen);
                }

                // compute the opaque region
@@ -1373,9 +1382,11 @@ void SurfaceFlinger::computeVisibleRegions(
        // Update aboveOpaqueLayers for next (lower) layer
        aboveOpaqueLayers.orSelf(opaqueRegion);

        // Store the visible region is screen space
        // Store the visible region in screen space
        layer->setVisibleRegion(visibleRegion);
        layer->setCoveredRegion(coveredRegion);
        layer->setVisibleNonTransparentRegion(
                visibleRegion.subtract(transparentRegion));
    }

    outOpaqueRegion = aboveOpaqueLayers;