summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2012-05-10 13:45:37 -0700
committerChris Craik <ccraik@google.com>2012-05-10 16:08:46 -0700
commitbd3f93b66934582acd0b6c70bcf60ca643b36ead (patch)
treeca21e51653e0a5e256e8cc9a0762729bd62728b5
parentd236e597b13a93d21eafa2edeacb5092076937e1 (diff)
downloadexternal_webkit-bd3f93b66934582acd0b6c70bcf60ca643b36ead.zip
external_webkit-bd3f93b66934582acd0b6c70bcf60ca643b36ead.tar.gz
external_webkit-bd3f93b66934582acd0b6c70bcf60ca643b36ead.tar.bz2
dirty all tiles when entering/exiting single surface mode
bug:6471089 Change-Id: I609a75d028ec9fa7b26be90d38b116a9766c4f21
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp4
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.cpp14
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.h2
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp15
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TilesManager.h3
5 files changed, 37 insertions, 1 deletions
diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
index bdd8028..1fe30de 100644
--- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -369,8 +369,10 @@ int GLWebViewState::drawGL(IntRect& invScreenRect, SkRect& visibleContentRect,
nbTexturesNeeded.full += nbTexturesForImages;
nbTexturesNeeded.clipped += nbTexturesForImages;
- if (setLayersRenderingMode(nbTexturesNeeded))
+ if (setLayersRenderingMode(nbTexturesNeeded)) {
+ TilesManager::instance()->dirtyAllTiles();
returnFlags |= uirenderer::DrawGlInfo::kStatusDraw | uirenderer::DrawGlInfo::kStatusInvoke;
+ }
glBindBuffer(GL_ARRAY_BUFFER, 0);
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
index 3af05f4..2e2c397 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
@@ -146,6 +146,13 @@ bool Tile::removeTexture(TileTexture* texture)
return true;
}
+void Tile::markAsDirty()
+{
+ android::AutoMutex lock(m_atomicSync);
+ m_dirtyArea.setEmpty(); // empty dirty rect prevents fast blit path
+ markAsDirtyInternal();
+}
+
void Tile::markAsDirty(const SkRegion& dirtyArea)
{
if (dirtyArea.isEmpty())
@@ -171,6 +178,13 @@ void Tile::markAsDirty(const SkRegion& dirtyArea)
if (!intersect)
return;
+ markAsDirtyInternal();
+}
+
+void Tile::markAsDirtyInternal()
+{
+ // NOTE: callers must hold lock on m_atomicSync
+
m_dirty = true;
if (m_state == UpToDate) {
// We only mark a tile as unpainted in 'markAsDirty' if its status is
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.h b/Source/WebCore/platform/graphics/android/rendering/Tile.h
index 9697b61..4c8052c 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.h
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.h
@@ -114,6 +114,7 @@ public:
SkRect& realTileRect);
bool isTileVisible(const IntRect& viewTileBounds);
+ void markAsDirty();
void markAsDirty(const SkRegion& dirtyArea);
bool isDirty();
const SkRegion& dirtyArea() { return m_dirtyArea; }
@@ -140,6 +141,7 @@ public:
virtual bool removeTexture(TileTexture* texture);
private:
+ void markAsDirtyInternal();
void validatePaint();
int m_x;
diff --git a/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp b/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
index 6e22d25..66c4bf3 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/TilesManager.cpp
@@ -235,6 +235,21 @@ void TilesManager::gatherTexturesNumbers(int* nbTextures, int* nbAllocatedTextur
}
}
+void TilesManager::dirtyTexturesVector(WTF::Vector<TileTexture*>& textures)
+{
+ for (unsigned int i = 0; i < textures.size(); i++) {
+ Tile* currentOwner = static_cast<Tile*>(textures[i]->owner());
+ if (currentOwner)
+ currentOwner->markAsDirty();
+ }
+}
+
+void TilesManager::dirtyAllTiles()
+{
+ dirtyTexturesVector(m_textures);
+ dirtyTexturesVector(m_tilesTextures);
+}
+
void TilesManager::printTextures()
{
#ifdef DEBUG
diff --git a/Source/WebCore/platform/graphics/android/rendering/TilesManager.h b/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
index 295acf6..5ad508c 100644
--- a/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
+++ b/Source/WebCore/platform/graphics/android/rendering/TilesManager.h
@@ -77,6 +77,8 @@ public:
TileTexture* getAvailableTexture(Tile* owner);
+ void dirtyAllTiles();
+
void printTextures();
// m_highEndGfx is written/read only on UI thread, no need for a lock.
@@ -164,6 +166,7 @@ private:
void discardTexturesVector(unsigned long long sparedDrawCount,
WTF::Vector<TileTexture*>& textures,
bool deallocateGLTextures);
+ void dirtyTexturesVector(WTF::Vector<TileTexture*>& textures);
void markAllGLTexturesZero();
bool updateContextIfChanged();
int getMaxTextureAllocation();