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

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

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

parent 1a3f52c9
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -212,7 +212,7 @@ private:


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


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


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


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