summaryrefslogtreecommitdiffstats
path: root/Source/WebCore
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2011-08-23 13:36:18 -0700
committerChris Craik <ccraik@google.com>2011-08-25 15:08:33 -0700
commitf51a51f6ea307f4311a04aa865a42b233269540b (patch)
tree62856bffa8b6e82f229a76cc324b28c4286496ee /Source/WebCore
parent5a1bad665e3c27495e4ccb9a73996ce3a84b0a26 (diff)
downloadexternal_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')
-rw-r--r--Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp60
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp14
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.h14
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.cpp22
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.h7
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