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

Commit 68a6afeb authored by Mathias Agopian's avatar Mathias Agopian
Browse files

fix [2122448] android_native_window_t::setUsage() only reallocates the first buffer

Take 2. We needed to check that the usage flags are "good enough" as opposed to "the same".

This reverts commit 8f17a762fe9e9f31e4e86cb60ff2bfb6b10fdee6.
parent 70cc9e16
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ private:

    
    void setUsage(uint32_t reqUsage);
    bool getUsage(uint32_t* usage);
    uint32_t getUsage() const;
    
    // constants
    sp<SurfaceComposerClient>   mClient;
@@ -227,7 +227,6 @@ private:
    // protected by mSurfaceLock
    Rect                        mSwapRectangle;
    uint32_t                    mUsage;
    int32_t                     mUsageChanged;
    
    // protected by mSurfaceLock. These are also used from lock/unlock
    // but in that case, they must be called form the same thread.
+10 −19
Original line number Diff line number Diff line
@@ -361,7 +361,6 @@ void Surface::init()
    const_cast<uint32_t&>(android_native_window_t::flags) = 0;
    // be default we request a hardware surface
    mUsage = GRALLOC_USAGE_HW_RENDER;
    mUsageChanged = true;
    mNeedFullUpdate = false;
}

@@ -499,13 +498,13 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer)
        return bufIdx;
    }

    // FIXME: in case of failure below, we need to undo the dequeue
    
    uint32_t usage;
    const bool usageChanged = getUsage(&usage);
    // below we make sure we AT LEAST have the usage flags we want
    const uint32_t usage(getUsage());
    const sp<SurfaceBuffer>& backBuffer(mBuffers[bufIdx]);
    if ((backBuffer == 0) || usageChanged || 
            mSharedBufferClient->needNewBuffer(bufIdx)) {
    if (backBuffer == 0 || 
        ((uint32_t(backBuffer->usage) & usage) != usage) ||
        mSharedBufferClient->needNewBuffer(bufIdx)) 
    {
        err = getBufferLocked(bufIdx, usage);
        LOGE_IF(err, "getBufferLocked(%ld, %08x) failed (%s)",
                bufIdx, usage, strerror(-err));
@@ -600,21 +599,13 @@ int Surface::perform(int operation, va_list args)
void Surface::setUsage(uint32_t reqUsage)
{
    Mutex::Autolock _l(mSurfaceLock);
    if (mUsage != reqUsage) {
        mUsageChanged = true;
    mUsage = reqUsage;
}
}

bool Surface::getUsage(uint32_t* usage)
uint32_t Surface::getUsage() const
{
    Mutex::Autolock _l(mSurfaceLock);
    *usage = mUsage;
    if (mUsageChanged) {
        mUsageChanged = false;
        return true;
    }
    return false;
    return mUsage;
}

// ----------------------------------------------------------------------------