diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-16 14:56:46 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-16 14:57:30 +0200 |
commit | b297e0fa5c217c9467033b7c8b46891a52870120 (patch) | |
tree | 43fc14689295e9e64f2719d05aad94e3049f6cd7 /Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp | |
parent | 69d517dbfa69903d8593cc1737f0474b21e3251e (diff) | |
download | qtwebkit-b297e0fa5c217c9467033b7c8b46891a52870120.tar.gz |
Revert "Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)"
This reverts commit 5466563f4b5b6b86523e3f89bb7f77e5b5270c78.
Caused OOM issues on some CI machines :(
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp index e5bac671e..b42b2ee8f 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp @@ -75,10 +75,6 @@ using namespace WebCore; typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap; -#if USE(TEXTURE_MAPPER_GL) -void redirectedWindowDamagedCallback(void* data); -#endif - struct _WebKitWebViewBasePrivate { WebKitWebViewChildrenMap children; OwnPtr<PageClientImpl> pageClient; @@ -115,6 +111,7 @@ struct _WebKitWebViewBasePrivate { #if USE(TEXTURE_MAPPER_GL) OwnPtr<RedirectedXCompositeWindow> redirectedWindow; + bool readyToRenderAcceleratedCompositingResults; #endif }; @@ -303,7 +300,7 @@ static void webkitWebViewBaseContainerForall(GtkContainer* container, gboolean i WebKitWebViewChildrenMap children = priv->children; WebKitWebViewChildrenMap::const_iterator end = children.end(); for (WebKitWebViewChildrenMap::const_iterator current = children.begin(); current != end; ++current) - (*callback)(current->key, callbackData); + (*callback)(current->first, callbackData); if (includeInternals && priv->inspectorView) (*callback)(priv->inspectorView, callbackData); @@ -354,8 +351,7 @@ static void webkit_web_view_base_init(WebKitWebViewBase* webkitWebViewBase) #if USE(TEXTURE_MAPPER_GL) priv->redirectedWindow = RedirectedXCompositeWindow::create(IntSize(1, 1)); - if (priv->redirectedWindow) - priv->redirectedWindow->setDamageNotifyCallback(redirectedWindowDamagedCallback, webkitWebViewBase); + priv->readyToRenderAcceleratedCompositingResults = false; #endif } @@ -368,9 +364,10 @@ static bool webkitWebViewRenderAcceleratedCompositingResults(WebKitWebViewBase* // To avoid flashes when initializing accelerated compositing for the first // time, we wait until we know there's a frame ready before rendering. WebKitWebViewBasePrivate* priv = webViewBase->priv; - if (!priv->redirectedWindow) + if (!priv->readyToRenderAcceleratedCompositingResults) return false; + ASSERT(priv->redirectedWindow); cairo_rectangle(cr, clipRect->x, clipRect->y, clipRect->width, clipRect->height); cairo_surface_t* surface = priv->redirectedWindow->cairoSurfaceForWidget(GTK_WIDGET(webViewBase)); cairo_set_source_surface(cr, surface, 0, 0); @@ -433,7 +430,7 @@ static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase } #if USE(TEXTURE_MAPPER_GL) - if (sizeChanged && webViewBase->priv->redirectedWindow) + if (sizeChanged) webViewBase->priv->redirectedWindow->resize(viewRect.size()); #endif @@ -804,8 +801,7 @@ void webkitWebViewBaseCreateWebPage(WebKitWebViewBase* webkitWebViewBase, WebCon #endif #if USE(TEXTURE_MAPPER_GL) - if (priv->redirectedWindow) - priv->pageProxy->setAcceleratedCompositingWindowId(priv->redirectedWindow->windowId()); + priv->pageProxy->setAcceleratedCompositingWindowId(priv->redirectedWindow->windowId()); #endif } @@ -932,9 +928,37 @@ GdkEvent* webkitWebViewBaseTakeContextMenuEvent(WebKitWebViewBase* webkitWebView } #if USE(TEXTURE_MAPPER_GL) -void redirectedWindowDamagedCallback(void* data) +static gboolean queueAnotherDrawOfAcceleratedCompositingResults(gpointer* webViewBasePointer) { - gtk_widget_queue_draw(GTK_WIDGET(data)); + // The WebViewBase may have been destroyed in the time since we queued this + // draw and the time we are actually executing. + if (!*webViewBasePointer) { + fastFree(webViewBasePointer); + return FALSE; + } + + WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(*webViewBasePointer); + gtk_widget_queue_draw(GTK_WIDGET(webViewBase)); + webViewBase->priv->readyToRenderAcceleratedCompositingResults = true; + + g_object_remove_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer); + fastFree(webViewBasePointer); + + return FALSE; +} + +void webkitWebViewBaseQueueDrawOfAcceleratedCompositingResults(WebKitWebViewBase* webViewBase) +{ + gtk_widget_queue_draw(GTK_WIDGET(webViewBase)); + + // Redraw again, one frame later, as it might take some time for the new GL frame to be available. + // This prevents the display from always being one frame behind in the case GL hasn't yet finished + // rendering to the window. + // TODO: Add XDamage support to RedirectedXCompositeWindow to accomplish this. + gpointer* webViewBasePointer = static_cast<gpointer*>(fastMalloc(sizeof(gpointer))); + g_object_add_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer); + *webViewBasePointer = webViewBase; + g_timeout_add(1000 / 60, reinterpret_cast<GSourceFunc>(queueAnotherDrawOfAcceleratedCompositingResults), webViewBasePointer); } #endif |