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

Commit ecfa7ccd authored by Mathias Agopian's avatar Mathias Agopian
Browse files

fix a bug that caused artifacts when SWAP_RECTANGLE was enabled

parent 276826ba
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -326,7 +326,7 @@ void DisplayHardware::flip(const Region& dirty) const
#endif
    
    if (mFlags & UPDATE_ON_DEMAND) {
        mNativeWindow->setUpdateRectangle(dirty.bounds());
        mNativeWindow->setUpdateRectangle(dirty.getBounds());
    }
    
    mPageFlipCount++;
+17 −3
Original line number Diff line number Diff line
@@ -827,14 +827,28 @@ void SurfaceFlinger::handleRepaint()
    if ((flags & DisplayHardware::SWAP_RECTANGLE) || 
        (flags & DisplayHardware::BUFFER_PRESERVED)) 
    {
        // we can redraw only what's dirty
        // we can redraw only what's dirty, but since SWAP_RECTANGLE only
        // takes a rectangle, we must make sure to update that whole
        // rectangle in that case
        if (flags & DisplayHardware::SWAP_RECTANGLE) {
            // FIXME: we really should be able to pass a region to
            // SWAP_RECTANGLE so that we don't have to redraw all this.
            mDirtyRegion.set(mInvalidRegion.bounds());
        } else {
            // in the BUFFER_PRESERVED case, obviously, we can update only
            // what's needed and nothing more.
            // NOTE: this is NOT a common case, as preserving the backbuffer
            // is costly and usually involves copying the whole update back.
        }
    } else {
        if (flags & DisplayHardware::UPDATE_ON_DEMAND) {
            // we need to redraw the rectangle that will be updated
            // We need to redraw the rectangle that will be updated
            // (pushed to the framebuffer).
            // This is needed because UPDATE_ON_DEMAND only takes one
            // rectangle instead of a region (see DisplayHardware::flip())
            mDirtyRegion.set(mInvalidRegion.bounds());
        } else {
            // we need to redraw everything
            // we need to redraw everything (the whole screen)
            mDirtyRegion.set(hw.bounds());
            mInvalidRegion = mDirtyRegion;
        }