Changeset 202273 in webkit


Ignore:
Timestamp:
Jun 21, 2016 4:04:53 AM (8 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Web view is not redrawn when reparented in force compositing mode
https://bugs.webkit.org/show_bug.cgi?id=158689

Reviewed by Žan Doberšek.

When the web view is reparented in accelerated compositing mode, the UI process always exits the accelerated
mode when the view is unrealized, because the native surface handle for compositing is destroyed, but it doesn't
enter again when the view is realized and a new native surface handle for compositing is used. This happens
because the UI and Web processes are not in sync regarding whether the page is in accelerated compositing or
not. The Web process never exits accelerated mode when compositing mode is forced, but the UI process doesn't
check that setting at all.

  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(webkitWebViewBaseResizeRedirectedWindow): Helper function to ensure the redirected window size is properly updated.
(webkitWebViewBaseRealize): Resize the redirected window if the view is already in AC mode when realized.
(webkitWebViewRenderAcceleratedCompositingResults): Use webkitWebViewBaseResizeRedirectedWindow().
(webkitWebViewBaseSizeAllocate): Ditto.
(webkitWebViewBaseWillEnterAcceleratedCompositingMode): Ditto.

  • UIProcess/DrawingAreaProxyImpl.cpp:

(WebKit::DrawingAreaProxyImpl::alwaysUseCompositing): Return true in force compositing mode.
(WebKit::DrawingAreaProxyImpl::enterAcceleratedCompositingMode): Update assert.
(WebKit::DrawingAreaProxyImpl::exitAcceleratedCompositingMode): Do not exit AC mode compositing mode is always enabled.

  • UIProcess/DrawingAreaProxyImpl.h:

(WebKit::DrawingAreaProxyImpl::isInAcceleratedCompositingMode): Return true also in force compositing mode.

  • UIProcess/gtk/RedirectedXCompositeWindow.cpp:

(WebKit::RedirectedXCompositeWindow::surface): Ensure we never return an uninitialized surface to prevent
rendering artifacts in in force compositing mode when waiting for the first update on the redirected window.

Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r202263 r202273  
     12016-06-21  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Web view is not redrawn when reparented in force compositing mode
     4        https://bugs.webkit.org/show_bug.cgi?id=158689
     5
     6        Reviewed by Žan Doberšek.
     7
     8        When the web view is reparented in accelerated compositing mode, the UI process always exits the accelerated
     9        mode when the view is unrealized, because the native surface handle for compositing is destroyed, but it doesn't
     10        enter again when the view is realized and a new native surface handle for compositing is used. This happens
     11        because the UI and Web processes are not in sync regarding whether the page is in accelerated compositing or
     12        not. The Web process never exits accelerated mode when compositing mode is forced, but the UI process doesn't
     13        check that setting at all.
     14
     15        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     16        (webkitWebViewBaseResizeRedirectedWindow): Helper function to ensure the redirected window size is properly updated.
     17        (webkitWebViewBaseRealize): Resize the redirected window if the view is already in AC mode when realized.
     18        (webkitWebViewRenderAcceleratedCompositingResults): Use webkitWebViewBaseResizeRedirectedWindow().
     19        (webkitWebViewBaseSizeAllocate): Ditto.
     20        (webkitWebViewBaseWillEnterAcceleratedCompositingMode): Ditto.
     21        * UIProcess/DrawingAreaProxyImpl.cpp:
     22        (WebKit::DrawingAreaProxyImpl::alwaysUseCompositing): Return true in force compositing mode.
     23        (WebKit::DrawingAreaProxyImpl::enterAcceleratedCompositingMode): Update assert.
     24        (WebKit::DrawingAreaProxyImpl::exitAcceleratedCompositingMode): Do not exit AC mode compositing mode is always enabled.
     25        * UIProcess/DrawingAreaProxyImpl.h:
     26        (WebKit::DrawingAreaProxyImpl::isInAcceleratedCompositingMode): Return true also in force compositing mode.
     27        * UIProcess/gtk/RedirectedXCompositeWindow.cpp:
     28        (WebKit::RedirectedXCompositeWindow::surface): Ensure we never return an uninitialized surface to prevent
     29        rendering artifacts in in force compositing mode when waiting for the first update on the redirected window.
     30
    1312016-06-20  Commit Queue  <commit-queue@webkit.org>
    232
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r199811 r202273  
    355355}
    356356
     357#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
     358static void webkitWebViewBaseResizeRedirectedWindow(WebKitWebViewBase* webView)
     359{
     360    WebKitWebViewBasePrivate* priv = webView->priv;
     361    DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(priv->pageProxy->drawingArea());
     362    ASSERT(drawingArea);
     363    priv->redirectedWindow->setDeviceScaleFactor(priv->pageProxy->deviceScaleFactor());
     364    priv->redirectedWindow->resize(drawingArea->size());
     365}
     366#endif
     367
    357368static void webkitWebViewBaseRealize(GtkWidget* widget)
    358369{
     
    371382            });
    372383        if (priv->redirectedWindow) {
    373             if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(priv->pageProxy->drawingArea()))
     384            if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(priv->pageProxy->drawingArea())) {
    374385                drawingArea->setNativeSurfaceHandleForCompositing(priv->redirectedWindow->windowID());
     386                if (drawingArea->isInAcceleratedCompositingMode())
     387                    webkitWebViewBaseResizeRedirectedWindow(webView);
     388            }
    375389        }
    376390    }
     
    576590        return false;
    577591
    578     priv->redirectedWindow->setDeviceScaleFactor(webViewBase->priv->pageProxy->deviceScaleFactor());
    579     priv->redirectedWindow->resize(drawingArea->size());
    580 
     592    webkitWebViewBaseResizeRedirectedWindow(webViewBase);
    581593    if (cairo_surface_t* surface = priv->redirectedWindow->surface()) {
    582594        cairo_save(cr);
     
    692704#if USE(REDIRECTED_XCOMPOSITE_WINDOW)
    693705    if (priv->redirectedWindow && drawingArea->isInAcceleratedCompositingMode())
    694         priv->redirectedWindow->resize(viewRect.size());
     706        webkitWebViewBaseResizeRedirectedWindow(webViewBase);
    695707#endif
    696708
     
    15581570        return;
    15591571
    1560     priv->redirectedWindow->setDeviceScaleFactor(webkitWebViewBase->priv->pageProxy->deviceScaleFactor());
    1561     priv->redirectedWindow->resize(drawingArea->size());
     1572    webkitWebViewBaseResizeRedirectedWindow(webkitWebViewBase);
    15621573
    15631574    // Clear the redirected window if we don't enter AC mode in the end.
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp

    r198580 r202273  
    5959}
    6060
     61bool DrawingAreaProxyImpl::alwaysUseCompositing() const
     62{
     63    return m_webPageProxy.preferences().acceleratedCompositingEnabled() && m_webPageProxy.preferences().forceCompositingMode();
     64}
     65
    6166void DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context, const IntRect& rect, Region& unpaintedRegion)
    6267{
     
    296301void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
    297302{
    298     ASSERT(!isInAcceleratedCompositingMode());
     303    ASSERT(alwaysUseCompositing() || !isInAcceleratedCompositingMode());
    299304
    300305    m_backingStore = nullptr;
     
    330335    ASSERT(isInAcceleratedCompositingMode());
    331336
    332     m_layerTreeContext = LayerTreeContext();   
    333     m_webPageProxy.exitAcceleratedCompositingMode();
     337    m_layerTreeContext = LayerTreeContext();
     338    if (!alwaysUseCompositing())
     339        m_webPageProxy.exitAcceleratedCompositingMode();
    334340}
    335341
  • trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.h

    r197563 r202273  
    4545    void paint(BackingStore::PlatformGraphicsContext, const WebCore::IntRect&, WebCore::Region& unpaintedRegion);
    4646
    47     bool isInAcceleratedCompositingMode() const { return !m_layerTreeContext.isEmpty(); }
     47    bool isInAcceleratedCompositingMode() const { return alwaysUseCompositing() || !m_layerTreeContext.isEmpty(); }
    4848
    4949    bool hasReceivedFirstUpdate() const { return m_hasReceivedFirstUpdate; }
     
    8282    void exitAcceleratedCompositingMode();
    8383    void updateAcceleratedCompositingMode(const LayerTreeContext&);
     84    bool alwaysUseCompositing() const;
    8485
    8586    void discardBackingStoreSoon();
  • trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp

    r194496 r202273  
    264264    cairoSurfaceSetDeviceScale(newSurface.get(), m_deviceScale, m_deviceScale);
    265265
     266    RefPtr<cairo_t> cr = adoptRef(cairo_create(newSurface.get()));
     267    cairo_set_source_rgb(cr.get(), 1, 1, 1);
     268    cairo_paint(cr.get());
     269
    266270    // Nvidia drivers seem to prepare their redirected window pixmap asynchronously, so for a few fractions
    267271    // of a second after each resize, while doing continuous resizing (which constantly destroys and creates
     
    269273    // pixmap to the new one to properly initialize it.
    270274    if (m_surface) {
    271         RefPtr<cairo_t> cr = adoptRef(cairo_create(newSurface.get()));
    272         cairo_set_source_rgb(cr.get(), 1, 1, 1);
    273         cairo_paint(cr.get());
    274275        cairo_set_source_surface(cr.get(), m_surface.get(), 0, 0);
    275276        cairo_paint(cr.get());
Note: See TracChangeset for help on using the changeset viewer.