Title: [132504] trunk/Source/WebCore
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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to