summaryrefslogtreecommitdiffstats
path: root/Source/WebCore
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2012-06-12 16:04:47 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-06-12 16:04:47 -0700
commit9b2be7161983b795edb1ea0e9e70547cd9e466bd (patch)
treea9b38945c43ca8062e8a5d226d69b626b490f8d8 /Source/WebCore
parenta762e7bf8891adc575b8b75cf79b710952ad090c (diff)
parent0c274b96c2dfb5a83b12a99f1ca9069378f73bdb (diff)
downloadexternal_webkit-9b2be7161983b795edb1ea0e9e70547cd9e466bd.zip
external_webkit-9b2be7161983b795edb1ea0e9e70547cd9e466bd.tar.gz
external_webkit-9b2be7161983b795edb1ea0e9e70547cd9e466bd.tar.bz2
Merge "Workaround double blit failure" into jb-dev
Diffstat (limited to 'Source/WebCore')
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Surface.cpp8
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.cpp2
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/Tile.h2
3 files changed, 12 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/rendering/Surface.cpp b/Source/WebCore/platform/graphics/android/rendering/Surface.cpp
index 73466d3..1898910 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Surface.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/Surface.cpp
@@ -420,6 +420,14 @@ bool Surface::blitFromContents(Tile* tile)
if (!singleLayer() || !tile || !getFirstLayer() || !getFirstLayer()->content())
return false;
+ if (tile->frontTexture() != tile->lastDrawnTexture()) {
+ // the below works around an issue where glTexSubImage2d can't update a
+ // texture that hasn't drawn yet by drawing it off screen.
+ // glFlush() and glFinish() work also, but are likely more wasteful.
+ SkRect rect = SkRect::MakeXYWH(-100, -100, 0, 0);
+ FloatRect fillPortion(0, 0, 0, 0);
+ tile->frontTexture()->drawGL(false, rect, 1.0f, 0, false, true, fillPortion);
+ }
LayerContent* content = getFirstLayer()->content();
// Extract the dirty rect from the region. Note that this is *NOT* constrained
// to this tile
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
index e674884..96b189a 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.cpp
@@ -52,6 +52,7 @@ Tile::Tile(bool isLayerTile)
, m_y(-1)
, m_frontTexture(0)
, m_backTexture(0)
+ , m_lastDrawnTexture(0)
, m_scale(1)
, m_dirty(true)
, m_repaintsPending(0)
@@ -242,6 +243,7 @@ bool Tile::drawGL(float opacity, const SkRect& rect, float scale,
m_frontTexture->drawGL(isLayerTile(), rect, opacity, transform,
forceBlending, usePointSampling, fillPortion);
+ m_lastDrawnTexture = m_frontTexture;
return true;
}
diff --git a/Source/WebCore/platform/graphics/android/rendering/Tile.h b/Source/WebCore/platform/graphics/android/rendering/Tile.h
index 2dc5414..b045f1f 100644
--- a/Source/WebCore/platform/graphics/android/rendering/Tile.h
+++ b/Source/WebCore/platform/graphics/android/rendering/Tile.h
@@ -127,6 +127,7 @@ public:
int y() const { return m_y; }
TileTexture* frontTexture() { return m_frontTexture; }
TileTexture* backTexture() { return m_backTexture; }
+ TileTexture* lastDrawnTexture() { return m_lastDrawnTexture; }
// only used for prioritization - the higher, the more relevant the tile is
unsigned long long drawCount() { return m_drawCount; }
@@ -151,6 +152,7 @@ private:
TileTexture* m_frontTexture;
TileTexture* m_backTexture;
+ TileTexture* m_lastDrawnTexture;
float m_scale;
// used to signal that the that the tile is out-of-date and needs to be