diff options
author | Chris Craik <ccraik@google.com> | 2011-08-23 13:36:18 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2011-08-25 15:08:33 -0700 |
commit | f51a51f6ea307f4311a04aa865a42b233269540b (patch) | |
tree | 62856bffa8b6e82f229a76cc324b28c4286496ee /Source/WebCore/platform/graphics/android | |
parent | 5a1bad665e3c27495e4ccb9a73996ce3a84b0a26 (diff) | |
download | external_webkit-f51a51f6ea307f4311a04aa865a42b233269540b.zip external_webkit-f51a51f6ea307f4311a04aa865a42b233269540b.tar.gz external_webkit-f51a51f6ea307f4311a04aa865a42b233269540b.tar.bz2 |
better locking while scrolling, but disables double buffering
don't detect scrolling, query from java
removes double buffering
depends on CL in frameworks/base: https://android-git.corp.google.com/g/#/c/130213/
bug:5106313
Change-Id: Ibfa7f305874f4209fed001c030bb94e752d479b9
Diffstat (limited to 'Source/WebCore/platform/graphics/android')
5 files changed, 57 insertions, 60 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index e3e41bc..ca679fb 100644 --- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -135,11 +135,10 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, // Let's prepare the page if needed if (prepareNextTiledPage) { - TiledPage* nextTiledPage = m_glWebViewState->backPage(); nextTiledPage->setScale(scale); m_glWebViewState->setFutureViewport(viewportTileBounds); m_glWebViewState->lockBaseLayerUpdate(); - nextTiledPage->prepare(goingDown, goingLeft, viewportTileBounds); + nextTiledPage->prepare(goingDown, goingLeft, viewportTileBounds, TiledPage::kVisibleBounds); // Cancel pending paints for the foreground page TilesManager::instance()->removePaintOperationsForPage(tiledPage, false); } @@ -159,7 +158,6 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, float nextTiledPageTransparency = 1; zoomManager->processTransition(currentTime, scale, &doSwap, &nextTiledPageTransparency, &transparency); - nextTiledPage->draw(nextTiledPageTransparency, viewportTileBounds); } @@ -167,38 +165,39 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, bool needsRedraw = false; - // We are now using an hybrid model -- during scrolling, - // we will display the current tiledPage even if some tiles are - // out of date. When standing still on the other hand, we wait until - // the back page is ready before swapping the pages, ensuring that the - // displayed content is in sync. - if (!doSwap && !zooming && !m_glWebViewState->moving()) { - if (!tiledPage->ready(preZoomBounds, zoomManager->currentScale())) { + static bool waitOnScrollFinish = false; + + if (m_glWebViewState->isScrolling()) { + if (!waitOnScrollFinish) { + waitOnScrollFinish = true; + + //started scrolling, lock updates m_glWebViewState->lockBaseLayerUpdate(); - nextTiledPage->setScale(zoomManager->currentScale()); - nextTiledPage->prepare(goingDown, goingLeft, preZoomBounds); - } - if (nextTiledPage->ready(preZoomBounds, zoomManager->currentScale())) { - nextTiledPage->draw(transparency, preZoomBounds); - m_glWebViewState->resetFrameworkInval(); - m_glWebViewState->unlockBaseLayerUpdate(); - doSwap = true; - } else { - tiledPage->draw(transparency, preZoomBounds); } } else { - if (tiledPage->ready(preZoomBounds, zoomManager->currentScale())) - m_glWebViewState->resetFrameworkInval(); - - // Ask for the tiles and draw -- tiles may be out of date. - if (!zooming) - m_glWebViewState->unlockBaseLayerUpdate(); + // wait until all tiles are rendered before anything else + if (waitOnScrollFinish) { + //wait for the page to finish rendering, then go into swap mode + if (tiledPage->ready(preZoomBounds, zoomManager->currentScale())) { + m_glWebViewState->resetFrameworkInval(); + m_glWebViewState->unlockBaseLayerUpdate(); + waitOnScrollFinish = false; + } + //should be prepared, simply draw + } - if (!prepareNextTiledPage) - tiledPage->prepare(goingDown, goingLeft, preZoomBounds); - tiledPage->draw(transparency, preZoomBounds); + if (!waitOnScrollFinish) { + //completed page post-scroll + if (!tiledPage->ready(preZoomBounds, zoomManager->currentScale())) { + m_glWebViewState->lockBaseLayerUpdate(); + } + } } + if (!prepareNextTiledPage || tiledPage->ready(preZoomBounds, zoomManager->currentScale())) + tiledPage->prepare(goingDown, goingLeft, preZoomBounds, TiledPage::kExpandedBounds); + tiledPage->draw(transparency, preZoomBounds); + if (zoomManager->scaleRequestState() != ZoomManager::kNoScaleRequest || !tiledPage->ready(preZoomBounds, zoomManager->currentScale())) needsRedraw = true; @@ -206,14 +205,13 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale, if (doSwap) { zoomManager->setCurrentScale(scale); m_glWebViewState->swapPages(); - m_glWebViewState->unlockBaseLayerUpdate(); if (pagesSwapped) *pagesSwapped = true; } // if no longer trailing behind invalidates, unlock (so invalidates can // go directly to the the TiledPages without deferral) - if (!needsRedraw) + if (!needsRedraw && !waitOnScrollFinish) m_glWebViewState->unlockBaseLayerUpdate(); m_glWebViewState->paintExtras(); diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp index 3cc192f..e07c86f 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -64,7 +64,8 @@ namespace WebCore { using namespace android; GLWebViewState::GLWebViewState(android::Mutex* buttonMutex) - : m_baseLayer(0) + : m_zoomManager(this) + , m_baseLayer(0) , m_currentBaseLayer(0) , m_previouslyUsedRoot(0) , m_currentPictureCounter(0) @@ -76,14 +77,13 @@ GLWebViewState::GLWebViewState(android::Mutex* buttonMutex) , m_backgroundColor(SK_ColorWHITE) , m_displayRings(false) , m_focusRingTexture(-1) + , m_isScrolling(false) , m_goingDown(true) , m_goingLeft(false) , m_expandedTileBoundsX(0) , m_expandedTileBoundsY(0) - , m_zoomManager(this) { m_viewport.setEmpty(); - m_previousViewport.setEmpty(); m_futureViewportTileBounds.setEmpty(); m_viewportTileBounds.setEmpty(); m_preZoomBounds.setEmpty(); @@ -226,8 +226,7 @@ void GLWebViewState::inval(const IntRect& rect) m_currentPictureCounter++; if (!rect.isEmpty()) { // find which tiles fall within the invalRect and mark them as dirty - m_tiledPageA->invalidateRect(rect, m_currentPictureCounter); - m_tiledPageB->invalidateRect(rect, m_currentPictureCounter); + frontPage()->invalidateRect(rect, m_currentPictureCounter); if (m_frameworkInval.isEmpty()) m_frameworkInval = rect; else @@ -372,13 +371,12 @@ int GLWebViewState::baseContentHeight() void GLWebViewState::setViewport(SkRect& viewport, float scale) { - m_previousViewport = m_viewport; if ((m_viewport == viewport) && (zoomManager()->futureScale() == scale)) return; - m_goingDown = m_previousViewport.fTop - viewport.fTop <= 0; - m_goingLeft = m_previousViewport.fLeft - viewport.fLeft >= 0; + m_goingDown = m_viewport.fTop - viewport.fTop <= 0; + m_goingLeft = m_viewport.fLeft - viewport.fLeft >= 0; m_viewport = viewport; XLOG("New VIEWPORT %.2f - %.2f %.2f - %.2f (w: %2.f h: %.2f scale: %.2f currentScale: %.2f futureScale: %.2f)", diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.h b/Source/WebCore/platform/graphics/android/GLWebViewState.h index 9182af3..9bda481 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.h +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.h @@ -203,16 +203,8 @@ public: void lockBaseLayerUpdate() { m_baseLayerUpdate = false; } void unlockBaseLayerUpdate(); - bool moving() { - // This will only works if we are not zooming -- we check - // for this in BaseLayerAndroid::drawBasePictureInGL() - if ((m_viewport.fLeft != m_previousViewport.fLeft || - m_viewport.fTop != m_previousViewport.fTop) && - m_viewport.width() == m_previousViewport.width() && - m_viewport.height() == m_previousViewport.height()) - return true; - return false; - } + void setIsScrolling(bool isScrolling) { m_isScrolling = isScrolling; } + bool isScrolling() { return m_isScrolling; } double setupDrawing(IntRect& rect, SkRect& viewport, IntRect& webViewRect, int titleBarHeight, IntRect& screenClip, @@ -248,7 +240,6 @@ private: ZoomManager m_zoomManager; android::Mutex m_tiledPageLock; SkRect m_viewport; - SkRect m_previousViewport; SkIRect m_viewportTileBounds; SkIRect m_futureViewportTileBounds; SkIRect m_preZoomBounds; @@ -282,6 +273,7 @@ private: bool m_ringsIsPressed; int m_focusRingTexture; + bool m_isScrolling; bool m_goingDown; bool m_goingLeft; diff --git a/Source/WebCore/platform/graphics/android/TiledPage.cpp b/Source/WebCore/platform/graphics/android/TiledPage.cpp index a69f9d1..c9c776c 100644 --- a/Source/WebCore/platform/graphics/android/TiledPage.cpp +++ b/Source/WebCore/platform/graphics/android/TiledPage.cpp @@ -240,7 +240,7 @@ void TiledPage::updateTileState(const SkIRect& tileBounds) m_invalTilesRegion.setEmpty(); } -void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds) +void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds, PrepareBounds bounds) { if (!m_glWebViewState) return; @@ -263,16 +263,20 @@ void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBound // smoother scrolling. int nTilesToPrepare = nbTilesWidth * nbTilesHeight; int nMaxTilesPerPage = m_baseTileSize / 2; - int expandX = m_glWebViewState->expandedTileBoundsX(); - int expandY = m_glWebViewState->expandedTileBoundsY(); - firstTileX -= expandX; - lastTileX += expandX; - nbTilesWidth += expandX * 2; + if (bounds == kExpandedBounds) { + // prepare tiles outside of the visible bounds + int expandX = m_glWebViewState->expandedTileBoundsX(); + int expandY = m_glWebViewState->expandedTileBoundsY(); - firstTileY -= expandY; - lastTileY += expandY; - nbTilesHeight += expandY * 2; + firstTileX -= expandX; + lastTileX += expandX; + nbTilesWidth += expandX * 2; + + firstTileY -= expandY; + lastTileY += expandY; + nbTilesHeight += expandY * 2; + } m_expandedTileBounds.fLeft = firstTileX; m_expandedTileBounds.fTop = firstTileY; diff --git a/Source/WebCore/platform/graphics/android/TiledPage.h b/Source/WebCore/platform/graphics/android/TiledPage.h index 4b09364..56a34f4 100644 --- a/Source/WebCore/platform/graphics/android/TiledPage.h +++ b/Source/WebCore/platform/graphics/android/TiledPage.h @@ -51,6 +51,11 @@ class IntRect; */ class TiledPage : public TilePainter { public: + enum PrepareBounds { + kExpandedBounds = 0, + kVisibleBounds = 1 + }; + TiledPage(int id, GLWebViewState* state); ~TiledPage(); @@ -58,7 +63,7 @@ public: TiledPage* sibling(); // prepare the page for display on the screen - void prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds); + void prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds, PrepareBounds bounds); // check to see if the page is ready for display bool ready(const SkIRect& tileBounds, float scale); // draw the page on the screen |