OSDN Git Service

Fix layers flickering
authorNicolas Roard <nicolasroard@google.com>
Fri, 1 Apr 2011 17:14:33 +0000 (10:14 -0700)
committerNicolas Roard <nicolas@android.com>
Tue, 12 Apr 2011 22:05:22 +0000 (15:05 -0700)
bug:4266091 bug:4181605
Change-Id: I34152628a1f31b017b1b238db2c90dcdb5c6a45f

WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h
WebCore/platform/graphics/android/TilesManager.cpp

index dc0962c..964422a 100644 (file)
@@ -137,6 +137,7 @@ void BackedDoubleBufferedTexture::setNotBusy()
         m_delayedRelease = false;
         m_delayedReleaseOwner = 0;
     }
+    m_busyCond.signal();
 }
 
 bool BackedDoubleBufferedTexture::busy()
@@ -189,7 +190,7 @@ void BackedDoubleBufferedTexture::producerUpdate(TextureInfo* textureInfo)
     producerReleaseAndSwap();
 }
 
-bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner)
+bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner, bool force)
 {
     if (m_owner == owner) {
         if (m_delayedRelease) {
@@ -199,7 +200,7 @@ bool BackedDoubleBufferedTexture::acquire(TextureOwner* owner)
         return true;
     }
 
-    return setOwner(owner);
+    return setOwner(owner, force);
 }
 
 bool BackedDoubleBufferedTexture::tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage)
@@ -216,13 +217,16 @@ bool BackedDoubleBufferedTexture::tryAcquire(TextureOwner* owner, TiledPage* cur
     return false;
 }
 
-bool BackedDoubleBufferedTexture::setOwner(TextureOwner* owner)
+bool BackedDoubleBufferedTexture::setOwner(TextureOwner* owner, bool force)
 {
     // if the writable texture is busy (i.e. currently being written to) then we
     // can't change the owner out from underneath that texture
     m_busyLock.lock();
+    while (m_busy && force)
+        m_busyCond.wait(m_busyLock);
     bool busy = m_busy;
     m_busyLock.unlock();
+
     if (!busy) {
         // if we are not busy we can try to remove the texture from the layer;
         // LayerAndroid::removeTexture() is protected by the same lock as
index 8bfae59..7c2ea90 100644 (file)
@@ -88,12 +88,12 @@ public:
 
     // allows consumer thread to assign ownership of the texture to the tile. It
     // returns false if ownership cannot be transferred because the tile is busy
-    bool acquire(TextureOwner* owner);
+    bool acquire(TextureOwner* owner, bool force = false);
     bool release(TextureOwner* owner);
     bool tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage);
 
     // set the texture owner if not busy. Return false if busy, true otherwise.
-    bool setOwner(TextureOwner* owner);
+    bool setOwner(TextureOwner* owner, bool force = false);
 
     // private member accessor functions
     TextureOwner* owner() { return m_owner; } // only used by the consumer thread
@@ -136,6 +136,9 @@ private:
     // We mutex protect the reads/writes of m_busy to ensure that we are reading
     // the most up-to-date value even across processors in an SMP system.
     android::Mutex m_busyLock;
+    // We use this condition variable to signal that the texture
+    // is not busy anymore
+    android::Condition m_busyCond;
 };
 
 } // namespace WebCore
index afc53eb..5a9a164 100644 (file)
@@ -249,7 +249,7 @@ LayerTexture* TilesManager::getExistingTextureForLayer(LayerAndroid* layer,
              layer->uniqueId(), layer);
     }
 
-    if (best && best->acquire(layer))
+    if (best && best->acquire(layer, any))
         return best;
     return 0;
 }