Changeset 223984 in webkit


Ignore:
Timestamp:
Oct 25, 2017 2:32:08 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().

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
16 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r223982 r223984  
     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-25  Alex Christensen  <achristensen@webkit.org>
    219
  • trunk/LayoutTests/compositing/iframes/page-cache-layer-tree.html

    r130689 r223984  
    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

    r210142 r223984  
    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/Source/WebCore/ChangeLog

    r223981 r223984  
     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-25  Youenn Fablet  <youenn@apple.com>
    234
  • trunk/Source/WebCore/page/FrameView.cpp

    r223853 r223984  
    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

    r222898 r223984  
    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

    r223749 r223984  
    363363void RenderLayerCompositor::willRecalcStyle()
    364364{
     365    cacheAcceleratedCompositingFlags();
    365366    m_layerNeedsCompositingUpdate = false;
    366367}
     
    371372        return false;
    372373   
    373     cacheAcceleratedCompositingFlags();
    374374    return updateCompositingLayers(CompositingUpdateType::AfterStyleChange);
    375375}
     
    634634{
    635635    LOG_WITH_STREAM(Compositing, stream << "RenderLayerCompositor " << this << " updateCompositingLayers " << updateType << " root " << updateRoot);
     636
     637    if (updateType == CompositingUpdateType::AfterLayout)
     638        cacheAcceleratedCompositingFlags(); // Some flags (e.g. forceCompositingMode) depend on layout.
    636639
    637640    m_updateCompositingLayersTimer.stop();
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r223749 r223984  
    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).
     
    361358    void clearBackingForLayerIncludingDescendants(RenderLayer&);
    362359
    363     // Repaint this and its child layers.
     360    void cacheAcceleratedCompositingFlags();
     361
     362    // Repaint the given layer and its descendants.
    364363    void recursiveRepaintLayer(RenderLayer&);
    365364
  • trunk/Source/WebKit/ChangeLog

    r223981 r223984  
     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-25  Youenn Fablet  <youenn@apple.com>
    216
  • trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm

    r221554 r223984  
    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

    r223956 r223984  
     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-25  Robin Morisset  <rmorisset@apple.com>
    224
  • trunk/Tools/DumpRenderTree/TestOptions.h

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

    r223929 r223984  
    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

    r223929 r223984  
    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

    r223929 r223984  
    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);
     
    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

    r223929 r223984  
    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.