Changeset 191340 in webkit


Ignore:
Timestamp:
Oct 20, 2015 5:03:56 AM (8 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Graphics corruption when entering/leaving AC mode quickly
https://bugs.webkit.org/show_bug.cgi?id=150323

Reviewed by Mario Sanchez Prada.

The UI process is notified when entering accelerated compositing
mode after the layers have been flushed and rendered to avoid
flickering. However, this is producing flickering in the GTK+
port, because we use an offscreen redirected window that is
resized to a minimium size to save memory when not in AC mode. The
web process always uses the current size of the redirected window,
so when entering AC mode, contents are rendered into the 1x1
window, then the UI process is notified, the redirected window is
resized to its actual size, and we force a resize to ask the web
process to render again, now at the correct size. Rendering at 1x1
and then resizing the window is what produces the flickering when
entering AC mode, but it's also inefficient, since we need to
render again after the redirected window is resized. So, this
patch adds a WillEnterAcceleratedCompositing message that is sent
to the UI process when the layer tree host is created but before
the contents have been composited and rendered. This is
implemented by the GTK+ port to prepare for entering AC mode, by
resizing the redirected window. When we actually enter AC mode,
the contents have already been rendered in the web process at the
correct size, so we can just use the redirected window surface
instead of the drawing area one, and paint in the web view without
any flickering. We no longer need the forceResize either.
When leaving accelerated compositing mode, we now clear the redirected
window resources after a short delay. This ensures that we have
already rendered the update sent in the ExitAcceleratedCompositingMode
message, but also that entering/leaving AC mode quickly doesn't
produce any redirected window resize.

  • UIProcess/API/gtk/PageClientImpl.cpp:

(WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):

  • UIProcess/API/gtk/PageClientImpl.h:
  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseClearRedirectedWindowSoon):
(webkitWebViewBaseWillEnterAcceleratedCompositingMode):
(webkitWebViewBaseEnterAcceleratedCompositingMode):
(webkitWebViewBaseExitAcceleratedCompositingMode):

  • UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
  • UIProcess/CoordinatedGraphics/WebView.h:
  • UIProcess/DrawingAreaProxy.h:

(WebKit::DrawingAreaProxy::willEnterAcceleratedCompositingMode):

  • UIProcess/DrawingAreaProxy.messages.in:
  • UIProcess/DrawingAreaProxyImpl.cpp:

(WebKit::DrawingAreaProxyImpl::willEnterAcceleratedCompositingMode):

  • UIProcess/DrawingAreaProxyImpl.h:

(WebKit::DrawingAreaProxyImpl::forceResize): Deleted.

  • UIProcess/PageClient.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::willEnterAcceleratedCompositingMode):

  • UIProcess/WebPageProxy.h:
  • UIProcess/ios/PageClientImplIOS.h:
  • UIProcess/ios/PageClientImplIOS.mm:

(WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):

  • UIProcess/mac/PageClientImpl.h:
  • UIProcess/mac/PageClientImpl.mm:

(WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):

  • WebProcess/WebPage/DrawingAreaImpl.cpp:

(WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode):

Location:
trunk/Source/WebKit2
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r191338 r191340  
     12015-10-20  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Graphics corruption when entering/leaving AC mode quickly
     4        https://bugs.webkit.org/show_bug.cgi?id=150323
     5
     6        Reviewed by Mario Sanchez Prada.
     7
     8        The UI process is notified when entering accelerated compositing
     9        mode after the layers have been flushed and rendered to avoid
     10        flickering. However, this is producing flickering in the GTK+
     11        port, because we use an offscreen redirected window that is
     12        resized to a minimium size to save memory when not in AC mode. The
     13        web process always uses the current size of the redirected window,
     14        so when entering AC mode, contents are rendered into the 1x1
     15        window, then the UI process is notified, the redirected window is
     16        resized to its actual size, and we force a resize to ask the web
     17        process to render again, now at the correct size. Rendering at 1x1
     18        and then resizing the window is what produces the flickering when
     19        entering AC mode, but it's also inefficient, since we need to
     20        render again after the redirected window is resized. So, this
     21        patch adds a WillEnterAcceleratedCompositing message that is sent
     22        to the UI process when the layer tree host is created but before
     23        the contents have been composited and rendered. This is
     24        implemented by the GTK+ port to prepare for entering AC mode, by
     25        resizing the redirected window. When we actually enter AC mode,
     26        the contents have already been rendered in the web process at the
     27        correct size, so we can just use the redirected window surface
     28        instead of the drawing area one, and paint in the web view without
     29        any flickering. We no longer need the forceResize either.
     30        When leaving accelerated compositing mode, we now clear the redirected
     31        window resources after a short delay. This ensures that we have
     32        already rendered the update sent in the ExitAcceleratedCompositingMode
     33        message, but also that entering/leaving AC mode quickly doesn't
     34        produce any redirected window resize.
     35
     36        * UIProcess/API/gtk/PageClientImpl.cpp:
     37        (WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):
     38        * UIProcess/API/gtk/PageClientImpl.h:
     39        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     40        (webkitWebViewBaseClearRedirectedWindowSoon):
     41        (webkitWebViewBaseWillEnterAcceleratedCompositingMode):
     42        (webkitWebViewBaseEnterAcceleratedCompositingMode):
     43        (webkitWebViewBaseExitAcceleratedCompositingMode):
     44        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
     45        * UIProcess/CoordinatedGraphics/WebView.h:
     46        * UIProcess/DrawingAreaProxy.h:
     47        (WebKit::DrawingAreaProxy::willEnterAcceleratedCompositingMode):
     48        * UIProcess/DrawingAreaProxy.messages.in:
     49        * UIProcess/DrawingAreaProxyImpl.cpp:
     50        (WebKit::DrawingAreaProxyImpl::willEnterAcceleratedCompositingMode):
     51        * UIProcess/DrawingAreaProxyImpl.h:
     52        (WebKit::DrawingAreaProxyImpl::forceResize): Deleted.
     53        * UIProcess/PageClient.h:
     54        * UIProcess/WebPageProxy.cpp:
     55        (WebKit::WebPageProxy::willEnterAcceleratedCompositingMode):
     56        * UIProcess/WebPageProxy.h:
     57        * UIProcess/ios/PageClientImplIOS.h:
     58        * UIProcess/ios/PageClientImplIOS.mm:
     59        (WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):
     60        * UIProcess/mac/PageClientImpl.h:
     61        * UIProcess/mac/PageClientImpl.mm:
     62        (WebKit::PageClientImpl::willEnterAcceleratedCompositingMode):
     63        * WebProcess/WebPage/DrawingAreaImpl.cpp:
     64        (WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode):
     65
    1662015-10-20  Sergio Villar Senin  <svillar@igalia.com>
    267
  • trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp

    r191172 r191340  
    234234}
    235235
     236void PageClientImpl::willEnterAcceleratedCompositingMode()
     237{
     238    webkitWebViewBaseWillEnterAcceleratedCompositingMode(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
     239}
     240
    236241void PageClientImpl::updateAcceleratedCompositingMode(const LayerTreeContext&)
    237242{
  • trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h

    r191172 r191340  
    9696    virtual void exitAcceleratedCompositingMode() override;
    9797    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override;
     98    void willEnterAcceleratedCompositingMode() override;
    9899
    99100    virtual void handleDownloadRequest(DownloadProxy*) override;
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r190987 r191340  
    190190#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
    191191    std::unique_ptr<RedirectedXCompositeWindow> redirectedWindow;
     192    GMainLoopSource clearRedirectedWindowSoon;
    192193#endif
    193194
     
    13391340}
    13401341
    1341 void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
     1342static void webkitWebViewBaseClearRedirectedWindowSoon(WebKitWebViewBase* webkitWebViewBase)
     1343{
     1344    WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
     1345    static const std::chrono::seconds clearRedirectedWindowSoonDelay = 2_s;
     1346    priv->clearRedirectedWindowSoon.scheduleAfterDelay("[WebKit] Clear RedirectedWindow soon", [priv]() {
     1347        if (priv->redirectedWindow)
     1348            priv->redirectedWindow->resize(IntSize());
     1349    }, clearRedirectedWindowSoonDelay);
     1350}
     1351
     1352void webkitWebViewBaseWillEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
    13421353{
    13431354#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
     
    13511362    priv->redirectedWindow->setDeviceScaleFactor(webkitWebViewBase->priv->pageProxy->deviceScaleFactor());
    13521363    priv->redirectedWindow->resize(drawingArea->size());
    1353     // Force a resize to ensure the new redirected window size is used by the WebProcess.
    1354     drawingArea->forceResize();
     1364
     1365    // Clear the redirected window if we don't enter AC mode in the end.
     1366    webkitWebViewBaseClearRedirectedWindowSoon(webkitWebViewBase);
    13551367#else
    13561368    UNUSED_PARAM(webkitWebViewBase);
     
    13581370}
    13591371
     1372void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
     1373{
     1374#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
     1375    webkitWebViewBase->priv->clearRedirectedWindowSoon.cancel();
     1376#else
     1377    UNUSED_PARAM(webkitWebViewBase);
     1378#endif
     1379}
     1380
    13601381void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
    13611382{
    13621383#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
    1363     WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
    1364     if (priv->redirectedWindow)
    1365         priv->redirectedWindow->resize(IntSize());
     1384    // Resize the window later to ensure we have already rendered the
     1385    // non composited contents and avoid flickering. We can also avoid the
     1386    // window resize entirely if we switch back to AC mode quickly.
     1387    webkitWebViewBaseClearRedirectedWindowSoon(webkitWebViewBase);
    13661388#else
    13671389    UNUSED_PARAM(webkitWebViewBase);
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h

    r189094 r191340  
    7171void webkitWebViewBaseAddWebInspector(WebKitWebViewBase*, GtkWidget* inspector, WebKit::AttachmentSide);
    7272void webkitWebViewBaseResetClickCounter(WebKitWebViewBase*);
     73void webkitWebViewBaseWillEnterAcceleratedCompositingMode(WebKitWebViewBase*);
    7374void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase*);
    7475void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase*);
  • trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h

    r191163 r191340  
    189189    virtual void exitAcceleratedCompositingMode() override;
    190190    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override;
     191    virtual void willEnterAcceleratedCompositingMode() override { }
    191192
    192193#if ENABLE(FULLSCREEN_API)
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h

    r185967 r191340  
    123123    virtual void exitAcceleratedCompositingMode(uint64_t /* backingStoreStateID */, const UpdateInfo&) { }
    124124    virtual void updateAcceleratedCompositingMode(uint64_t /* backingStoreStateID */, const LayerTreeContext&) { }
     125    virtual void willEnterAcceleratedCompositingMode(uint64_t /* backingStoreStateID */) { }
    125126#if PLATFORM(COCOA)
    126127    virtual void didUpdateGeometry() { }
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in

    r164172 r191340  
    2727    ExitAcceleratedCompositingMode(uint64_t backingStoreStateID, WebKit::UpdateInfo updateInfo)
    2828    UpdateAcceleratedCompositingMode(uint64_t backingStoreStateID, WebKit::LayerTreeContext context)
     29    WillEnterAcceleratedCompositingMode(uint64_t backingStoreStateID)
    2930
    3031#if PLATFORM(COCOA)
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp

    r190615 r191340  
    209209}
    210210
     211void DrawingAreaProxyImpl::willEnterAcceleratedCompositingMode(uint64_t backingStoreStateID)
     212{
     213    ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID);
     214    if (backingStoreStateID < m_currentBackingStoreStateID)
     215        return;
     216
     217    m_webPageProxy.willEnterAcceleratedCompositingMode();
     218}
     219
    211220void DrawingAreaProxyImpl::incorporateUpdate(const UpdateInfo& updateInfo)
    212221{
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.h

    r190615 r191340  
    5353#endif
    5454
    55     void forceResize() { sizeDidChange(); }
    56 
    5755private:
    5856    // DrawingAreaProxy
     
    6462
    6563    // IPC message handlers
    66     virtual void update(uint64_t backingStoreStateID, const UpdateInfo&);
    67     virtual void didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo&, const LayerTreeContext&);
    68     virtual void enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&);
    69     virtual void exitAcceleratedCompositingMode(uint64_t backingStoreStateID, const UpdateInfo&);
    70     virtual void updateAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&);
     64    virtual void update(uint64_t backingStoreStateID, const UpdateInfo&) override;
     65    virtual void didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo&, const LayerTreeContext&) override;
     66    virtual void enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&) override;
     67    virtual void exitAcceleratedCompositingMode(uint64_t backingStoreStateID, const UpdateInfo&) override;
     68    virtual void updateAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext&) override;
     69    virtual void willEnterAcceleratedCompositingMode(uint64_t backingStoreStateID) override;
    7170
    7271    void incorporateUpdate(const UpdateInfo&);
  • trunk/Source/WebKit2/UIProcess/PageClient.h

    r191309 r191340  
    241241    virtual void exitAcceleratedCompositingMode() = 0;
    242242    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) = 0;
     243    virtual void willEnterAcceleratedCompositingMode() = 0;
    243244
    244245#if PLATFORM(MAC)
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r191323 r191340  
    51615161}
    51625162
     5163void WebPageProxy::willEnterAcceleratedCompositingMode()
     5164{
     5165    m_pageClient.willEnterAcceleratedCompositingMode();
     5166}
     5167
    51635168void WebPageProxy::backForwardClear()
    51645169{
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r191323 r191340  
    814814    virtual void exitAcceleratedCompositingMode();
    815815    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&);
    816    
     816    void willEnterAcceleratedCompositingMode();
     817
    817818    enum UndoOrRedo { Undo, Redo };
    818819    void addEditCommand(WebEditCommandProxy*);
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h

    r191309 r191340  
    107107    virtual void exitAcceleratedCompositingMode() override;
    108108    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override;
     109    virtual void willEnterAcceleratedCompositingMode() override;
    109110    virtual void setAcceleratedCompositingRootLayer(LayerOrView *) override;
    110111    virtual LayerOrView *acceleratedCompositingRootLayer() const override;
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm

    r191309 r191340  
    476476}
    477477
     478void PageClientImpl::willEnterAcceleratedCompositingMode()
     479{
     480}
     481
    478482void PageClientImpl::setAcceleratedCompositingRootLayer(LayerOrView *rootLayer)
    479483{
  • trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h

    r191320 r191340  
    142142    virtual void exitAcceleratedCompositingMode() override;
    143143    virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override;
     144    virtual void willEnterAcceleratedCompositingMode() override;
    144145
    145146    virtual PassRefPtr<ViewSnapshot> takeViewSnapshot() override;
  • trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm

    r191320 r191340  
    556556}
    557557
     558void PageClientImpl::willEnterAcceleratedCompositingMode()
     559{
     560}
     561
    558562void PageClientImpl::setAcceleratedCompositingRootLayer(CALayer *rootLayer)
    559563{
  • trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp

    r190615 r191340  
    466466    m_wantsToExitAcceleratedCompositingMode = false;
    467467
     468    m_webPage.send(Messages::DrawingAreaProxy::WillEnterAcceleratedCompositingMode(m_backingStoreStateID));
     469
    468470    ASSERT(!m_layerTreeHost);
    469471
Note: See TracChangeset for help on using the changeset viewer.