Changeset 191340 in webkit
- Timestamp:
- Oct 20, 2015 5:03:56 AM (8 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r191338 r191340 1 2015-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 1 66 2015-10-20 Sergio Villar Senin <svillar@igalia.com> 2 67 -
trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp
r191172 r191340 234 234 } 235 235 236 void PageClientImpl::willEnterAcceleratedCompositingMode() 237 { 238 webkitWebViewBaseWillEnterAcceleratedCompositingMode(WEBKIT_WEB_VIEW_BASE(m_viewWidget)); 239 } 240 236 241 void PageClientImpl::updateAcceleratedCompositingMode(const LayerTreeContext&) 237 242 { -
trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h
r191172 r191340 96 96 virtual void exitAcceleratedCompositingMode() override; 97 97 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override; 98 void willEnterAcceleratedCompositingMode() override; 98 99 99 100 virtual void handleDownloadRequest(DownloadProxy*) override; -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
r190987 r191340 190 190 #if USE(REDIRECTED_XCOMPOSITE_WINDOW) 191 191 std::unique_ptr<RedirectedXCompositeWindow> redirectedWindow; 192 GMainLoopSource clearRedirectedWindowSoon; 192 193 #endif 193 194 … … 1339 1340 } 1340 1341 1341 void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase) 1342 static 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 1352 void webkitWebViewBaseWillEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase) 1342 1353 { 1343 1354 #if USE(REDIRECTED_XCOMPOSITE_WINDOW) … … 1351 1362 priv->redirectedWindow->setDeviceScaleFactor(webkitWebViewBase->priv->pageProxy->deviceScaleFactor()); 1352 1363 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); 1355 1367 #else 1356 1368 UNUSED_PARAM(webkitWebViewBase); … … 1358 1370 } 1359 1371 1372 void 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 1360 1381 void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase) 1361 1382 { 1362 1383 #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); 1366 1388 #else 1367 1389 UNUSED_PARAM(webkitWebViewBase); -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h
r189094 r191340 71 71 void webkitWebViewBaseAddWebInspector(WebKitWebViewBase*, GtkWidget* inspector, WebKit::AttachmentSide); 72 72 void webkitWebViewBaseResetClickCounter(WebKitWebViewBase*); 73 void webkitWebViewBaseWillEnterAcceleratedCompositingMode(WebKitWebViewBase*); 73 74 void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase*); 74 75 void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase*); -
trunk/Source/WebKit2/UIProcess/CoordinatedGraphics/WebView.h
r191163 r191340 189 189 virtual void exitAcceleratedCompositingMode() override; 190 190 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override; 191 virtual void willEnterAcceleratedCompositingMode() override { } 191 192 192 193 #if ENABLE(FULLSCREEN_API) -
trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h
r185967 r191340 123 123 virtual void exitAcceleratedCompositingMode(uint64_t /* backingStoreStateID */, const UpdateInfo&) { } 124 124 virtual void updateAcceleratedCompositingMode(uint64_t /* backingStoreStateID */, const LayerTreeContext&) { } 125 virtual void willEnterAcceleratedCompositingMode(uint64_t /* backingStoreStateID */) { } 125 126 #if PLATFORM(COCOA) 126 127 virtual void didUpdateGeometry() { } -
trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in
r164172 r191340 27 27 ExitAcceleratedCompositingMode(uint64_t backingStoreStateID, WebKit::UpdateInfo updateInfo) 28 28 UpdateAcceleratedCompositingMode(uint64_t backingStoreStateID, WebKit::LayerTreeContext context) 29 WillEnterAcceleratedCompositingMode(uint64_t backingStoreStateID) 29 30 30 31 #if PLATFORM(COCOA) -
trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp
r190615 r191340 209 209 } 210 210 211 void 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 211 220 void DrawingAreaProxyImpl::incorporateUpdate(const UpdateInfo& updateInfo) 212 221 { -
trunk/Source/WebKit2/UIProcess/DrawingAreaProxyImpl.h
r190615 r191340 53 53 #endif 54 54 55 void forceResize() { sizeDidChange(); }56 57 55 private: 58 56 // DrawingAreaProxy … … 64 62 65 63 // 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; 71 70 72 71 void incorporateUpdate(const UpdateInfo&); -
trunk/Source/WebKit2/UIProcess/PageClient.h
r191309 r191340 241 241 virtual void exitAcceleratedCompositingMode() = 0; 242 242 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) = 0; 243 virtual void willEnterAcceleratedCompositingMode() = 0; 243 244 244 245 #if PLATFORM(MAC) -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r191323 r191340 5161 5161 } 5162 5162 5163 void WebPageProxy::willEnterAcceleratedCompositingMode() 5164 { 5165 m_pageClient.willEnterAcceleratedCompositingMode(); 5166 } 5167 5163 5168 void WebPageProxy::backForwardClear() 5164 5169 { -
trunk/Source/WebKit2/UIProcess/WebPageProxy.h
r191323 r191340 814 814 virtual void exitAcceleratedCompositingMode(); 815 815 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&); 816 816 void willEnterAcceleratedCompositingMode(); 817 817 818 enum UndoOrRedo { Undo, Redo }; 818 819 void addEditCommand(WebEditCommandProxy*); -
trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h
r191309 r191340 107 107 virtual void exitAcceleratedCompositingMode() override; 108 108 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override; 109 virtual void willEnterAcceleratedCompositingMode() override; 109 110 virtual void setAcceleratedCompositingRootLayer(LayerOrView *) override; 110 111 virtual LayerOrView *acceleratedCompositingRootLayer() const override; -
trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm
r191309 r191340 476 476 } 477 477 478 void PageClientImpl::willEnterAcceleratedCompositingMode() 479 { 480 } 481 478 482 void PageClientImpl::setAcceleratedCompositingRootLayer(LayerOrView *rootLayer) 479 483 { -
trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h
r191320 r191340 142 142 virtual void exitAcceleratedCompositingMode() override; 143 143 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&) override; 144 virtual void willEnterAcceleratedCompositingMode() override; 144 145 145 146 virtual PassRefPtr<ViewSnapshot> takeViewSnapshot() override; -
trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm
r191320 r191340 556 556 } 557 557 558 void PageClientImpl::willEnterAcceleratedCompositingMode() 559 { 560 } 561 558 562 void PageClientImpl::setAcceleratedCompositingRootLayer(CALayer *rootLayer) 559 563 { -
trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp
r190615 r191340 466 466 m_wantsToExitAcceleratedCompositingMode = false; 467 467 468 m_webPage.send(Messages::DrawingAreaProxy::WillEnterAcceleratedCompositingMode(m_backingStoreStateID)); 469 468 470 ASSERT(!m_layerTreeHost); 469 471
Note: See TracChangeset
for help on using the changeset viewer.