- Revision
- 132504
- Author
- simon.fra...@apple.com
- Date
- 2012-10-25 11:08:21 -0700 (Thu, 25 Oct 2012)
Log Message
r132427 changed the tiling behavior of tiled layer TileCaches as well as the page tile cache
https://bugs.webkit.org/show_bug.cgi?id=100323
Reviewed by Anders Carlsson.
r132427 assumed that TileCaches were only used for the page, and changed the tile
size behavior of all non-page TileCaches.
Fix by giving TiledBacking a new 'CoverageForSlowScrolling' flag which
affects the tile size behavior.
Consolidated the two places that set TileCoverage into one, and in the process
reduced FrameView's direct communication with TiledBacking.
No new tests because we can't test tile size via tests.
* page/FrameView.cpp:
(WebCore::FrameView::didMoveOnscreen): Rely on RenderLayerCompositor to
call setIsInWindow() on the main page tile cache.
(WebCore::FrameView::willMoveOffscreen): Ditto.
(WebCore::FrameView::performPostLayoutTasks): Rather than explicitly tell
the TiledBacking that it should do stuff, just tell the compositor that
layout happened.
* platform/graphics/TiledBacking.h: New CoverageForSlowScrolling flag.
* platform/graphics/ca/mac/TileCache.mm:
(WebCore::TileCache::tileSizeForCoverageRect): Only use one big tile
if the CoverageForSlowScrolling flag is set.
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::RenderLayerBacking): layer->isRootLayer()
is equivalent to renderer()->isRenderView() and clearer.
(WebCore::RenderLayerBacking::tiledBacking): Call adjustTileCacheCoverage().
It would be nice to move the rest of this TiledBacking code from here somehow.
(WebCore::RenderLayerBacking::adjustTileCacheCoverage): Update the TileCoverage
flags, taking into account horizontal and vertical scrollability independently,
and whether we're in slow scrolling mode.
* rendering/RenderLayerBacking.h:
(RenderLayerBacking):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::frameViewDidLayout): Have the page
tiled backing update it's coverage flags.
(WebCore::RenderLayerCompositor::pageTiledBacking): Utility function.
(WebCore::RenderLayerCompositor::didMoveOnscreen): Moved from FrameView.
(WebCore::RenderLayerCompositor::willMoveOffscreen): Ditto.
* rendering/RenderLayerCompositor.h:
(RenderLayerCompositor):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (132503 => 132504)
--- trunk/Source/WebCore/ChangeLog 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/ChangeLog 2012-10-25 18:08:21 UTC (rev 132504)
@@ -1,3 +1,51 @@
+2012-10-25 Simon Fraser <simon.fra...@apple.com>
+
+ r132427 changed the tiling behavior of tiled layer TileCaches as well as the page tile cache
+ https://bugs.webkit.org/show_bug.cgi?id=100323
+
+ Reviewed by Anders Carlsson.
+
+ r132427 assumed that TileCaches were only used for the page, and changed the tile
+ size behavior of all non-page TileCaches.
+
+ Fix by giving TiledBacking a new 'CoverageForSlowScrolling' flag which
+ affects the tile size behavior.
+
+ Consolidated the two places that set TileCoverage into one, and in the process
+ reduced FrameView's direct communication with TiledBacking.
+
+ No new tests because we can't test tile size via tests.
+
+ * page/FrameView.cpp:
+ (WebCore::FrameView::didMoveOnscreen): Rely on RenderLayerCompositor to
+ call setIsInWindow() on the main page tile cache.
+ (WebCore::FrameView::willMoveOffscreen): Ditto.
+ (WebCore::FrameView::performPostLayoutTasks): Rather than explicitly tell
+ the TiledBacking that it should do stuff, just tell the compositor that
+ layout happened.
+ * platform/graphics/TiledBacking.h: New CoverageForSlowScrolling flag.
+ * platform/graphics/ca/mac/TileCache.mm:
+ (WebCore::TileCache::tileSizeForCoverageRect): Only use one big tile
+ if the CoverageForSlowScrolling flag is set.
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::RenderLayerBacking): layer->isRootLayer()
+ is equivalent to renderer()->isRenderView() and clearer.
+ (WebCore::RenderLayerBacking::tiledBacking): Call adjustTileCacheCoverage().
+ It would be nice to move the rest of this TiledBacking code from here somehow.
+ (WebCore::RenderLayerBacking::adjustTileCacheCoverage): Update the TileCoverage
+ flags, taking into account horizontal and vertical scrollability independently,
+ and whether we're in slow scrolling mode.
+ * rendering/RenderLayerBacking.h:
+ (RenderLayerBacking):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::frameViewDidLayout): Have the page
+ tiled backing update it's coverage flags.
+ (WebCore::RenderLayerCompositor::pageTiledBacking): Utility function.
+ (WebCore::RenderLayerCompositor::didMoveOnscreen): Moved from FrameView.
+ (WebCore::RenderLayerCompositor::willMoveOffscreen): Ditto.
+ * rendering/RenderLayerCompositor.h:
+ (RenderLayerCompositor):
+
2012-10-25 Elliott Sprehn <espr...@chromium.org>
Everything that sets RenderObject::m_style should go through setStyleInternal
Modified: trunk/Source/WebCore/page/FrameView.cpp (132503 => 132504)
--- trunk/Source/WebCore/page/FrameView.cpp 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/page/FrameView.cpp 2012-10-25 18:08:21 UTC (rev 132504)
@@ -931,11 +931,6 @@
void FrameView::didMoveOnscreen()
{
-#if USE(ACCELERATED_COMPOSITING)
- if (TiledBacking* tiledBacking = this->tiledBacking())
- tiledBacking->setIsInWindow(true);
-#endif
-
if (RenderView* root = rootRenderer(this))
root->didMoveOnscreen();
contentAreaDidShow();
@@ -943,11 +938,6 @@
void FrameView::willMoveOffscreen()
{
-#if USE(ACCELERATED_COMPOSITING)
- if (TiledBacking* tiledBacking = this->tiledBacking())
- tiledBacking->setIsInWindow(false);
-#endif
-
if (RenderView* root = rootRenderer(this))
root->willMoveOffscreen();
contentAreaDidHide();
@@ -2500,13 +2490,9 @@
}
#if USE(ACCELERATED_COMPOSITING)
- if (TiledBacking* tiledBacking = this->tiledBacking()) {
- if (page) {
- if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) {
- bool shouldLimitTileCoverage = !canHaveScrollbars() || scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread();
- tiledBacking->setTileCoverage(shouldLimitTileCoverage ? TiledBacking::CoverageForVisibleArea : TiledBacking::CoverageForScrolling);
- }
- }
+ if (RenderView* root = rootRenderer(this)) {
+ if (root->usesCompositing())
+ root->compositor()->frameViewDidLayout();
}
#endif
Modified: trunk/Source/WebCore/platform/graphics/TiledBacking.h (132503 => 132504)
--- trunk/Source/WebCore/platform/graphics/TiledBacking.h 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/platform/graphics/TiledBacking.h 2012-10-25 18:08:21 UTC (rev 132504)
@@ -43,6 +43,7 @@
CoverageForVisibleArea = 0,
CoverageForVerticalScrolling = 1 << 0,
CoverageForHorizontalScrolling = 1 << 1,
+ CoverageForSlowScrolling = 1 << 2, // Indicates that we expect to paint a lot on scrolling.
CoverageForScrolling = CoverageForVerticalScrolling | CoverageForHorizontalScrolling
};
typedef unsigned TileCoverage;
Modified: trunk/Source/WebCore/platform/graphics/ca/mac/TileCache.mm (132503 => 132504)
--- trunk/Source/WebCore/platform/graphics/ca/mac/TileCache.mm 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/platform/graphics/ca/mac/TileCache.mm 2012-10-25 18:08:21 UTC (rev 132504)
@@ -334,7 +334,7 @@
IntSize TileCache::tileSizeForCoverageRect(const IntRect& coverageRect) const
{
- if (m_tileCoverage == CoverageForVisibleArea)
+ if (m_tileCoverage & CoverageForSlowScrolling)
return coverageRect.size();
return IntSize(defaultTileCacheWidth, defaultTileCacheHeight);
}
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (132503 => 132504)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2012-10-25 18:08:21 UTC (rev 132504)
@@ -107,7 +107,7 @@
, m_canCompositeFilters(false)
#endif
{
- if (renderer()->isRenderView()) {
+ if (layer->isRootLayer()) {
Frame* frame = toRenderView(renderer())->frameView()->frame();
Page* page = frame ? frame->page() : 0;
if (page && frame && page->mainFrame() == frame) {
@@ -124,16 +124,12 @@
createPrimaryGraphicsLayer();
if (m_usingTiledCacheLayer) {
+ TiledBacking* tiledBacking = this->tiledBacking();
if (Page* page = renderer()->frame()->page()) {
- if (TiledBacking* tiledBacking = m_graphicsLayer->tiledBacking()) {
- Frame* frame = renderer()->frame();
- tiledBacking->setIsInWindow(page->isOnscreen());
- if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) {
- bool shouldLimitTileCoverage = !frame->view()->canHaveScrollbars() || scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread();
- tiledBacking->setTileCoverage(shouldLimitTileCoverage ? TiledBacking::CoverageForVisibleArea : TiledBacking::CoverageForScrolling);
- }
- tiledBacking->setScrollingPerformanceLoggingEnabled(frame->settings() && frame->settings()->scrollingPerformanceLoggingEnabled());
- }
+ Frame* frame = renderer()->frame();
+ tiledBacking->setIsInWindow(page->isOnscreen());
+ tiledBacking->setScrollingPerformanceLoggingEnabled(frame->settings() && frame->settings()->scrollingPerformanceLoggingEnabled());
+ adjustTileCacheCoverage();
}
}
}
@@ -176,6 +172,37 @@
return m_usingTiledCacheLayer && m_creatingPrimaryGraphicsLayer;
}
+TiledBacking* RenderLayerBacking::tiledBacking() const
+{
+ return m_graphicsLayer->tiledBacking();
+}
+
+void RenderLayerBacking::adjustTileCacheCoverage()
+{
+ if (!m_usingTiledCacheLayer)
+ return;
+
+ TiledBacking::TileCoverage tileCoverage = TiledBacking::CoverageForVisibleArea;
+
+ // FIXME: When we use TiledBacking for overflow, this should look at RenderView scrollability.
+ Frame* frame = renderer()->frame();
+ if (frame) {
+ FrameView* frameView = frame->view();
+ if (frameView->horizontalScrollbarMode() != ScrollbarAlwaysOff)
+ tileCoverage |= TiledBacking::CoverageForHorizontalScrolling;
+
+ if (frameView->verticalScrollbarMode() != ScrollbarAlwaysOff)
+ tileCoverage |= TiledBacking::CoverageForVerticalScrolling;
+
+ if (ScrollingCoordinator* scrollingCoordinator = frame->page()->scrollingCoordinator()) {
+ if (scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread())
+ tileCoverage |= TiledBacking::CoverageForSlowScrolling;
+ }
+ }
+
+ tiledBacking()->setTileCoverage(tileCoverage);
+}
+
void RenderLayerBacking::createPrimaryGraphicsLayer()
{
String layerName;
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (132503 => 132504)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.h 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h 2012-10-25 18:08:21 UTC (rev 132504)
@@ -39,6 +39,7 @@
class KeyframeList;
class RenderLayerCompositor;
+class TiledBacking;
enum CompositingLayerType {
NormalCompositingLayer, // non-tiled layer with backing store
@@ -137,7 +138,9 @@
void positionOverflowControlsLayers(const IntSize& offsetFromRoot);
bool usingTileCache() const { return m_usingTiledCacheLayer; }
-
+ TiledBacking* tiledBacking() const;
+ void adjustTileCacheCoverage();
+
// GraphicsLayerClient interface
virtual bool shouldUseTileCache(const GraphicsLayer*) const OVERRIDE;
virtual void notifyAnimationStarted(const GraphicsLayer*, double startTime) OVERRIDE;
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (132503 => 132504)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-10-25 18:08:21 UTC (rev 132504)
@@ -1119,6 +1119,13 @@
m_scrollLayer->setPosition(FloatPoint(-scrollPosition.x(), -scrollPosition.y()));
}
+void RenderLayerCompositor::frameViewDidLayout()
+{
+ RenderLayerBacking* renderViewBacking = m_renderView->layer()->backing();
+ if (renderViewBacking)
+ renderViewBacking->adjustTileCacheCoverage();
+}
+
void RenderLayerCompositor::scrollingLayerDidChange(RenderLayer* layer)
{
RenderLayerBacking* backing = layer->backing();
@@ -1350,8 +1357,17 @@
return m_scrollLayer.get();
}
+TiledBacking* RenderLayerCompositor::pageTiledBacking() const
+{
+ RenderLayerBacking* renderViewBacking = m_renderView->layer()->backing();
+ return renderViewBacking ? renderViewBacking->tiledBacking() : 0;
+}
+
void RenderLayerCompositor::didMoveOnscreen()
{
+ if (TiledBacking* tiledBacking = pageTiledBacking())
+ tiledBacking->setIsInWindow(true);
+
if (!inCompositingMode() || m_rootLayerAttachment != RootLayerUnattached)
return;
@@ -1361,6 +1377,9 @@
void RenderLayerCompositor::willMoveOffscreen()
{
+ if (TiledBacking* tiledBacking = pageTiledBacking())
+ tiledBacking->setIsInWindow(false);
+
if (!inCompositingMode() || m_rootLayerAttachment == RootLayerUnattached)
return;
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (132503 => 132504)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2012-10-25 18:00:23 UTC (rev 132503)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2012-10-25 18:08:21 UTC (rev 132504)
@@ -42,6 +42,7 @@
#if ENABLE(VIDEO)
class RenderVideo;
#endif
+class TiledBacking;
enum CompositingUpdateType {
CompositingUpdateAfterStyleChange,
@@ -195,6 +196,7 @@
void frameViewDidChangeLocation(const IntPoint& contentsOffset);
void frameViewDidChangeSize();
void frameViewDidScroll();
+ void frameViewDidLayout();
void scrollingLayerDidChange(RenderLayer*);
@@ -293,6 +295,7 @@
bool isFlushingLayers() const { return m_flushingLayers; }
Page* page() const;
+ TiledBacking* pageTiledBacking() const;
GraphicsLayerFactory* graphicsLayerFactory() const;
ScrollingCoordinator* scrollingCoordinator() const;