diff options
author | Nicolas Roard <nicolasroard@google.com> | 2011-03-22 14:29:12 -0700 |
---|---|---|
committer | Nicolas Roard <nicolasroard@google.com> | 2011-03-22 23:56:44 -0700 |
commit | 772742124c1e5c700120019397dc8af29ced74c0 (patch) | |
tree | b3a1d15332445f13f7a174d78587bc990dafd699 /WebCore/platform/graphics/android/GLWebViewState.cpp | |
parent | 55c8e9b1b75caff31e804a6f4da404da9f67af93 (diff) | |
download | external_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.cpp | 33 |
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; } |