summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/GLWebViewState.cpp
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2011-03-22 14:29:12 -0700
committerNicolas Roard <nicolasroard@google.com>2011-03-22 23:56:44 -0700
commit772742124c1e5c700120019397dc8af29ced74c0 (patch)
treeb3a1d15332445f13f7a174d78587bc990dafd699 /WebCore/platform/graphics/android/GLWebViewState.cpp
parent55c8e9b1b75caff31e804a6f4da404da9f67af93 (diff)
downloadexternal_webkit-772742124c1e5c700120019397dc8af29ced74c0.zip
external_webkit-772742124c1e5c700120019397dc8af29ced74c0.tar.gz
external_webkit-772742124c1e5c700120019397dc8af29ced74c0.tar.bz2
Fix performance problems with layers
We were preventing the layers' positions to be updated while waiting for the base surface to render. This also fix some repainting issues. bug:4136077 Change-Id: I6870faf8296e205c6ee58e80b1cf95833a67814b
Diffstat (limited to 'WebCore/platform/graphics/android/GLWebViewState.cpp')
-rw-r--r--WebCore/platform/graphics/android/GLWebViewState.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/WebCore/platform/graphics/android/GLWebViewState.cpp b/WebCore/platform/graphics/android/GLWebViewState.cpp
index dbbc633..189b3f0 100644
--- a/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -69,6 +69,7 @@ GLWebViewState::GLWebViewState(android::Mutex* buttonMutex)
, m_transitionTime(-1)
, m_baseLayer(0)
, m_currentBaseLayer(0)
+ , m_previouslyUsedRoot(0)
, m_currentPictureCounter(0)
, m_usePageA(true)
, m_frameworkInval(0, 0, 0, 0)
@@ -107,6 +108,9 @@ GLWebViewState::~GLWebViewState()
delete m_tiledPageA;
delete m_tiledPageB;
SkSafeUnref(m_currentBaseLayer);
+ SkSafeUnref(m_baseLayer);
+ m_baseLayer = 0;
+ m_currentBaseLayer = 0;
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("GLWebViewState");
#endif
@@ -126,10 +130,13 @@ void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, const SkRegion& inval
}
if (m_baseLayer && layer)
m_baseLayer->swapExtra(layer);
+
+ SkSafeRef(layer);
+ SkSafeUnref(m_baseLayer);
m_baseLayer = layer;
- if (m_baseLayer) {
+ if (m_baseLayer)
m_baseLayer->setGLWebViewState(this);
- }
+
// We only update the layers if we are not currently
// waiting for a tiledPage to be painted
if (m_baseLayerUpdate) {
@@ -404,16 +411,33 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
m_baseLayerLock.lock();
BaseLayerAndroid* baseLayer = m_currentBaseLayer;
SkSafeRef(baseLayer);
+ BaseLayerAndroid* baseForComposited = m_baseLayer;
+ SkSafeRef(baseForComposited);
m_baseLayerLock.unlock();
- if (!baseLayer)
+ if (!baseLayer) {
+ SkSafeUnref(baseForComposited);
return false;
+ }
XLOG("drawGL, rect(%d, %d, %d, %d), viewport(%.2f, %.2f, %.2f, %.2f)",
rect.x(), rect.y(), rect.right(), rect.bottom(),
viewport.fLeft, viewport.fTop, viewport.fRight, viewport.fBottom);
resetLayersDirtyArea();
- bool ret = baseLayer->drawGL(rect, viewport, scale, color);
+
+ if (!baseForComposited ||
+ (baseForComposited && !baseForComposited->countChildren())) {
+ SkSafeRef(baseLayer);
+ SkSafeUnref(baseForComposited);
+ baseForComposited = baseLayer;
+ }
+
+ LayerAndroid* compositedRoot = 0;
+ if (baseForComposited && baseForComposited->countChildren() >= 1)
+ compositedRoot = static_cast<LayerAndroid*>(baseForComposited->getChild(0));
+
+ bool ret = baseLayer->drawGL(compositedRoot, rect, viewport, scale, color);
+ m_previouslyUsedRoot = compositedRoot;
if (ret) {
IntRect inval = m_frameworkInval;
inval.unite(m_frameworkLayersInval);
@@ -437,6 +461,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
}
#endif
+ SkSafeUnref(baseForComposited);
SkSafeUnref(baseLayer);
return ret;
}