Changeset 132504 in webkit


Ignore:
Timestamp:
Oct 25, 2012, 11:08:21 AM (12 years ago)
Author:
Simon Fraser
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):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r132503 r132504  
     12012-10-25  Simon Fraser  <simon.fraser@apple.com>
     2
     3        r132427 changed the tiling behavior of tiled layer TileCaches as well as the page tile cache
     4        https://bugs.webkit.org/show_bug.cgi?id=100323
     5
     6        Reviewed by Anders Carlsson.
     7
     8        r132427 assumed that TileCaches were only used for the page, and changed the tile
     9        size behavior of all non-page TileCaches.
     10       
     11        Fix by giving TiledBacking a new 'CoverageForSlowScrolling' flag which
     12        affects the tile size behavior.
     13       
     14        Consolidated the two places that set TileCoverage into one, and in the process
     15        reduced FrameView's direct communication with TiledBacking.
     16
     17        No new tests because we can't test tile size via tests.
     18
     19        * page/FrameView.cpp:
     20        (WebCore::FrameView::didMoveOnscreen): Rely on RenderLayerCompositor to
     21        call setIsInWindow() on the main page tile cache.
     22        (WebCore::FrameView::willMoveOffscreen): Ditto.
     23        (WebCore::FrameView::performPostLayoutTasks): Rather than explicitly tell
     24        the TiledBacking that it should do stuff, just tell the compositor that
     25        layout happened.
     26        * platform/graphics/TiledBacking.h: New CoverageForSlowScrolling flag.
     27        * platform/graphics/ca/mac/TileCache.mm:
     28        (WebCore::TileCache::tileSizeForCoverageRect): Only use one big tile
     29        if the CoverageForSlowScrolling flag is set.
     30        * rendering/RenderLayerBacking.cpp:
     31        (WebCore::RenderLayerBacking::RenderLayerBacking): layer->isRootLayer()
     32        is equivalent to renderer()->isRenderView() and clearer.
     33        (WebCore::RenderLayerBacking::tiledBacking): Call adjustTileCacheCoverage().
     34        It would be nice to move the rest of this TiledBacking code from here somehow.
     35        (WebCore::RenderLayerBacking::adjustTileCacheCoverage): Update the TileCoverage
     36        flags, taking into account horizontal and vertical scrollability independently,
     37        and whether we're in slow scrolling mode.
     38        * rendering/RenderLayerBacking.h:
     39        (RenderLayerBacking):
     40        * rendering/RenderLayerCompositor.cpp:
     41        (WebCore::RenderLayerCompositor::frameViewDidLayout): Have the page
     42        tiled backing update it's coverage flags.
     43        (WebCore::RenderLayerCompositor::pageTiledBacking): Utility function.
     44        (WebCore::RenderLayerCompositor::didMoveOnscreen): Moved from FrameView.
     45        (WebCore::RenderLayerCompositor::willMoveOffscreen): Ditto.
     46        * rendering/RenderLayerCompositor.h:
     47        (RenderLayerCompositor):
     48
    1492012-10-25  Elliott Sprehn  <esprehn@chromium.org>
    250
  • trunk/Source/WebCore/page/FrameView.cpp

    r132398 r132504  
    932932void FrameView::didMoveOnscreen()
    933933{
    934 #if USE(ACCELERATED_COMPOSITING)
    935     if (TiledBacking* tiledBacking = this->tiledBacking())
    936         tiledBacking->setIsInWindow(true);
    937 #endif
    938 
    939934    if (RenderView* root = rootRenderer(this))
    940935        root->didMoveOnscreen();
     
    944939void FrameView::willMoveOffscreen()
    945940{
    946 #if USE(ACCELERATED_COMPOSITING)
    947     if (TiledBacking* tiledBacking = this->tiledBacking())
    948         tiledBacking->setIsInWindow(false);
    949 #endif
    950 
    951941    if (RenderView* root = rootRenderer(this))
    952942        root->willMoveOffscreen();
     
    25012491
    25022492#if USE(ACCELERATED_COMPOSITING)
    2503     if (TiledBacking* tiledBacking = this->tiledBacking()) {
    2504         if (page) {
    2505             if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) {
    2506                 bool shouldLimitTileCoverage = !canHaveScrollbars() || scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread();
    2507                 tiledBacking->setTileCoverage(shouldLimitTileCoverage ? TiledBacking::CoverageForVisibleArea : TiledBacking::CoverageForScrolling);
    2508             }
    2509         }
     2493    if (RenderView* root = rootRenderer(this)) {
     2494        if (root->usesCompositing())
     2495            root->compositor()->frameViewDidLayout();
    25102496    }
    25112497#endif
  • trunk/Source/WebCore/platform/graphics/TiledBacking.h

    r132301 r132504  
    4444        CoverageForVerticalScrolling = 1 << 0,
    4545        CoverageForHorizontalScrolling = 1 << 1,
     46        CoverageForSlowScrolling = 1 << 2, // Indicates that we expect to paint a lot on scrolling.
    4647        CoverageForScrolling = CoverageForVerticalScrolling | CoverageForHorizontalScrolling
    4748    };
  • trunk/Source/WebCore/platform/graphics/ca/mac/TileCache.mm

    r132427 r132504  
    335335IntSize TileCache::tileSizeForCoverageRect(const IntRect& coverageRect) const
    336336{
    337     if (m_tileCoverage == CoverageForVisibleArea)
     337    if (m_tileCoverage & CoverageForSlowScrolling)
    338338        return coverageRect.size();
    339339    return IntSize(defaultTileCacheWidth, defaultTileCacheHeight);
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r132270 r132504  
    108108#endif
    109109{
    110     if (renderer()->isRenderView()) {
     110    if (layer->isRootLayer()) {
    111111        Frame* frame = toRenderView(renderer())->frameView()->frame();
    112112        Page* page = frame ? frame->page() : 0;
     
    125125
    126126    if (m_usingTiledCacheLayer) {
     127        TiledBacking* tiledBacking = this->tiledBacking();
    127128        if (Page* page = renderer()->frame()->page()) {
    128             if (TiledBacking* tiledBacking = m_graphicsLayer->tiledBacking()) {
    129                 Frame* frame = renderer()->frame();
    130                 tiledBacking->setIsInWindow(page->isOnscreen());
    131                 if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator()) {
    132                     bool shouldLimitTileCoverage = !frame->view()->canHaveScrollbars() || scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread();
    133                     tiledBacking->setTileCoverage(shouldLimitTileCoverage ? TiledBacking::CoverageForVisibleArea : TiledBacking::CoverageForScrolling);
    134                 }
    135                 tiledBacking->setScrollingPerformanceLoggingEnabled(frame->settings() && frame->settings()->scrollingPerformanceLoggingEnabled());
    136             }
     129            Frame* frame = renderer()->frame();
     130            tiledBacking->setIsInWindow(page->isOnscreen());
     131            tiledBacking->setScrollingPerformanceLoggingEnabled(frame->settings() && frame->settings()->scrollingPerformanceLoggingEnabled());
     132            adjustTileCacheCoverage();
    137133        }
    138134    }
     
    175171{
    176172    return m_usingTiledCacheLayer && m_creatingPrimaryGraphicsLayer;
     173}
     174
     175TiledBacking* RenderLayerBacking::tiledBacking() const
     176{
     177    return m_graphicsLayer->tiledBacking();
     178}
     179
     180void RenderLayerBacking::adjustTileCacheCoverage()
     181{
     182    if (!m_usingTiledCacheLayer)
     183        return;
     184
     185    TiledBacking::TileCoverage tileCoverage = TiledBacking::CoverageForVisibleArea;
     186
     187    // FIXME: When we use TiledBacking for overflow, this should look at RenderView scrollability.
     188    Frame* frame = renderer()->frame();
     189    if (frame) {
     190        FrameView* frameView = frame->view();
     191        if (frameView->horizontalScrollbarMode() != ScrollbarAlwaysOff)
     192            tileCoverage |= TiledBacking::CoverageForHorizontalScrolling;
     193
     194        if (frameView->verticalScrollbarMode() != ScrollbarAlwaysOff)
     195            tileCoverage |= TiledBacking::CoverageForVerticalScrolling;
     196
     197        if (ScrollingCoordinator* scrollingCoordinator = frame->page()->scrollingCoordinator()) {
     198            if (scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread())
     199                tileCoverage |= TiledBacking::CoverageForSlowScrolling;
     200        }
     201    }
     202
     203    tiledBacking()->setTileCoverage(tileCoverage);
    177204}
    178205
  • trunk/Source/WebCore/rendering/RenderLayerBacking.h

    r131804 r132504  
    4040class KeyframeList;
    4141class RenderLayerCompositor;
     42class TiledBacking;
    4243
    4344enum CompositingLayerType {
     
    138139
    139140    bool usingTileCache() const { return m_usingTiledCacheLayer; }
    140 
     141    TiledBacking* tiledBacking() const;
     142    void adjustTileCacheCoverage();
     143   
    141144    // GraphicsLayerClient interface
    142145    virtual bool shouldUseTileCache(const GraphicsLayer*) const OVERRIDE;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r132301 r132504  
    11201120}
    11211121
     1122void RenderLayerCompositor::frameViewDidLayout()
     1123{
     1124    RenderLayerBacking* renderViewBacking = m_renderView->layer()->backing();
     1125    if (renderViewBacking)
     1126        renderViewBacking->adjustTileCacheCoverage();
     1127}
     1128
    11221129void RenderLayerCompositor::scrollingLayerDidChange(RenderLayer* layer)
    11231130{
     
    13511358}
    13521359
     1360TiledBacking* RenderLayerCompositor::pageTiledBacking() const
     1361{
     1362    RenderLayerBacking* renderViewBacking = m_renderView->layer()->backing();
     1363    return renderViewBacking ? renderViewBacking->tiledBacking() : 0;
     1364}
     1365
    13531366void RenderLayerCompositor::didMoveOnscreen()
    13541367{
     1368    if (TiledBacking* tiledBacking = pageTiledBacking())
     1369        tiledBacking->setIsInWindow(true);
     1370
    13551371    if (!inCompositingMode() || m_rootLayerAttachment != RootLayerUnattached)
    13561372        return;
     
    13621378void RenderLayerCompositor::willMoveOffscreen()
    13631379{
     1380    if (TiledBacking* tiledBacking = pageTiledBacking())
     1381        tiledBacking->setIsInWindow(false);
     1382
    13641383    if (!inCompositingMode() || m_rootLayerAttachment == RootLayerUnattached)
    13651384        return;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r132299 r132504  
    4343class RenderVideo;
    4444#endif
     45class TiledBacking;
    4546
    4647enum CompositingUpdateType {
     
    196197    void frameViewDidChangeSize();
    197198    void frameViewDidScroll();
     199    void frameViewDidLayout();
    198200
    199201    void scrollingLayerDidChange(RenderLayer*);
     
    294296   
    295297    Page* page() const;
     298    TiledBacking* pageTiledBacking() const;
    296299
    297300    GraphicsLayerFactory* graphicsLayerFactory() const;
Note: See TracChangeset for help on using the changeset viewer.