Changeset 224078 in webkit


Ignore:
Timestamp:
Oct 26, 2017 6:57:42 PM (7 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().

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

    r224073 r224078  
     12017-10-25  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-10-26  Myles C. Maxfield  <mmaxfield@apple.com>
    219
  • trunk/LayoutTests/compositing/iframes/page-cache-layer-tree.html

    r224032 r224078  
    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

    r224032 r224078  
    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

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

    r224075 r224078  
     12017-10-25  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        Secondly, GraphicsLayerCA::commitLayerChangesBeforeSublayers() needs to updateAcceleratesDrawing()
     18        before updating tiles, so that new tiles fetch the right acceleratesDrawing state from
     19        the TileController.
     20
     21        Test: compositing/accelerated-layers-after-back.html
     22
     23        * page/FrameView.cpp:
     24        (WebCore::FrameView::updateCompositingLayersAfterLayout):
     25        * platform/graphics/ca/GraphicsLayerCA.cpp:
     26        (WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers):
     27        * rendering/RenderLayerCompositor.cpp:
     28        (WebCore::RenderLayerCompositor::willRecalcStyle):
     29        (WebCore::RenderLayerCompositor::didRecalcStyleWithNoPendingLayout):
     30        (WebCore::RenderLayerCompositor::updateCompositingLayers):
     31        * rendering/RenderLayerCompositor.h:
     32
    1332017-10-26  Alex Christensen  <achristensen@webkit.org>
    234
  • trunk/Source/WebCore/page/FrameView.cpp

    r224045 r224078  
    893893        return;
    894894
    895     // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
    896     renderView->compositor().cacheAcceleratedCompositingFlags();
    897895    renderView->compositor().updateCompositingLayers(CompositingUpdateType::AfterLayout);
    898896}
  • trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp

    r224032 r224078  
    17541754        updateCoverage(commitState);
    17551755
     1756    if (m_uncommittedChanges & AcceleratesDrawingChanged) // Needs to happen before TilingAreaChanged.
     1757        updateAcceleratesDrawing();
     1758
    17561759    if (m_uncommittedChanges & TilingAreaChanged) // Needs to happen after CoverageRectChanged, ContentsScaleChanged
    17571760        updateTiles();
     
    17761779        updateContentsNeedsDisplay();
    17771780   
    1778     if (m_uncommittedChanges & AcceleratesDrawingChanged)
    1779         updateAcceleratesDrawing();
    1780 
    17811781    if (m_uncommittedChanges & SupportsSubpixelAntialiasedTextChanged)
    17821782        updateSupportsSubpixelAntialiasedText();
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r224032 r224078  
    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 forceCompositingMode = settings.forceCompositingMode() && hasAcceleratedCompositing;
     315    bool acceleratedDrawingEnabled = settings.acceleratedDrawingEnabled();
     316    bool displayListDrawingEnabled = settings.displayListDrawingEnabled();
    328317   
    329318    if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBorders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter || forceCompositingMode != m_forceCompositingMode)
     
    350339}
    351340
     341void RenderLayerCompositor::cacheAcceleratedCompositingFlagsAfterLayout()
     342{
     343    cacheAcceleratedCompositingFlags();
     344    if (isMainFrameCompositor() || !m_forceCompositingMode)
     345        return;
     346
     347    if (!requiresCompositingForScrollableFrame()) {
     348        m_forceCompositingMode = false;
     349        setCompositingLayersNeedRebuild();
     350    }
     351}
     352
    352353bool RenderLayerCompositor::canRender3DTransforms() const
    353354{
     
    364365{
    365366    m_layerNeedsCompositingUpdate = false;
     367    cacheAcceleratedCompositingFlags();
    366368}
    367369
     
    371373        return false;
    372374   
    373     cacheAcceleratedCompositingFlags();
    374375    return updateCompositingLayers(CompositingUpdateType::AfterStyleChange);
    375376}
     
    634635{
    635636    LOG_WITH_STREAM(Compositing, stream << "RenderLayerCompositor " << this << " updateCompositingLayers " << updateType << " root " << updateRoot);
     637
     638    if (updateType == CompositingUpdateType::AfterStyleChange || updateType == CompositingUpdateType::AfterLayout)
     639        cacheAcceleratedCompositingFlagsAfterLayout(); // Some flags (e.g. forceCompositingMode) depend on layout.
    636640
    637641    m_updateCompositingLayersTimer.stop();
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r224032 r224078  
    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

    r224077 r224078  
     12017-10-25  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-10-26  Sam Weinig  <sam@webkit.org>
    216
  • trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm

    r224032 r224078  
    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

    r224071 r224078  
     12017-10-25  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-10-26  Alex Christensen  <achristensen@webkit.org>
    224
  • trunk/Tools/DumpRenderTree/TestOptions.h

    r224032 r224078  
    3131struct TestOptions {
    3232    bool enableAttachmentElement { false };
     33    bool useAcceleratedDrawing { false };
    3334    bool enableIntersectionObserver { false };
    3435    bool enableModernMediaControls { true };
  • trunk/Tools/DumpRenderTree/TestOptions.mm

    r224032 r224078  
    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

    r224032 r224078  
    983983
    984984    preferences.attachmentElementEnabled = options.enableAttachmentElement;
     985    preferences.acceleratedDrawingEnabled = options.useAcceleratedDrawing;
    985986    preferences.intersectionObserverEnabled = options.enableIntersectionObserver;
    986987    preferences.modernMediaControlsEnabled = options.enableModernMediaControls;
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r224043 r224078  
    720720    WKPreferencesSetHiddenPageCSSAnimationSuspensionEnabled(preferences, false);
    721721
    722     WKPreferencesSetAcceleratedDrawingEnabled(preferences, m_shouldUseAcceleratedDrawing);
     722    WKPreferencesSetAcceleratedDrawingEnabled(preferences, m_shouldUseAcceleratedDrawing || options.useAcceleratedDrawing);
    723723    // FIXME: We should be testing the default.
    724724    WKPreferencesSetStorageBlockingPolicy(preferences, kWKAllowAllStorage);
     
    10221022        if (key == "useThreadedScrolling")
    10231023            testOptions.useThreadedScrolling = parseBooleanTestHeaderValue(value);
     1024        if (key == "useAcceleratedDrawing")
     1025            testOptions.useAcceleratedDrawing = parseBooleanTestHeaderValue(value);
    10241026        if (key == "useFlexibleViewport")
    10251027            testOptions.useFlexibleViewport = parseBooleanTestHeaderValue(value);
  • trunk/Tools/WebKitTestRunner/TestOptions.h

    r224032 r224078  
    3434struct TestOptions {
    3535    bool useThreadedScrolling { false };
     36    bool useAcceleratedDrawing { false };
    3637    bool useRemoteLayerTree { false };
    3738    bool shouldShowWebView { false };
     
    6667    {
    6768        if (useThreadedScrolling != options.useThreadedScrolling
     69            || useAcceleratedDrawing != options.useAcceleratedDrawing
    6870            || overrideLanguages != options.overrideLanguages
    6971            || useMockScrollbars != options.useMockScrollbars
Note: See TracChangeset for help on using the changeset viewer.