OSDN Git Service

Refactor partial invalidation code
authorTeng-Hui Zhu <ztenghui@google.com>
Fri, 1 Jul 2011 23:40:35 +0000 (16:40 -0700)
committerTeng-Hui Zhu <ztenghui@google.com>
Wed, 6 Jul 2011 16:42:43 +0000 (09:42 -0700)
Change-Id: Id8612946d845daad86f02f626c3247ff8dc1d2f8

Source/WebCore/platform/graphics/android/BaseTile.cpp
Source/WebCore/platform/graphics/android/BaseTile.h
Source/WebCore/platform/graphics/android/BaseTileTexture.cpp
Source/WebCore/platform/graphics/android/TilesManager.h

index 70b98b0..ed2ad3e 100644 (file)
@@ -28,8 +28,8 @@
 
 #if USE(ACCELERATED_COMPOSITING)
 
-#include "RasterRenderer.h"
 #include "GLUtils.h"
+#include "RasterRenderer.h"
 #include "TextureInfo.h"
 #include "TilesManager.h"
 
@@ -64,15 +64,25 @@ BaseTile::BaseTile()
     , m_repaintPending(false)
     , m_usable(true)
     , m_lastDirtyPicture(0)
-    , m_fullRepaintA(true)
-    , m_fullRepaintB(true)
     , m_lastPaintedPicture(0)
 {
 #ifdef DEBUG_COUNT
     ClassTracker::instance()->increment("BaseTile");
 #endif
-    m_currentDirtyArea = &m_dirtyAreaA;
+    m_currentDirtyAreaIndex = 0;
     m_renderer = new RasterRenderer();
+
+    // For EglImage Mode, the internal buffer should be 2.
+    // And for Async Surface Texture mode, this is 3.
+    if (TilesManager::instance()->getSharedTextureMode() == EglImageMode)
+        m_maxBufferNumber = 2;
+    else
+        m_maxBufferNumber = 3;
+
+    m_dirtyArea = new SkRegion[m_maxBufferNumber];
+    m_fullRepaint = new bool[m_maxBufferNumber];
+    for (int i = 0; i < m_maxBufferNumber; i++)
+        m_fullRepaint[i] = true;
 }
 
 BaseTile::~BaseTile()
@@ -82,6 +92,8 @@ BaseTile::~BaseTile()
         m_texture->release(this);
 
     delete m_renderer;
+    delete[] m_dirtyArea;
+    delete[] m_fullRepaint;
 
 #ifdef DEBUG_COUNT
     ClassTracker::instance()->decrement("BaseTile");
@@ -122,10 +134,10 @@ bool BaseTile::removeTexture(BaseTileTexture* texture)
 
 void BaseTile::fullInval()
 {
-    m_dirtyAreaA.setEmpty();
-    m_dirtyAreaB.setEmpty();
-    m_fullRepaintA = true;
-    m_fullRepaintB = true;
+    for (int i = 0; i < m_maxBufferNumber; i++) {
+        m_dirtyArea[i].setEmpty();
+        m_fullRepaint[i] = true;
+    }
     m_dirty = true;
 }
 
@@ -143,8 +155,8 @@ void BaseTile::markAsDirty(int unsigned pictureCount,
 {
     android::AutoMutex lock(m_atomicSync);
     m_lastDirtyPicture = pictureCount;
-    m_dirtyAreaA.op(dirtyArea, SkRegion::kUnion_Op);
-    m_dirtyAreaB.op(dirtyArea, SkRegion::kUnion_Op);
+    for (int i = 0; i < m_maxBufferNumber; i++)
+        m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op);
     m_dirty = true;
 }
 
@@ -260,15 +272,14 @@ void BaseTile::paintBitmap()
     m_atomicSync.lock();
     bool dirty = m_dirty;
     BaseTileTexture* texture = m_texture;
-    SkRegion dirtyArea = *m_currentDirtyArea;
+    SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex];
     float scale = m_scale;
     const int x = m_x;
     const int y = m_y;
     m_atomicSync.unlock();
 
-    if (!dirty || !texture) {
+    if (!dirty || !texture)
         return;
-    }
 
     TiledPage* tiledPage = m_page;
 
@@ -299,12 +310,12 @@ void BaseTile::paintBitmap()
     SkRegion::Iterator cliperator(dirtyArea);
 
     bool fullRepaint = false;
+
     // TODO: Implement the partial invalidate in Surface Texture Mode
-    if (((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA)
-            || ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB)
-            || textureInfo->m_width != tileWidth
-            || textureInfo->m_height != tileHeight
-            || textureInfo->getSharedTextureMode() == SurfaceTextureMode) {
+    if (m_fullRepaint[m_currentDirtyAreaIndex]
+        || textureInfo->m_width != tileWidth
+        || textureInfo->m_height != tileHeight
+        || textureInfo->getSharedTextureMode() == SurfaceTextureMode) {
         fullRepaint = true;
     }
 
@@ -379,12 +390,7 @@ void BaseTile::paintBitmap()
         m_lastPaintedPicture = pictureCount;
 
         // set the fullrepaint flags
-
-        if ((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA)
-            m_fullRepaintA = false;
-
-        if ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB)
-            m_fullRepaintB = false;
+        m_fullRepaint[m_currentDirtyAreaIndex] = false;
 
         // The various checks to see if we are still dirty...
 
@@ -394,18 +400,19 @@ void BaseTile::paintBitmap()
             m_dirty = true;
 
         if (fullRepaint)
-            m_currentDirtyArea->setEmpty();
+            m_dirtyArea[m_currentDirtyAreaIndex].setEmpty();
         else
-            m_currentDirtyArea->op(dirtyArea, SkRegion::kDifference_Op);
+            m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op);
 
-        if (!m_currentDirtyArea->isEmpty())
+        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
             m_dirty = true;
 
         // Now we can swap the dirty areas
+        // TODO: For surface texture in Async mode, the index will be updated
+        // according to the current buffer just dequeued.
+        m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber;
 
-        m_currentDirtyArea = m_currentDirtyArea == &m_dirtyAreaA ? &m_dirtyAreaB : &m_dirtyAreaA;
-
-        if (!m_currentDirtyArea->isEmpty())
+        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
             m_dirty = true;
 
         if (!m_dirty)
index 8a812f8..b5fc7ba 100644 (file)
@@ -125,11 +125,10 @@ private:
     unsigned int m_lastDirtyPicture;
 
     // store the dirty region
-    SkRegion m_dirtyAreaA;
-    SkRegion m_dirtyAreaB;
-    bool m_fullRepaintA;
-    bool m_fullRepaintB;
-    SkRegion* m_currentDirtyArea;
+    SkRegion* m_dirtyArea;
+    bool* m_fullRepaint;
+    int m_maxBufferNumber;
+    int m_currentDirtyAreaIndex;
 
     // stores the id of the latest picture painted to the tile. If the id is 0
     // then we know that the picture has not yet been painted an there is nothing
index 4d1dec1..f66019a 100644 (file)
@@ -39,7 +39,8 @@
 namespace WebCore {
 
 BaseTileTexture::BaseTileTexture(uint32_t w, uint32_t h)
-    : DoubleBufferedTexture(eglGetCurrentContext(), SurfaceTextureMode)
+    : DoubleBufferedTexture(eglGetCurrentContext(),
+                            TilesManager::instance()->getSharedTextureMode())
     , m_usedLevel(-1)
     , m_owner(0)
     , m_delayedReleaseOwner(0)
index 2ef9e66..fe53666 100644 (file)
@@ -126,6 +126,10 @@ public:
         m_showVisualIndicator = showVisualIndicator;
     }
 
+    SharedTextureMode getSharedTextureMode() {
+        return SurfaceTextureMode;
+    }
+
 private:
 
     TilesManager();