summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2012-03-14 16:43:27 -0700
committerTeng-Hui Zhu <ztenghui@google.com>2012-03-22 16:01:22 -0700
commit885e650b12d781be054b31ae6221925a0184dc33 (patch)
tree506c80fd82f092a9c0601702230909c4a7ef6c95 /Source/WebCore/platform/graphics/android/GLWebViewState.cpp
parent6aea92fd5ffd5a43b1c13769be9a16202f498b59 (diff)
downloadexternal_webkit-885e650b12d781be054b31ae6221925a0184dc33.zip
external_webkit-885e650b12d781be054b31ae6221925a0184dc33.tar.gz
external_webkit-885e650b12d781be054b31ae6221925a0184dc33.tar.bz2
reimplement BaseLayerAndroid as a LayerAndroid subclass
Breaks low res tiling, and expanded rendering bounds. Change-Id: Iec3ba2adceb6bd95399594d29fd8c0b18c1122ce
Diffstat (limited to 'Source/WebCore/platform/graphics/android/GLWebViewState.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp200
1 files changed, 17 insertions, 183 deletions
diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
index 730081b..1dfc496 100644
--- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -66,27 +66,16 @@ namespace WebCore {
using namespace android;
GLWebViewState::GLWebViewState()
- : m_zoomManager(this)
- , m_usePageA(true)
- , m_frameworkInval(0, 0, 0, 0)
- , m_frameworkLayersInval(0, 0, 0, 0)
+ : m_frameworkLayersInval(0, 0, 0, 0)
, m_isScrolling(false)
, m_isViewportScrolling(false)
, m_goingDown(true)
, m_goingLeft(false)
- , m_expandedTileBoundsX(0)
- , m_expandedTileBoundsY(0)
, m_scale(1)
, m_layersRenderingMode(kAllTextures)
, m_surfaceCollectionManager(this)
{
m_viewport.setEmpty();
- m_futureViewportTileBounds.setEmpty();
- m_viewportTileBounds.setEmpty();
- m_preZoomBounds.setEmpty();
-
- m_tiledPageA = new TiledPage(FIRST_TILED_PAGE_ID, this);
- m_tiledPageB = new TiledPage(SECOND_TILED_PAGE_ID, this);
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("GLWebViewState");
@@ -100,14 +89,6 @@ GLWebViewState::GLWebViewState()
GLWebViewState::~GLWebViewState()
{
- // We have to destroy the two tiled pages first as their destructor
- // may depend on the existence of this GLWebViewState and some of its
- // instance variables in order to complete.
- // Explicitely, currently we need to have the m_paintingBaseLayer around
- // in order to complete any pending paint operations (the tiled pages
- // will remove any pending operations, and wait if one is underway).
- delete m_tiledPageA;
- delete m_tiledPageB;
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("GLWebViewState");
#endif
@@ -117,15 +98,11 @@ GLWebViewState::~GLWebViewState()
bool GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, bool showVisualIndicator,
bool isPictureAfterFirstLayout)
{
- if (!layer || isPictureAfterFirstLayout) {
- // TODO: move this into SurfaceCollectionManager
- m_zoomManager.swapPages(); // reset zoom state
- m_tiledPageA->discardTextures();
- m_tiledPageB->discardTextures();
+ if (!layer || isPictureAfterFirstLayout)
m_layersRenderingMode = kAllTextures;
- }
+
if (layer) {
- ALOGV("new base layer %p, with child %p", layer, layer->getChild(0));
+ ALOGV("layer tree %p, with child %p", layer, layer->getChild(0));
layer->setState(this);
}
bool queueFull = m_surfaceCollectionManager.updateWithSurfaceCollection(
@@ -145,85 +122,6 @@ bool GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, bool showVisualIndica
void GLWebViewState::scrollLayer(int layerId, int x, int y)
{
m_surfaceCollectionManager.updateScrollableLayer(layerId, x, y);
-
- // TODO: only inval the area of the scrolled layer instead of
- // doing a fullInval()
- if (m_layersRenderingMode == kSingleSurfaceRendering)
- fullInval();
-}
-
-void GLWebViewState::invalRegion(const SkRegion& region)
-{
- if (m_layersRenderingMode == kSingleSurfaceRendering) {
- // TODO: do the union of both layer trees to compute
- // the minimum inval instead of doing a fullInval()
- fullInval();
- return;
- }
- SkRegion::Iterator iterator(region);
- while (!iterator.done()) {
- SkIRect r = iterator.rect();
- IntRect ir(r.fLeft, r.fTop, r.width(), r.height());
- inval(ir);
- iterator.next();
- }
-}
-
-void GLWebViewState::inval(const IntRect& rect)
-{
- if (!rect.isEmpty()) {
- // find which tiles fall within the invalRect and mark them as dirty
- m_tiledPageA->invalidateRect(rect);
- m_tiledPageB->invalidateRect(rect);
- if (m_frameworkInval.isEmpty())
- m_frameworkInval = rect;
- else
- m_frameworkInval.unite(rect);
- ALOGV("intermediate invalRect(%d, %d, %d, %d) after unite with rect %d %d %d %d", m_frameworkInval.x(),
- m_frameworkInval.y(), m_frameworkInval.width(), m_frameworkInval.height(),
- rect.x(), rect.y(), rect.width(), rect.height());
- }
- TilesManager::instance()->getProfiler()->nextInval(rect, zoomManager()->currentScale());
-}
-
-void GLWebViewState::paintBaseLayerContent(SkCanvas* canvas)
-{
- m_surfaceCollectionManager.drawCanvas(canvas, m_layersRenderingMode == kSingleSurfaceRendering);
-}
-
-TiledPage* GLWebViewState::sibling(TiledPage* page)
-{
- return (page == m_tiledPageA) ? m_tiledPageB : m_tiledPageA;
-}
-
-TiledPage* GLWebViewState::frontPage()
-{
- android::Mutex::Autolock lock(m_tiledPageLock);
- return m_usePageA ? m_tiledPageA : m_tiledPageB;
-}
-
-TiledPage* GLWebViewState::backPage()
-{
- android::Mutex::Autolock lock(m_tiledPageLock);
- return m_usePageA ? m_tiledPageB : m_tiledPageA;
-}
-
-void GLWebViewState::swapPages()
-{
- android::Mutex::Autolock lock(m_tiledPageLock);
- m_usePageA ^= true;
- TiledPage* oldPage = m_usePageA ? m_tiledPageB : m_tiledPageA;
- zoomManager()->swapPages();
- oldPage->discardTextures();
-}
-
-int GLWebViewState::baseContentWidth()
-{
- return m_surfaceCollectionManager.baseContentWidth();
-}
-int GLWebViewState::baseContentHeight()
-{
- return m_surfaceCollectionManager.baseContentHeight();
}
void GLWebViewState::setViewport(const SkRect& viewport, float scale)
@@ -236,19 +134,18 @@ void GLWebViewState::setViewport(const SkRect& viewport, float scale)
int viewMaxTileY = static_cast<int>(ceilf((viewport.height()-1) * invTileContentHeight)) + 1;
TilesManager* manager = TilesManager::instance();
- int maxTextureCount = (viewMaxTileX + m_expandedTileBoundsX * 2) *
- (viewMaxTileY + m_expandedTileBoundsY * 2) * (manager->highEndGfx() ? 4 : 2);
+ int maxTextureCount = viewMaxTileX * viewMaxTileY * (manager->highEndGfx() ? 4 : 2);
manager->setMaxTextureCount(maxTextureCount);
- m_tiledPageA->updateBaseTileSize();
- m_tiledPageB->updateBaseTileSize();
+ // TODO: investigate whether we can move this return earlier.
if ((m_viewport == viewport)
- && (zoomManager()->futureScale() == scale)) {
+ && (m_scale == scale)) {
// everything below will stay the same, early return.
m_isViewportScrolling = false;
return;
}
+ m_scale = scale;
m_goingDown = m_viewport.fTop - viewport.fTop <= 0;
m_goingLeft = m_viewport.fLeft - viewport.fLeft >= 0;
@@ -261,12 +158,6 @@ void GLWebViewState::setViewport(const SkRect& viewport, float scale)
m_viewport.fLeft, m_viewport.fTop, m_viewport.fRight, m_viewport.fBottom,
m_viewport.width(), m_viewport.height(), scale,
zoomManager()->currentScale(), zoomManager()->futureScale());
-
- m_viewportTileBounds.set(
- static_cast<int>(floorf(viewport.fLeft * invTileContentWidth)),
- static_cast<int>(floorf(viewport.fTop * invTileContentHeight)),
- static_cast<int>(ceilf(viewport.fRight * invTileContentWidth)),
- static_cast<int>(ceilf(viewport.fBottom * invTileContentHeight)));
}
#ifdef MEASURES_PERF
@@ -282,14 +173,6 @@ void GLWebViewState::dumpMeasures()
}
#endif // MEASURES_PERF
-void GLWebViewState::resetFrameworkInval()
-{
- m_frameworkInval.setX(0);
- m_frameworkInval.setY(0);
- m_frameworkInval.setWidth(0);
- m_frameworkInval.setHeight(0);
-}
-
void GLWebViewState::addDirtyArea(const IntRect& rect)
{
if (rect.isEmpty())
@@ -311,21 +194,6 @@ void GLWebViewState::resetLayersDirtyArea()
m_frameworkLayersInval.setHeight(0);
}
-void GLWebViewState::drawBackground(Color& backgroundColor)
-{
- if (TilesManager::instance()->invertedScreen()) {
- float color = 1.0 - ((((float) backgroundColor.red() / 255.0) +
- ((float) backgroundColor.green() / 255.0) +
- ((float) backgroundColor.blue() / 255.0)) / 3.0);
- glClearColor(color, color, color, 1);
- } else {
- glClearColor((float)backgroundColor.red() / 255.0,
- (float)backgroundColor.green() / 255.0,
- (float)backgroundColor.blue() / 255.0, 1);
- }
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
double GLWebViewState::setupDrawing(const IntRect& viewRect, const SkRect& visibleRect,
const IntRect& webViewRect, int titleBarHeight,
const IntRect& screenClip, float scale)
@@ -363,7 +231,6 @@ double GLWebViewState::setupDrawing(const IntRect& viewRect, const SkRect& visib
double currentTime = WTF::currentTime();
setViewport(visibleRect, scale);
- m_zoomManager.processNewScale(currentTime, scale);
return currentTime;
}
@@ -429,21 +296,8 @@ bool GLWebViewState::setLayersRenderingMode(TexturesResult& nbTexturesNeeded)
m_layersRenderingMode = kSingleSurfaceRendering;
// update the base surface if needed
- if (m_layersRenderingMode != layersRenderingMode
- && invalBase) {
- m_tiledPageA->discardTextures();
- m_tiledPageB->discardTextures();
- fullInval();
- return true;
- }
- return false;
-}
-
-void GLWebViewState::fullInval()
-{
- // TODO -- use base layer's size.
- IntRect ir(0, 0, 1E6, 1E6);
- inval(ir);
+ // TODO: inval base layergroup when going into single surface mode
+ return (m_layersRenderingMode != layersRenderingMode && invalBase);
}
bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
@@ -452,20 +306,11 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
bool* collectionsSwappedPtr, bool* newCollectionHasAnimPtr)
{
TilesManager* tilesManager = TilesManager::instance();
- m_scale = scale;
tilesManager->getProfiler()->nextFrame(viewport.fLeft, viewport.fTop,
viewport.fRight, viewport.fBottom,
scale);
tilesManager->incDrawGLCount();
- float viewWidth = (viewport.fRight - viewport.fLeft) * TILE_PREFETCH_RATIO;
- float viewHeight = (viewport.fBottom - viewport.fTop) * TILE_PREFETCH_RATIO;
- bool noPrefetch = tilesManager->useMinimalMemory() || !tilesManager->highEndGfx();
- bool useHorzPrefetch = noPrefetch ? 0 : viewWidth < baseContentWidth();
- bool useVertPrefetch = noPrefetch ? 0 : viewHeight < baseContentHeight();
- m_expandedTileBoundsX = (useHorzPrefetch) ? TILE_PREFETCH_DISTANCE : 0;
- m_expandedTileBoundsY = (useVertPrefetch) ? TILE_PREFETCH_DISTANCE : 0;
-
ALOGV("drawGL, rect(%d, %d, %d, %d), viewport(%.2f, %.2f, %.2f, %.2f)",
rect.x(), rect.y(), rect.width(), rect.height(),
viewport.fLeft, viewport.fTop, viewport.fRight, viewport.fBottom);
@@ -497,7 +342,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
}
// gather the textures we can use
- tilesManager->gatherLayerTextures();
+ tilesManager->gatherTextures();
double currentTime = setupDrawing(rect, viewport, webViewRect, titleBarHeight, clip, scale);
@@ -509,8 +354,6 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
scale, fastSwap,
collectionsSwappedPtr, newCollectionHasAnimPtr,
&nbTexturesNeeded);
- if (!ret)
- resetFrameworkInval();
int nbTexturesForImages = ImagesManager::instance()->nbTextures();
ALOGV("*** We have %d textures for images, %d full, %d clipped, total %d / %d",
@@ -530,22 +373,15 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
// ret==true && empty inval region means we've inval'd everything,
// but don't have new content. Keep redrawing full view (0,0,0,0)
// until tile generation catches up and we swap pages.
- bool fullScreenInval = m_frameworkInval.isEmpty();
+ bool fullScreenInval = m_frameworkLayersInval.isEmpty();
if (!fullScreenInval) {
- FloatRect frameworkInval = tilesManager->shader()->rectInInvScreenCoord(
- m_frameworkInval);
- // Inflate the invalidate rect to avoid precision lost.
- frameworkInval.inflate(1);
- IntRect inval(frameworkInval.x(), frameworkInval.y(),
- frameworkInval.width(), frameworkInval.height());
-
- inval.unite(m_frameworkLayersInval);
+ m_frameworkLayersInval.inflate(1);
- invalRect->setX(inval.x());
- invalRect->setY(inval.y());
- invalRect->setWidth(inval.width());
- invalRect->setHeight(inval.height());
+ invalRect->setX(m_frameworkLayersInval.x());
+ invalRect->setY(m_frameworkLayersInval.y());
+ invalRect->setWidth(m_frameworkLayersInval.width());
+ invalRect->setHeight(m_frameworkLayersInval.height());
ALOGV("invalRect(%d, %d, %d, %d)", inval.x(),
inval.y(), inval.width(), inval.height());
@@ -562,8 +398,6 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect,
invalRect->setWidth(0);
invalRect->setHeight(0);
}
- } else {
- resetFrameworkInval();
}
showFrameInfo(rect, *collectionsSwappedPtr);