Changeset 224796 in webkit


Ignore:
Timestamp:
Nov 13, 2017 6:01:40 PM (6 years ago)
Author:
Simon Fraser
Message:

When navigating back to a page, compositing layers may not use accelerated drawing
https://bugs.webkit.org/show_bug.cgi?id=178749
rdar://problem/35158946

Reviewed by Dean Jackson.
Source/WebCore:

There were two issues with setting GraphicsLayerCA's "acceleratesDrawing" state which
occurred on back navigation, related to the ordering of style recalcs and layout.

First, at style recalc time, we created a RenderLayerCompositor but hadn't yet called
its cacheAcceleratedCompositingFlags(), so any layers created during style update
didn't get accelerated drawing. Fix by making cacheAcceleratedCompositingFlags() internal
to RenderLayerCompositor and calling it from willRecalcStyle() and updateCompositingLayers().

We have to be careful to avoid m_forceCompositingMode flip-flopping between cacheAcceleratedCompositingFlags()
and cacheAcceleratedCompositingFlagsAfterLayout(), since, for subframes, it depends on layout.

Secondly, GraphicsLayerCA::commitLayerChangesBeforeSublayers() needs to updateAcceleratesDrawing()
before updating tiles, so that new tiles fetch the right acceleratesDrawing state from
the TileController.

Test: compositing/accelerated-layers-after-back.html

  • page/FrameView.cpp:

(WebCore::FrameView::updateCompositingLayersAfterLayout):

  • platform/graphics/ca/GraphicsLayerCA.cpp:

(WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers):

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::willRecalcStyle):
(WebCore::RenderLayerCompositor::didRecalcStyleWithNoPendingLayout):
(WebCore::RenderLayerCompositor::updateCompositingLayers):

  • rendering/RenderLayerCompositor.h:

Source/WebKit:

Avoid assertions when a test enables accelerated drawing (which we can't support
in the iOS simulator).

  • Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:

(WebKit::RemoteLayerBackingStore::ensureBackingStore):

Tools:

Fix WTR and DRT to parse "useAcceleratedDrawing" out of "webkit-test-runner" options
and use it to set the state of the web view.

  • DumpRenderTree/TestOptions.h:
  • DumpRenderTree/TestOptions.mm:

(TestOptions::TestOptions):

  • DumpRenderTree/mac/DumpRenderTree.mm:

(setWebPreferencesForTestOptions):

  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::resetPreferencesToConsistentValues):
(WTR::updateTestOptionsFromTestHeader):

  • WebKitTestRunner/TestOptions.h:

(WTR::TestOptions::hasSameInitializationOptions const):

LayoutTests:

Moved iframes/resources/page-cache-helper.html up to compositing/resources/go-back.html.

  • compositing/accelerated-layers-after-back-expected.txt: Added.
  • compositing/accelerated-layers-after-back.html: Added.
  • compositing/iframes/page-cache-layer-tree.html:
  • compositing/page-cache-back-crash.html:
  • compositing/resources/go-back.html: Renamed from LayoutTests/compositing/iframes/resources/page-cache-helper.html.
  • platform/ios/compositing/accelerated-layers-after-back-expected.txt: Added.
Location:
trunk
Files:
3 added
17 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r224794 r224796  
     12017-11-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        When navigating back to a page, compositing layers may not use accelerated drawing
     4        https://bugs.webkit.org/show_bug.cgi?id=178749
     5        rdar://problem/35158946
     6
     7        Reviewed by Dean Jackson.
     8       
     9        Moved iframes/resources/page-cache-helper.html up to compositing/resources/go-back.html.
     10
     11        * compositing/accelerated-layers-after-back-expected.txt: Added.
     12        * compositing/accelerated-layers-after-back.html: Added.
     13        * compositing/iframes/page-cache-layer-tree.html:
     14        * compositing/page-cache-back-crash.html:
     15        * compositing/resources/go-back.html: Renamed from LayoutTests/compositing/iframes/resources/page-cache-helper.html.
     16        * platform/ios/compositing/accelerated-layers-after-back-expected.txt: Added.
     17
    1182017-11-13  Ryan Haddad  <ryanhaddad@apple.com>
    219
  • trunk/LayoutTests/compositing/iframes/page-cache-layer-tree.html

    r224198 r224796  
    7474    window.addEventListener("load", function(event) {
    7575        setTimeout(function() {
    76             window.location.href = "resources/page-cache-helper.html";
     76            window.location.href = "../resources/go-back.html";
    7777        }, 0);
    7878    }, false);
  • trunk/LayoutTests/compositing/page-cache-back-crash.html

    r224198 r224796  
    2020    setTimeout(function() {
    2121        // Navigate to a helper page that will immediately navigate back here after loading.
    22         window.location.href = "iframes/resources/page-cache-helper.html";
     22        window.location.href = "resources/go-back.html";
    2323    }, 0);
    2424});
  • trunk/LayoutTests/compositing/tiling/tiled-drawing-async-frame-scrolling.html

    r224198 r224796  
    1010            testRunner.dumpAsText();
    1111            testRunner.waitUntilDone();
    12         }
     12        }
    1313
    1414        function doTest()
  • trunk/Source/WebCore/ChangeLog

    r224792 r224796  
     12017-11-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        When navigating back to a page, compositing layers may not use accelerated drawing
     4        https://bugs.webkit.org/show_bug.cgi?id=178749
     5        rdar://problem/35158946
     6
     7        Reviewed by Dean Jackson.
     8
     9        There were two issues with setting GraphicsLayerCA's "acceleratesDrawing" state which
     10        occurred on back navigation, related to the ordering of style recalcs and layout.
     11
     12        First, at style recalc time, we created a RenderLayerCompositor but hadn't yet called
     13        its cacheAcceleratedCompositingFlags(), so any layers created during style update
     14        didn't get accelerated drawing. Fix by making cacheAcceleratedCompositingFlags() internal
     15        to RenderLayerCompositor and calling it from willRecalcStyle() and updateCompositingLayers().
     16
     17        We have to be careful to avoid m_forceCompositingMode flip-flopping between cacheAcceleratedCompositingFlags()
     18        and cacheAcceleratedCompositingFlagsAfterLayout(), since, for subframes, it depends on layout.
     19
     20        Secondly, GraphicsLayerCA::commitLayerChangesBeforeSublayers() needs to updateAcceleratesDrawing()
     21        before updating tiles, so that new tiles fetch the right acceleratesDrawing state from
     22        the TileController.
     23
     24        Test: compositing/accelerated-layers-after-back.html
     25
     26        * page/FrameView.cpp:
     27        (WebCore::FrameView::updateCompositingLayersAfterLayout):
     28        * platform/graphics/ca/GraphicsLayerCA.cpp:
     29        (WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers):
     30        * rendering/RenderLayerCompositor.cpp:
     31        (WebCore::RenderLayerCompositor::willRecalcStyle):
     32        (WebCore::RenderLayerCompositor::didRecalcStyleWithNoPendingLayout):
     33        (WebCore::RenderLayerCompositor::updateCompositingLayers):
     34        * rendering/RenderLayerCompositor.h:
     35
    1362017-11-13  Youenn Fablet  <youenn@apple.com>
    237
  • trunk/Source/WebCore/page/FrameView.cpp

    r224789 r224796  
    800800        return;
    801801
    802     // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
    803     renderView->compositor().cacheAcceleratedCompositingFlags();
    804802    renderView->compositor().updateCompositingLayers(CompositingUpdateType::AfterLayout);
    805803}
  • trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp

    r224510 r224796  
    17591759        updateCoverage(commitState);
    17601760
     1761    if (m_uncommittedChanges & AcceleratesDrawingChanged) // Needs to happen before TilingAreaChanged.
     1762        updateAcceleratesDrawing();
     1763
    17611764    if (m_uncommittedChanges & TilingAreaChanged) // Needs to happen after CoverageRectChanged, ContentsScaleChanged
    17621765        updateTiles();
     
    17811784        updateContentsNeedsDisplay();
    17821785   
    1783     if (m_uncommittedChanges & AcceleratesDrawingChanged)
    1784         updateAcceleratesDrawing();
    1785 
    17861786    if (m_uncommittedChanges & SupportsSubpixelAntialiasedTextChanged)
    17871787        updateSupportsSubpixelAntialiasedText();
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r224712 r224796  
    300300void RenderLayerCompositor::cacheAcceleratedCompositingFlags()
    301301{
    302     bool hasAcceleratedCompositing = false;
    303     bool showDebugBorders = false;
    304     bool showRepaintCounter = false;
    305     bool forceCompositingMode = false;
    306     bool acceleratedDrawingEnabled = false;
    307     bool displayListDrawingEnabled = false;
    308 
    309302    auto& settings = m_renderView.settings();
    310     hasAcceleratedCompositing = settings.acceleratedCompositingEnabled();
     303    bool hasAcceleratedCompositing = settings.acceleratedCompositingEnabled();
    311304
    312305    // We allow the chrome to override the settings, in case the page is rendered
     
    317310    }
    318311
    319     showDebugBorders = settings.showDebugBorders();
    320     showRepaintCounter = settings.showRepaintCounter();
    321     forceCompositingMode = settings.forceCompositingMode() && hasAcceleratedCompositing;
    322 
    323     if (forceCompositingMode && !isMainFrameCompositor())
    324         forceCompositingMode = requiresCompositingForScrollableFrame();
    325 
    326     acceleratedDrawingEnabled = settings.acceleratedDrawingEnabled();
    327     displayListDrawingEnabled = settings.displayListDrawingEnabled();
     312    bool showDebugBorders = settings.showDebugBorders();
     313    bool showRepaintCounter = settings.showRepaintCounter();
     314    bool acceleratedDrawingEnabled = settings.acceleratedDrawingEnabled();
     315    bool displayListDrawingEnabled = settings.displayListDrawingEnabled();
     316
     317    // forceCompositingMode for subframes can only be computed after layout.
     318    bool forceCompositingMode = m_forceCompositingMode;
     319    if (isMainFrameCompositor())
     320        forceCompositingMode = m_renderView.settings().forceCompositingMode() && hasAcceleratedCompositing;
    328321   
    329322    if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBorders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter || forceCompositingMode != m_forceCompositingMode)
     
    332325    bool debugBordersChanged = m_showDebugBorders != showDebugBorders;
    333326    m_hasAcceleratedCompositing = hasAcceleratedCompositing;
     327    m_forceCompositingMode = forceCompositingMode;
    334328    m_showDebugBorders = showDebugBorders;
    335329    m_showRepaintCounter = showRepaintCounter;
    336     m_forceCompositingMode = forceCompositingMode;
    337330    m_acceleratedDrawingEnabled = acceleratedDrawingEnabled;
    338331    m_displayListDrawingEnabled = displayListDrawingEnabled;
     
    350343}
    351344
     345void RenderLayerCompositor::cacheAcceleratedCompositingFlagsAfterLayout()
     346{
     347    cacheAcceleratedCompositingFlags();
     348
     349    if (isMainFrameCompositor())
     350        return;
     351
     352    bool forceCompositingMode = m_hasAcceleratedCompositing && m_renderView.settings().forceCompositingMode() && requiresCompositingForScrollableFrame();
     353    if (forceCompositingMode != m_forceCompositingMode) {
     354        m_forceCompositingMode = forceCompositingMode;
     355        setCompositingLayersNeedRebuild();
     356    }
     357}
     358
    352359bool RenderLayerCompositor::canRender3DTransforms() const
    353360{
     
    364371{
    365372    m_layerNeedsCompositingUpdate = false;
     373    cacheAcceleratedCompositingFlags();
    366374}
    367375
     
    371379        return false;
    372380   
    373     cacheAcceleratedCompositingFlags();
    374381    return updateCompositingLayers(CompositingUpdateType::AfterStyleChange);
    375382}
     
    631638{
    632639    LOG_WITH_STREAM(Compositing, stream << "RenderLayerCompositor " << this << " updateCompositingLayers " << updateType << " root " << updateRoot);
     640
     641    if (updateType == CompositingUpdateType::AfterStyleChange || updateType == CompositingUpdateType::AfterLayout)
     642        cacheAcceleratedCompositingFlagsAfterLayout(); // Some flags (e.g. forceCompositingMode) depend on layout.
    633643
    634644    m_updateCompositingLayersTimer.stop();
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r224712 r224796  
    111111    bool canRender3DTransforms() const;
    112112
    113     // Copy the accelerated compositing related flags from Settings
    114     void cacheAcceleratedCompositingFlags();
    115 
    116113    // Called when the layer hierarchy needs to be updated (compositing layers have been
    117114    // created, destroyed or re-parented).
     
    346343    // GraphicsLayerUpdaterClient implementation
    347344    void flushLayersSoon(GraphicsLayerUpdater&) override;
     345
     346    // Copy the accelerated compositing related flags from Settings
     347    void cacheAcceleratedCompositingFlags();
     348    void cacheAcceleratedCompositingFlagsAfterLayout();
    348349
    349350    // Whether the given RL needs a compositing layer.
  • trunk/Source/WebKit/ChangeLog

    r224792 r224796  
     12017-11-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        When navigating back to a page, compositing layers may not use accelerated drawing
     4        https://bugs.webkit.org/show_bug.cgi?id=178749
     5        rdar://problem/35158946
     6
     7        Reviewed by Dean Jackson.
     8
     9        Avoid assertions when a test enables accelerated drawing (which we can't support
     10        in the iOS simulator).
     11
     12        * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
     13        (WebKit::RemoteLayerBackingStore::ensureBackingStore):
     14
    1152017-11-13  Youenn Fablet  <youenn@apple.com>
    216
  • trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm

    r224198 r224796  
    7373void RemoteLayerBackingStore::ensureBackingStore(FloatSize size, float scale, bool acceleratesDrawing, bool deepColor, bool isOpaque)
    7474{
     75#if !USE(IOSURFACE)
     76    acceleratesDrawing = false;
     77#endif
    7578    if (m_size == size && m_scale == scale && m_deepColor == deepColor && m_acceleratesDrawing == acceleratesDrawing && m_isOpaque == isOpaque)
    7679        return;
  • trunk/Tools/ChangeLog

    r224795 r224796  
     12017-11-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        When navigating back to a page, compositing layers may not use accelerated drawing
     4        https://bugs.webkit.org/show_bug.cgi?id=178749
     5        rdar://problem/35158946
     6
     7        Reviewed by Dean Jackson.
     8
     9        Fix WTR and DRT to parse "useAcceleratedDrawing" out of "webkit-test-runner" options
     10        and use it to set the state of the web view.
     11
     12        * DumpRenderTree/TestOptions.h:
     13        * DumpRenderTree/TestOptions.mm:
     14        (TestOptions::TestOptions):
     15        * DumpRenderTree/mac/DumpRenderTree.mm:
     16        (setWebPreferencesForTestOptions):
     17        * WebKitTestRunner/TestController.cpp:
     18        (WTR::TestController::resetPreferencesToConsistentValues):
     19        (WTR::updateTestOptionsFromTestHeader):
     20        * WebKitTestRunner/TestOptions.h:
     21        (WTR::TestOptions::hasSameInitializationOptions const):
     22
    1232017-11-13  Basuke Suzuki  <Basuke.Suzuki@sony.com>
    224
  • trunk/Tools/DumpRenderTree/TestOptions.h

    r224457 r224796  
    3131struct TestOptions {
    3232    bool enableAttachmentElement { false };
     33    bool useAcceleratedDrawing { false };
    3334    bool enableIntersectionObserver { false };
    3435    bool enableMenuItemElement { false };
  • trunk/Tools/DumpRenderTree/TestOptions.mm

    r224457 r224796  
    8181        if (key == "enableAttachmentElement")
    8282            this->enableAttachmentElement = parseBooleanTestHeaderValue(value);
     83        if (key == "useAcceleratedDrawing")
     84            this->useAcceleratedDrawing = parseBooleanTestHeaderValue(value);
    8385        else if (key == "enableIntersectionObserver")
    8486            this->enableIntersectionObserver = parseBooleanTestHeaderValue(value);
  • trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm

    r224457 r224796  
    983983
    984984    preferences.attachmentElementEnabled = options.enableAttachmentElement;
     985    preferences.acceleratedDrawingEnabled = options.useAcceleratedDrawing;
    985986    preferences.intersectionObserverEnabled = options.enableIntersectionObserver;
    986987    preferences.menuItemElementEnabled = options.enableMenuItemElement;
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r224457 r224796  
    722722    WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled(preferences, false);
    723723
    724     WKPreferencesSetAcceleratedDrawingEnabled(preferences, m_shouldUseAcceleratedDrawing);
     724    WKPreferencesSetAcceleratedDrawingEnabled(preferences, m_shouldUseAcceleratedDrawing || options.useAcceleratedDrawing);
    725725    // FIXME: We should be testing the default.
    726726    WKPreferencesSetStorageBlockingPolicy(preferences, kWKAllowAllStorage);
     
    10261026        if (key == "useThreadedScrolling")
    10271027            testOptions.useThreadedScrolling = parseBooleanTestHeaderValue(value);
     1028        if (key == "useAcceleratedDrawing")
     1029            testOptions.useAcceleratedDrawing = parseBooleanTestHeaderValue(value);
    10281030        if (key == "useFlexibleViewport")
    10291031            testOptions.useFlexibleViewport = parseBooleanTestHeaderValue(value);
  • trunk/Tools/WebKitTestRunner/TestOptions.h

    r224457 r224796  
    3434struct TestOptions {
    3535    bool useThreadedScrolling { false };
     36    bool useAcceleratedDrawing { false };
    3637    bool useRemoteLayerTree { false };
    3738    bool shouldShowWebView { false };
     
    6768    {
    6869        if (useThreadedScrolling != options.useThreadedScrolling
     70            || useAcceleratedDrawing != options.useAcceleratedDrawing
    6971            || overrideLanguages != options.overrideLanguages
    7072            || useMockScrollbars != options.useMockScrollbars
Note: See TracChangeset for help on using the changeset viewer.