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

Commit 0c76ba2d authored by Mathias Agopian's avatar Mathias Agopian Committed by Android (Google) Code Review
Browse files

Merge changes I97807db6,I7d350bc0

* changes:
  workaround for an issue where the screen would flicker sometimes
  fix an issue in SF where we could miss some updates
parents 74ace176 fbc7922e
Loading
Loading
Loading
Loading
+23 −30
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@

#define DEBUG_RESIZE    0


namespace android {

// ---------------------------------------------------------------------------
@@ -55,7 +54,7 @@ Layer::Layer(SurfaceFlinger* flinger,
        mCurrentTransform(0),
        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
        mCurrentOpacity(true),
        mRefreshPending(0),
        mRefreshPending(false),
        mFrameLatencyNeeded(false),
        mFrameLatencyOffset(0),
        mFormat(PIXEL_FORMAT_NONE),
@@ -408,15 +407,9 @@ bool Layer::isCropped() const {
// pageflip handling...
// ----------------------------------------------------------------------------

bool Layer::onPreComposition()
{
    // if there was more than one pending update, request a refresh
    if (mRefreshPending >= 2) {
        mRefreshPending = 0;
        return true;
    }
    mRefreshPending = 0;
    return false;
bool Layer::onPreComposition() {
    mRefreshPending = false;
    return mQueuedFrames > 0;
}

void Layer::lockPageFlip(bool& recomputeVisibleRegions)
@@ -428,9 +421,11 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions)
        // because we cannot call updateTeximage() without a corresponding
        // compositionComplete() call.
        // we'll trigger an update in onPreComposition().
        if (mRefreshPending++) {
        if (mRefreshPending) {
            mPostedDirtyRegion.clear();
            return;
        }
        mRefreshPending = true;

        // Capture the old state of the layer for comparisons later
        const bool oldOpacity = isOpaque();
@@ -541,25 +536,23 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions)
void Layer::unlockPageFlip(
        const Transform& planeTransform, Region& outDirtyRegion)
{
    if (mRefreshPending >= 2) {
        return;
    }

    Region dirtyRegion(mPostedDirtyRegion);
    if (!dirtyRegion.isEmpty()) {
    Region postedRegion(mPostedDirtyRegion);
    if (!postedRegion.isEmpty()) {
        mPostedDirtyRegion.clear();
        if (!visibleRegionScreen.isEmpty()) {
            // The dirty region is given in the layer's coordinate space
            // transform the dirty region by the surface's transformation
            // and the global transformation.
            const Layer::State& s(drawingState());
            const Transform tr(planeTransform * s.transform);
        dirtyRegion = tr.transform(dirtyRegion);
            postedRegion = tr.transform(postedRegion);

            // At this point, the dirty region is in screen space.
            // Make sure it's constrained by the visible region (which
            // is in screen space as well).
        dirtyRegion.andSelf(visibleRegionScreen);
        outDirtyRegion.orSelf(dirtyRegion);
            postedRegion.andSelf(visibleRegionScreen);
            outDirtyRegion.orSelf(postedRegion);
        }
    }
}

+1 −1
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ private:
    uint32_t mCurrentTransform;
    uint32_t mCurrentScalingMode;
    bool mCurrentOpacity;
    size_t mRefreshPending;
    bool mRefreshPending;
    bool mFrameLatencyNeeded;
    int mFrameLatencyOffset;

+10 −0
Original line number Diff line number Diff line
@@ -1000,6 +1000,12 @@ void SurfaceFlinger::composeSurfaces(const Region& dirty)
        drawWormhole();
    }

    // FIXME: workaroud for b/6020860
    glEnable(GL_SCISSOR_TEST);
    glScissor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    // end-workaround

    /*
     * and then, render the layers targeted at the framebuffer
     */
@@ -1776,6 +1782,10 @@ status_t SurfaceFlinger::onTransact(
                setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
                return NO_ERROR;
            }
            case 1006:{ // send empty update
                signalRefresh();
                return NO_ERROR;
            }
            case 1008:  // toggle use of hw composer
                n = data.readInt32();
                mDebugDisableHWC = n ? 1 : 0;