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

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

fix [3312683] Camera mirroring problem after switching from back to front camera

the crop as well as buffer orientation can change at every frame, when that happens
we need to reset the hwc HAL (ie: set the GEOMETRY_CHANGED flag).
currently we achieve this by taking the same code path than an actual geometry change
which is a bit more heavy than necessary.

Change-Id: I751f9ed1eeec0c27db7df2e77d5d17c6bcc17a24
parent a034863a
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -503,12 +503,18 @@ void LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const


void LayerBase::setBufferCrop(const Rect& crop) {
void LayerBase::setBufferCrop(const Rect& crop) {
    if (!crop.isEmpty()) {
    if (!crop.isEmpty()) {
        if (mBufferCrop != crop) {
            mBufferCrop = crop;
            mBufferCrop = crop;
            mFlinger->invalidateHwcGeometry();
        }
    }
    }
}
}


void LayerBase::setBufferTransform(uint32_t transform) {
void LayerBase::setBufferTransform(uint32_t transform) {
    if (mBufferTransform != transform) {
        mBufferTransform = transform;
        mBufferTransform = transform;
        mFlinger->invalidateHwcGeometry();
    }
}
}


void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
+8 −3
Original line number Original line Diff line number Diff line
@@ -460,7 +460,7 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
        handleTransactionLocked(transactionFlags, ditchedLayers);
        handleTransactionLocked(transactionFlags, ditchedLayers);
        mLastTransactionTime = systemTime() - now;
        mLastTransactionTime = systemTime() - now;
        mDebugInTransaction = 0;
        mDebugInTransaction = 0;
        mHwWorkListDirty = true;
        invalidateHwcGeometry();
        // here the transaction has been committed
        // here the transaction has been committed
    }
    }


@@ -726,13 +726,18 @@ void SurfaceFlinger::handlePageFlip()


            mWormholeRegion = screenRegion.subtract(opaqueRegion);
            mWormholeRegion = screenRegion.subtract(opaqueRegion);
            mVisibleRegionsDirty = false;
            mVisibleRegionsDirty = false;
            mHwWorkListDirty = true;
            invalidateHwcGeometry();
        }
        }


    unlockPageFlip(currentLayers);
    unlockPageFlip(currentLayers);
    mDirtyRegion.andSelf(screenRegion);
    mDirtyRegion.andSelf(screenRegion);
}
}


void SurfaceFlinger::invalidateHwcGeometry()
{
    mHwWorkListDirty = true;
}

bool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers)
bool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers)
{
{
    bool recomputeVisibleRegions = false;
    bool recomputeVisibleRegions = false;
@@ -1586,7 +1591,7 @@ status_t SurfaceFlinger::onTransact(
            case 1008:  // toggle use of hw composer
            case 1008:  // toggle use of hw composer
                n = data.readInt32();
                n = data.readInt32();
                mDebugDisableHWC = n ? 1 : 0;
                mDebugDisableHWC = n ? 1 : 0;
                mHwWorkListDirty = true;
                invalidateHwcGeometry();
                // fall-through...
                // fall-through...
            case 1004:{ // repaint everything
            case 1004:{ // repaint everything
                Mutex::Autolock _l(mStateLock);
                Mutex::Autolock _l(mStateLock);
+1 −0
Original line number Original line Diff line number Diff line
@@ -208,6 +208,7 @@ public:
    status_t removeLayer(const sp<LayerBase>& layer);
    status_t removeLayer(const sp<LayerBase>& layer);
    status_t addLayer(const sp<LayerBase>& layer);
    status_t addLayer(const sp<LayerBase>& layer);
    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
    status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
    void invalidateHwcGeometry();


    sp<Layer> getLayer(const sp<ISurface>& sur) const;
    sp<Layer> getLayer(const sp<ISurface>& sur) const;