[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
simon.fraser at apple.com
simon.fraser at apple.com
Wed Dec 22 11:23:41 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 675a76fed1c0229d4822f864a2a7872b79986251
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Jul 21 17:51:25 2010 +0000
2010-07-21 Simon Fraser <simon.fraser at apple.com>
Reviewed by Anders Carlsson.
Get accelerated compositing working with webkit2
https://bugs.webkit.org/show_bug.cgi?id=41084
Hook up dynamic DrawingArea switching, so that when the WebProcess hits a page
that requires accelerated compositing, we switch to the LayerBackedDrawingArea.
* Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:
(DrawingAreaProxyMessage::):
* Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
(WebPageProxyMessage::):
* UIProcess/API/mac/PageClientImpl.h:
* UIProcess/API/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::pageDidEnterAcceleratedCompositing):
(WebKit::PageClientImpl::pageDidLeaveAcceleratedCompositing):
* UIProcess/API/mac/WKView.mm:
(-[WKView _startAcceleratedCompositing:]):
(-[WKView _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::]):
(-[WKView _pageDidEnterAcceleratedCompositing]):
(-[WKView _pageDidLeaveAcceleratedCompositing]):
* UIProcess/API/mac/WKViewInternal.h:
* UIProcess/ChunkedUpdateDrawingAreaProxy.cpp:
(WebKit::ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage):
* UIProcess/ChunkedUpdateDrawingAreaProxy.h:
* UIProcess/DrawingAreaProxy.h:
(WebKit::DrawingAreaProxy::):
(WebKit::DrawingAreaProxy::type):
* UIProcess/LayerBackedDrawingAreaProxy.cpp:
(WebKit::LayerBackedDrawingAreaProxy::didSetSize):
(WebKit::LayerBackedDrawingAreaProxy::didReceiveMessage):
(WebKit::LayerBackedDrawingAreaProxy::didReceiveSyncMessage):
* UIProcess/LayerBackedDrawingAreaProxy.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setDrawingArea):
(WebKit::WebPageProxy::didReceiveSyncMessage):
(WebKit::WebPageProxy::didEnterAcceleratedCompositing):
(WebKit::WebPageProxy::didLeaveAcceleratedCompositing):
* UIProcess/WebPageProxy.h:
* UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm:
(WebKit::LayerBackedDrawingAreaProxy::attachCompositingContext):
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::attachRootGraphicsLayer):
* WebProcess/WebPage/ChunkedUpdateDrawingArea.h:
(WebKit::ChunkedUpdateDrawingArea::attachCompositingContext):
(WebKit::ChunkedUpdateDrawingArea::setRootCompositingLayer):
* WebProcess/WebPage/DrawingArea.cpp:
(WebKit::DrawingArea::create):
* WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::):
(WebKit::DrawingArea::type):
* WebProcess/WebPage/LayerBackedDrawingArea.cpp:
(WebKit::LayerBackedDrawingArea::LayerBackedDrawingArea):
(WebKit::LayerBackedDrawingArea::setNeedsDisplay):
(WebKit::LayerBackedDrawingArea::setSize):
(WebKit::LayerBackedDrawingArea::didUpdate):
(WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
* WebProcess/WebPage/LayerBackedDrawingArea.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::changeAcceleratedCompositingMode):
(WebKit::WebPage::enterAcceleratedCompositingMode):
(WebKit::WebPage::exitAcceleratedCompositingMode):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
(WebKit::LayerBackedDrawingArea::platformInit):
(WebKit::LayerBackedDrawingArea::attachCompositingContext):
(WebKit::LayerBackedDrawingArea::detachCompositingContext):
(WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63843 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index ce01314..d8e7d9b 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,75 @@
+2010-07-21 Simon Fraser <simon.fraser at apple.com>
+
+ Reviewed by Anders Carlsson.
+
+ Get accelerated compositing working with webkit2
+ https://bugs.webkit.org/show_bug.cgi?id=41084
+
+ Hook up dynamic DrawingArea switching, so that when the WebProcess hits a page
+ that requires accelerated compositing, we switch to the LayerBackedDrawingArea.
+
+ * Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:
+ (DrawingAreaProxyMessage::):
+ * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
+ (WebPageProxyMessage::):
+ * UIProcess/API/mac/PageClientImpl.h:
+ * UIProcess/API/mac/PageClientImpl.mm:
+ (WebKit::PageClientImpl::pageDidEnterAcceleratedCompositing):
+ (WebKit::PageClientImpl::pageDidLeaveAcceleratedCompositing):
+ * UIProcess/API/mac/WKView.mm:
+ (-[WKView _startAcceleratedCompositing:]):
+ (-[WKView _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::]):
+ (-[WKView _pageDidEnterAcceleratedCompositing]):
+ (-[WKView _pageDidLeaveAcceleratedCompositing]):
+ * UIProcess/API/mac/WKViewInternal.h:
+ * UIProcess/ChunkedUpdateDrawingAreaProxy.cpp:
+ (WebKit::ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage):
+ * UIProcess/ChunkedUpdateDrawingAreaProxy.h:
+ * UIProcess/DrawingAreaProxy.h:
+ (WebKit::DrawingAreaProxy::):
+ (WebKit::DrawingAreaProxy::type):
+ * UIProcess/LayerBackedDrawingAreaProxy.cpp:
+ (WebKit::LayerBackedDrawingAreaProxy::didSetSize):
+ (WebKit::LayerBackedDrawingAreaProxy::didReceiveMessage):
+ (WebKit::LayerBackedDrawingAreaProxy::didReceiveSyncMessage):
+ * UIProcess/LayerBackedDrawingAreaProxy.h:
+ * UIProcess/PageClient.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::setDrawingArea):
+ (WebKit::WebPageProxy::didReceiveSyncMessage):
+ (WebKit::WebPageProxy::didEnterAcceleratedCompositing):
+ (WebKit::WebPageProxy::didLeaveAcceleratedCompositing):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm:
+ (WebKit::LayerBackedDrawingAreaProxy::attachCompositingContext):
+ * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+ (WebKit::WebChromeClient::attachRootGraphicsLayer):
+ * WebProcess/WebPage/ChunkedUpdateDrawingArea.h:
+ (WebKit::ChunkedUpdateDrawingArea::attachCompositingContext):
+ (WebKit::ChunkedUpdateDrawingArea::setRootCompositingLayer):
+ * WebProcess/WebPage/DrawingArea.cpp:
+ (WebKit::DrawingArea::create):
+ * WebProcess/WebPage/DrawingArea.h:
+ (WebKit::DrawingArea::):
+ (WebKit::DrawingArea::type):
+ * WebProcess/WebPage/LayerBackedDrawingArea.cpp:
+ (WebKit::LayerBackedDrawingArea::LayerBackedDrawingArea):
+ (WebKit::LayerBackedDrawingArea::setNeedsDisplay):
+ (WebKit::LayerBackedDrawingArea::setSize):
+ (WebKit::LayerBackedDrawingArea::didUpdate):
+ (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
+ * WebProcess/WebPage/LayerBackedDrawingArea.h:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::changeAcceleratedCompositingMode):
+ (WebKit::WebPage::enterAcceleratedCompositingMode):
+ (WebKit::WebPage::exitAcceleratedCompositingMode):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
+ (WebKit::LayerBackedDrawingArea::platformInit):
+ (WebKit::LayerBackedDrawingArea::attachCompositingContext):
+ (WebKit::LayerBackedDrawingArea::detachCompositingContext):
+ (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
+
2010-07-20 Steve Falkenburg <sfalken at apple.com>
Reviewed by Adam Roben.
diff --git a/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
index eb17043..8b29ed1 100644
--- a/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
@@ -37,7 +37,6 @@ enum Kind {
DidSetSize,
#if USE(ACCELERATED_COMPOSITING)
AttachCompositingContext,
- DetachCompositingContext,
#endif
};
diff --git a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
index 2c95624..8aced4d 100644
--- a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
@@ -73,6 +73,10 @@ enum Kind {
BackForwardItemAtIndex,
BackForwardBackListCount,
BackForwardForwardListCount,
+
+#if USE(ACCELERATED_COMPOSITING)
+ DidChangeAcceleratedCompositing,
+#endif
};
}
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.h b/WebKit2/UIProcess/API/mac/PageClientImpl.h
index 65ba0df..910a0e8 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.h
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.h
@@ -48,6 +48,11 @@ private:
virtual void toolTipChanged(const WebCore::String& oldToolTip, const WebCore::String& newToolTip);
virtual void setCursor(const WebCore::Cursor&);
+#if USE(ACCELERATED_COMPOSITING)
+ void pageDidEnterAcceleratedCompositing();
+ void pageDidLeaveAcceleratedCompositing();
+#endif
+
WKView* m_wkView;
};
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.mm b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
index 24cb721..7664a04 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.mm
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
@@ -75,4 +75,16 @@ void PageClientImpl::setCursor(const WebCore::Cursor& cursor)
[m_wkView _setCursor:cursor.platformCursor()];
}
+#if USE(ACCELERATED_COMPOSITING)
+void PageClientImpl::pageDidEnterAcceleratedCompositing()
+{
+ [m_wkView _pageDidEnterAcceleratedCompositing];
+}
+
+void PageClientImpl::pageDidLeaveAcceleratedCompositing()
+{
+ [m_wkView _pageDidLeaveAcceleratedCompositing];
+}
+#endif // USE(ACCELERATED_COMPOSITING)
+
} // namespace WebKit
diff --git a/WebKit2/UIProcess/API/mac/WKView.mm b/WebKit2/UIProcess/API/mac/WKView.mm
index 2b7740b..642d67e 100644
--- a/WebKit2/UIProcess/API/mac/WKView.mm
+++ b/WebKit2/UIProcess/API/mac/WKView.mm
@@ -465,6 +465,10 @@ static bool isViewVisible(NSView *view)
// Make a container layer, which will get sized/positioned by AppKit and CA.
CALayer *viewLayer = [CALayer layer];
+#ifndef NDEBUG
+ [viewLayer setName:@"hosting layer"];
+#endif
+
#if defined(BUILDING_ON_LEOPARD)
// Turn off default animations.
NSNull *nullValue = [NSNull null];
@@ -505,6 +509,43 @@ static bool isViewVisible(NSView *view)
_data->_layerHostingView = nil;
}
}
+
+- (void)_switchToDrawingAreaTypeIfNecessary:(DrawingAreaProxy::Type)type
+{
+ DrawingAreaProxy::Type existingDrawingAreaType = _data->_page->drawingArea() ? _data->_page->drawingArea()->type() : DrawingAreaProxy::None;
+ if (existingDrawingAreaType == type)
+ return;
+
+ OwnPtr<DrawingAreaProxy> newDrawingArea;
+ switch (type) {
+ case DrawingAreaProxy::None:
+ break;
+ case DrawingAreaProxy::ChunkedUpdateDrawingAreaType: {
+ newDrawingArea = new ChunkedUpdateDrawingAreaProxy(self);
+ break;
+ }
+ case DrawingAreaProxy::LayerBackedDrawingAreaType: {
+ newDrawingArea = new LayerBackedDrawingAreaProxy(self);
+ break;
+ }
+ }
+
+ newDrawingArea->setSize(IntSize([self frame].size));
+
+ _data->_page->drawingArea()->detachCompositingContext();
+ _data->_page->setDrawingArea(newDrawingArea.release());
+}
+
+- (void)_pageDidEnterAcceleratedCompositing
+{
+ [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::LayerBackedDrawingAreaType];
+}
+
+- (void)_pageDidLeaveAcceleratedCompositing
+{
+ // FIXME: we may want to avoid flipping back to the non-layer-backed drawing area until the next page load, to avoid thrashing.
+ [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::ChunkedUpdateDrawingAreaType];
+}
#endif // USE(ACCELERATED_COMPOSITING)
@end
diff --git a/WebKit2/UIProcess/API/mac/WKViewInternal.h b/WebKit2/UIProcess/API/mac/WKViewInternal.h
index 1e882af..3172788 100644
--- a/WebKit2/UIProcess/API/mac/WKViewInternal.h
+++ b/WebKit2/UIProcess/API/mac/WKViewInternal.h
@@ -35,5 +35,7 @@
#if USE(ACCELERATED_COMPOSITING)
- (void)_startAcceleratedCompositing:(CALayer *)rootLayer;
- (void)_stopAcceleratedCompositing;
+- (void)_pageDidEnterAcceleratedCompositing;
+- (void)_pageDidLeaveAcceleratedCompositing;
#endif
@end
diff --git a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
index 5a0145f..1ed6e2b 100644
--- a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
+++ b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
@@ -168,4 +168,9 @@ void ChunkedUpdateDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, Core
}
}
+void ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&)
+{
+ ASSERT_NOT_REACHED();
+}
+
} // namespace WebKit
diff --git a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
index 58ccaca..af8aafa 100644
--- a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
+++ b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
@@ -71,6 +71,7 @@ private:
// DrawingAreaProxy
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&);
+ virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&);
virtual void paint(const WebCore::IntRect&, PlatformDrawingContext);
virtual void setSize(const WebCore::IntSize&);
virtual void setPageIsVisible(bool isVisible);
diff --git a/WebKit2/UIProcess/DrawingAreaProxy.h b/WebKit2/UIProcess/DrawingAreaProxy.h
index 1bd7da3..3817eb1 100644
--- a/WebKit2/UIProcess/DrawingAreaProxy.h
+++ b/WebKit2/UIProcess/DrawingAreaProxy.h
@@ -55,7 +55,9 @@ typedef QPainter* PlatformDrawingContext;
class DrawingAreaProxy {
public:
+ // This has to match DrawingArea::Type.
enum Type {
+ None,
ChunkedUpdateDrawingAreaType,
#if USE(ACCELERATED_COMPOSITING)
LayerBackedDrawingAreaType,
@@ -64,7 +66,10 @@ public:
virtual ~DrawingAreaProxy();
+ Type type() const { return m_type; }
+
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&) = 0;
+ virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&) = 0;
virtual void paint(const WebCore::IntRect&, PlatformDrawingContext) = 0;
virtual void setSize(const WebCore::IntSize&) = 0;
diff --git a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
index fb87f39..abd0b2b 100644
--- a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
+++ b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
@@ -107,6 +107,9 @@ void LayerBackedDrawingAreaProxy::setPageIsVisible(bool isVisible)
void LayerBackedDrawingAreaProxy::didSetSize()
{
m_isWaitingForDidSetFrameNotification = false;
+
+ WebPageProxy* page = this->page();
+ page->process()->responsivenessTimer()->stop();
}
void LayerBackedDrawingAreaProxy::update()
@@ -126,6 +129,14 @@ void LayerBackedDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIP
didSetSize();
break;
}
+ default:
+ ASSERT_NOT_REACHED();
+ }
+}
+
+void LayerBackedDrawingAreaProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder&)
+{
+ switch (messageID.get<DrawingAreaProxyMessage::Kind>()) {
#if USE(ACCELERATED_COMPOSITING)
case DrawingAreaProxyMessage::AttachCompositingContext: {
uint32_t contextID;
@@ -134,10 +145,6 @@ void LayerBackedDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIP
attachCompositingContext(contextID);
break;
}
- case DrawingAreaProxyMessage::DetachCompositingContext: {
- detachCompositingContext();
- break;
- }
#endif
default:
ASSERT_NOT_REACHED();
diff --git a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
index c5fe67a..80f3cab 100644
--- a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
+++ b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
@@ -69,6 +69,8 @@ private:
// DrawingAreaProxy
virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&);
+ virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&);
+
virtual void paint(const WebCore::IntRect&, PlatformDrawingContext);
virtual void setSize(const WebCore::IntSize&);
virtual void setPageIsVisible(bool isVisible);
diff --git a/WebKit2/UIProcess/PageClient.h b/WebKit2/UIProcess/PageClient.h
index 0dbd20e..fc4bbcf 100644
--- a/WebKit2/UIProcess/PageClient.h
+++ b/WebKit2/UIProcess/PageClient.h
@@ -44,6 +44,11 @@ public:
virtual void toolTipChanged(const WebCore::String&, const WebCore::String&) = 0;
virtual void setCursor(const WebCore::Cursor&) = 0;
+
+#if USE(ACCELERATED_COMPOSITING)
+ virtual void pageDidEnterAcceleratedCompositing() = 0;
+ virtual void pageDidLeaveAcceleratedCompositing() = 0;
+#endif
};
} // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index e49e76e..010f993 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -104,6 +104,14 @@ void WebPageProxy::setPageClient(PageClient* pageClient)
#endif
}
+void WebPageProxy::setDrawingArea(PassOwnPtr<DrawingAreaProxy> drawingArea)
+{
+ if (drawingArea == m_drawingArea)
+ return;
+
+ m_drawingArea = drawingArea;
+}
+
void WebPageProxy::initializeLoaderClient(WKPageLoaderClient* loadClient)
{
m_loaderClient.initialize(loadClient);
@@ -616,8 +624,13 @@ void WebPageProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::M
}
}
-void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder& reply)
+void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder& reply)
{
+ if (messageID.is<CoreIPC::MessageClassDrawingAreaProxy>()) {
+ m_drawingArea->didReceiveSyncMessage(connection, messageID, arguments, reply);
+ return;
+ }
+
switch (messageID.get<WebPageProxyMessage::Kind>()) {
case WebPageProxyMessage::CreateNewPage: {
WebPageProxy* newPage = createNewPage();
@@ -667,6 +680,17 @@ void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageI
reply.encode(CoreIPC::In(forwardListCount));
break;
}
+#if USE(ACCELERATED_COMPOSITING)
+ case WebPageProxyMessage::DidChangeAcceleratedCompositing: {
+ bool compositing;
+ if (!arguments.decode(CoreIPC::Out(compositing)))
+ return;
+
+ didChangeAcceleratedCompositing(compositing);
+ reply.encode(CoreIPC::In(static_cast<uint32_t>(drawingArea()->type())));
+ break;
+ }
+#endif // USE(ACCELERATED_COMPOSITING)
default:
ASSERT_NOT_REACHED();
@@ -905,6 +929,16 @@ void WebPageProxy::didGetRenderTreeExternalRepresentation(const String& resultSt
callback->performCallbackWithReturnValue(resultString.impl());
}
+#if USE(ACCELERATED_COMPOSITING)
+void WebPageProxy::didChangeAcceleratedCompositing(bool compositing)
+{
+ if (compositing)
+ didEnterAcceleratedCompositing();
+ else
+ didLeaveAcceleratedCompositing();
+}
+#endif
+
void WebPageProxy::processDidBecomeUnresponsive()
{
m_loaderClient.didBecomeUnresponsive(this);
@@ -957,4 +991,16 @@ void WebPageProxy::processDidRevive()
m_pageClient->processDidRevive();
}
+#if USE(ACCELERATED_COMPOSITING)
+void WebPageProxy::didEnterAcceleratedCompositing()
+{
+ m_pageClient->pageDidEnterAcceleratedCompositing();
+}
+
+void WebPageProxy::didLeaveAcceleratedCompositing()
+{
+ m_pageClient->pageDidLeaveAcceleratedCompositing();
+}
+#endif // USE(ACCELERATED_COMPOSITING)
+
} // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 454d2ac..0bfdef0 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -84,6 +84,7 @@ public:
WebFrameProxy* mainFrame() const { return m_mainFrame.get(); }
DrawingAreaProxy* drawingArea() { return m_drawingArea.get(); }
+ void setDrawingArea(PassOwnPtr<DrawingAreaProxy>);
WebBackForwardList* backForwardList() { return m_backForwardList.get(); }
@@ -142,6 +143,11 @@ public:
void processDidExit();
void processDidRevive();
+#if USE(ACCELERATED_COMPOSITING)
+ void didEnterAcceleratedCompositing();
+ void didLeaveAcceleratedCompositing();
+#endif
+
WebProcessProxy* process() const;
WebPageNamespace* pageNamespace() const { return m_pageNamespace.get(); }
@@ -198,6 +204,9 @@ private:
void didRunJavaScriptInMainFrame(const WebCore::String&, uint64_t);
void didGetRenderTreeExternalRepresentation(const WebCore::String&, uint64_t);
+#if USE(ACCELERATED_COMPOSITING)
+ void didChangeAcceleratedCompositing(bool compositing);
+#endif
#if PLATFORM(WIN)
PageClient* m_pageClient;
diff --git a/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm b/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
index 9b039bc..7f70de1 100644
--- a/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
+++ b/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
@@ -71,8 +71,13 @@ void LayerBackedDrawingAreaProxy::attachCompositingContext(uint32_t contextID)
[m_compositingRootLayer.get() setAnchorPoint:CGPointZero];
[m_compositingRootLayer.get() setBounds:CGRectMake(0, 0, m_viewSize.width(), m_viewSize.height())];
- // This is required to anchor the layer at the top, to avoid jiggle during window resize.
- [m_compositingRootLayer.get() setGeometryFlipped:YES];
+ // FIXME: this fixes the layer jiggle when resizing the window, but breaks layer flipping because
+ // CA doesn't propagate the kCALayerFlagFlippedAbove through the remote layer.
+ // [m_compositingRootLayer.get() setGeometryFlipped:YES];
+
+#ifndef NDEBUG
+ [m_compositingRootLayer.get() setName:@"Compositing root layer"];
+#endif
[m_webView _startAcceleratedCompositing:m_compositingRootLayer.get()];
#endif
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index 8328a6a..0816de9 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -449,9 +449,9 @@ PassOwnPtr<HTMLParserQuirks> WebChromeClient::createHTMLParserQuirks()
void WebChromeClient::attachRootGraphicsLayer(Frame*, GraphicsLayer* layer)
{
if (layer)
- m_page->drawingArea()->attachCompositingContext(layer);
+ m_page->enterAcceleratedCompositingMode(layer);
else
- m_page->drawingArea()->detachCompositingContext();
+ m_page->exitAcceleratedCompositingMode();
}
void WebChromeClient::setNeedsOneShotDrawingSynchronization()
diff --git a/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h b/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
index 9b2e33c..a5bafc2 100644
--- a/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
@@ -47,8 +47,9 @@ public:
virtual void display();
#if USE(ACCELERATED_COMPOSITING)
- virtual void attachCompositingContext(WebCore::GraphicsLayer*) { }
+ virtual void attachCompositingContext() { }
virtual void detachCompositingContext() { }
+ virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) { }
virtual void scheduleCompositingLayerSync() { }
virtual void syncCompositingLayers() { }
#endif
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.cpp b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
index c553964..9be6b4f 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.cpp
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
@@ -37,6 +37,9 @@ DrawingArea* DrawingArea::create(Type type, WebPage* webPage)
{
DrawingArea* drawingArea = 0;
switch (type) {
+ case None:
+ ASSERT_NOT_REACHED();
+ break;
case ChunkedUpdateDrawingAreaType:
drawingArea = new ChunkedUpdateDrawingArea(webPage);
break;
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.h b/WebKit2/WebProcess/WebPage/DrawingArea.h
index 9494249..cd46188 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.h
@@ -48,7 +48,9 @@ class WebPage;
class DrawingArea {
public:
+ // This has to match DrawingAreaProxy::Type.
enum Type {
+ None,
ChunkedUpdateDrawingAreaType,
#if USE(ACCELERATED_COMPOSITING)
LayerBackedDrawingAreaType,
@@ -59,6 +61,8 @@ public:
static DrawingArea* create(Type, WebPage*);
virtual ~DrawingArea();
+ Type type() const { return m_type; }
+
virtual void invalidateWindow(const WebCore::IntRect& rect, bool immediate) = 0;
virtual void invalidateContentsAndWindow(const WebCore::IntRect& rect, bool immediate) = 0;
virtual void invalidateContentsForSlowScroll(const WebCore::IntRect& rect, bool immediate) = 0;
@@ -68,8 +72,9 @@ public:
virtual void display() = 0;
#if USE(ACCELERATED_COMPOSITING)
- virtual void attachCompositingContext(WebCore::GraphicsLayer*) = 0;
+ virtual void attachCompositingContext() = 0;
virtual void detachCompositingContext() = 0;
+ virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0;
virtual void scheduleCompositingLayerSync() = 0;
virtual void syncCompositingLayers() = 0;
#endif
diff --git a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
index df3dff9..f3fcdda 100644
--- a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
+++ b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
@@ -54,6 +54,7 @@ LayerBackedDrawingArea::LayerBackedDrawingArea(WebPage* webPage)
m_backingLayer->setName("DrawingArea backing layer");
#endif
m_backingLayer->syncCompositingStateForThisLayerOnly();
+ m_backingLayer->setContentsOrientation(GraphicsLayer::CompositingCoordinatesBottomUp);
platformInit();
}
@@ -86,11 +87,6 @@ void LayerBackedDrawingArea::scroll(const IntSize& scrollDelta, const IntRect& r
void LayerBackedDrawingArea::setNeedsDisplay(const IntRect& rect)
{
-#if PLATFORM(MAC) && HAVE(HOSTED_CORE_ANIMATION)
- if (!m_remoteLayerRef)
- attachCompositingContext(0);
-#endif
-
m_backingLayer->setNeedsDisplayInRect(rect);
m_backingLayer->syncCompositingStateForThisLayerOnly();
@@ -122,7 +118,7 @@ void LayerBackedDrawingArea::setSize(const IntSize& viewSize)
// Layout if necessary.
m_webPage->layoutIfNeeded();
- WebProcess::shared().connection()->send(DrawingAreaProxyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In(0));
+ WebProcess::shared().connection()->send(DrawingAreaProxyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In());
}
void LayerBackedDrawingArea::suspendPainting()
@@ -144,7 +140,6 @@ void LayerBackedDrawingArea::resumePainting()
void LayerBackedDrawingArea::didUpdate()
{
-
// Display if needed.
display();
}
@@ -206,6 +201,12 @@ void LayerBackedDrawingArea::detachCompositingContext()
{
}
+#if !PLATFORM(MAC)
+void LayerBackedDrawingArea::setRootCompositingLayer(WebCore::GraphicsLayer*)
+{
+}
+#endif
+
void LayerBackedDrawingArea::scheduleCompositingLayerSync()
{
}
diff --git a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
index 381f5f1..b446741 100644
--- a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
@@ -63,8 +63,9 @@ public:
virtual void setNeedsDisplay(const WebCore::IntRect&);
virtual void display();
- virtual void attachCompositingContext(WebCore::GraphicsLayer*);
+ virtual void attachCompositingContext();
virtual void detachCompositingContext();
+ virtual void setRootCompositingLayer(WebCore::GraphicsLayer*);
virtual void scheduleCompositingLayerSync();
virtual void syncCompositingLayers();
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index 3e26fc3..c1c402e 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -138,6 +138,41 @@ String WebPage::renderTreeExternalRepresentation() const
return externalRepresentation(m_mainFrame->coreFrame(), RenderAsTextBehaviorNormal);
}
+#if USE(ACCELERATED_COMPOSITING)
+void WebPage::changeAcceleratedCompositingMode(WebCore::GraphicsLayer* layer)
+{
+ bool compositing = layer;
+
+ // Tell the UI process that accelerated compositing changed. It may respond by changing
+ // drawing area types.
+ uint32_t newDrawingAreaType;
+ WebProcess::shared().connection()->sendSync(WebPageProxyMessage::DidChangeAcceleratedCompositing,
+ m_pageID, CoreIPC::In(compositing),
+ CoreIPC::Out(newDrawingAreaType),
+ CoreIPC::Connection::NoTimeout);
+
+ DrawingArea::Type newType = static_cast<DrawingArea::Type>(newDrawingAreaType);
+ if (newType != drawingArea()->type()) {
+ m_drawingArea = DrawingArea::create(newType, this);
+ m_drawingArea->setNeedsDisplay(IntRect(IntPoint(0, 0), m_viewSize));
+ }
+}
+
+void WebPage::enterAcceleratedCompositingMode(GraphicsLayer* layer)
+{
+ changeAcceleratedCompositingMode(layer);
+
+#if USE(ACCELERATED_COMPOSITING)
+ m_drawingArea->setRootCompositingLayer(layer);
+#endif
+}
+
+void WebPage::exitAcceleratedCompositingMode()
+{
+ changeAcceleratedCompositingMode(0);
+}
+#endif
+
WebFrame* WebPage::webFrame(uint64_t frameID) const
{
return m_frameMap.get(frameID);
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index cafef39..a8df1e5 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -100,6 +100,12 @@ public:
WebFrame* mainFrame() const { return m_mainFrame.get(); }
WebCore::String renderTreeExternalRepresentation() const;
+#if USE(ACCELERATED_COMPOSITING)
+ void changeAcceleratedCompositingMode(WebCore::GraphicsLayer*);
+ void enterAcceleratedCompositingMode(WebCore::GraphicsLayer*);
+ void exitAcceleratedCompositingMode();
+#endif
+
private:
WebPage(uint64_t pageID, const WebCore::IntSize& viewSize, const WebPreferencesStore&, DrawingArea::Type);
diff --git a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
index 72088c6..ca99377 100644
--- a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
+++ b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
@@ -42,6 +42,10 @@ namespace WebKit {
void LayerBackedDrawingArea::platformInit()
{
+#if HAVE(HOSTED_CORE_ANIMATION)
+ attachCompositingContext();
+#endif
+
setUpUpdateLayoutRunLoopObserver();
}
@@ -58,18 +62,12 @@ void LayerBackedDrawingArea::platformClear()
#endif
}
-void LayerBackedDrawingArea::attachCompositingContext(GraphicsLayer* layer)
+void LayerBackedDrawingArea::attachCompositingContext()
{
- m_backingLayer->removeAllChildren();
- if (layer)
- m_backingLayer->addChild(layer);
-
- m_backingLayer->syncCompositingState(); // FIXME: hack
-
- m_backingLayer->setDebugBorder(Color(0, 0, 255, 0.6), 4);
-
if (m_attached)
return;
+
+ m_backingLayer->syncCompositingStateForThisLayerOnly();
m_attached = true;
@@ -79,14 +77,22 @@ void LayerBackedDrawingArea::attachCompositingContext(GraphicsLayer* layer)
WKCARemoteLayerClientSetLayer(m_remoteLayerRef.get(), m_backingLayer->platformLayer());
uint32_t contextID = WKCARemoteLayerClientGetClientId(m_remoteLayerRef.get());
- WebProcess::shared().connection()->send(DrawingAreaProxyMessage::AttachCompositingContext, m_webPage->pageID(), CoreIPC::In(contextID));
+ WebProcess::shared().connection()->sendSync(DrawingAreaProxyMessage::AttachCompositingContext, m_webPage->pageID(), CoreIPC::In(contextID), CoreIPC::Out(), CoreIPC::Connection::NoTimeout);
#endif
}
void LayerBackedDrawingArea::detachCompositingContext()
{
m_backingLayer->removeAllChildren();
- m_backingLayer->syncCompositingState(); // FIXME: hack
+ m_backingLayer->syncCompositingStateForThisLayerOnly();
+}
+
+void LayerBackedDrawingArea::setRootCompositingLayer(WebCore::GraphicsLayer* layer)
+{
+ m_backingLayer->removeAllChildren();
+ if (layer)
+ m_backingLayer->addChild(layer);
+ m_backingLayer->syncCompositingStateForThisLayerOnly();
}
void LayerBackedDrawingArea::scheduleCompositingLayerSync()
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list