OSDN Git Service

fix [2122448] android_native_window_t::setUsage() only reallocates the first buffer
authorMathias Agopian <mathias@google.com>
Wed, 16 Sep 2009 00:34:04 +0000 (17:34 -0700)
committerMathias Agopian <mathias@google.com>
Wed, 16 Sep 2009 00:34:04 +0000 (17:34 -0700)
include/ui/Surface.h
libs/ui/Surface.cpp

index 118fb83..2cedeb6 100644 (file)
@@ -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.
index c3fbea2..4dab3a2 100644 (file)
@@ -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,12 @@ 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);
+    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 ||
+        mSharedBufferClient->needNewBuffer(bufIdx)) 
+    {
         err = getBufferLocked(bufIdx, usage);
         LOGE_IF(err, "getBufferLocked(%ld, %08x) failed (%s)",
                 bufIdx, usage, strerror(-err));
@@ -600,21 +598,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;
-    }
+    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;
 }
 
 // ----------------------------------------------------------------------------