From b297e0fa5c217c9467033b7c8b46891a52870120 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 16 Oct 2012 14:56:46 +0200 Subject: Revert "Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)" This reverts commit 5466563f4b5b6b86523e3f89bb7f77e5b5270c78. Caused OOM issues on some CI machines :( --- .../UIProcess/API/gtk/WebKitWebViewBase.cpp | 50 ++++++++++++++++------ 1 file changed, 37 insertions(+), 13 deletions(-) (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp') 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 WebKitWebViewChildrenMap; -#if USE(TEXTURE_MAPPER_GL) -void redirectedWindowDamagedCallback(void* data); -#endif - struct _WebKitWebViewBasePrivate { WebKitWebViewChildrenMap children; OwnPtr pageClient; @@ -115,6 +111,7 @@ struct _WebKitWebViewBasePrivate { #if USE(TEXTURE_MAPPER_GL) OwnPtr 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(fastMalloc(sizeof(gpointer))); + g_object_add_weak_pointer(G_OBJECT(webViewBase), webViewBasePointer); + *webViewBasePointer = webViewBase; + g_timeout_add(1000 / 60, reinterpret_cast(queueAnotherDrawOfAcceleratedCompositingResults), webViewBasePointer); } #endif -- cgit v1.2.1