2011-02-03 Anders Carlsson <andersca@apple.com>
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Feb 2011 23:38:42 +0000 (23:38 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 3 Feb 2011 23:38:42 +0000 (23:38 +0000)
        Reviewed by Dan Bernstein.

        Change DidSetSize to take a LayerTreeContext parameter
        https://bugs.webkit.org/show_bug.cgi?id=53724

        Since SetSize can cause layout to happen, we need to pass along a layer tree context to
        the DidSetSize message so the UI process can enter/exit accelerated compositing mode appropriately.

        * Shared/LayerTreeContext.h:
        * Shared/mac/LayerTreeContextMac.mm:
        Add equality operators to LayerTreeContext.

        * UIProcess/DrawingAreaProxy.h:
        (WebKit::DrawingAreaProxy::didSetSize):
        This now takes a LayerTreeContext parameter.

        * UIProcess/DrawingAreaProxy.messages.in:
        Add LayerTreeContext parameter.

        * UIProcess/DrawingAreaProxyImpl.cpp:
        Get rid of m_isInAcceleratedCompositingMode and use the current layer context instead.

        (WebKit::DrawingAreaProxyImpl::paint):
        Bail if the call to DidSetSize ended up entering accelerated compositing mode.

        (WebKit::DrawingAreaProxyImpl::didSetSize):
        If the new layer tree context is different, enter/exit accelerated compositing mode accordingly.

        (WebKit::DrawingAreaProxyImpl::enterAcceleratedCompositingMode):
        (WebKit::DrawingAreaProxyImpl::exitAcceleratedCompositingMode):
        Update the layer tree context.

        * UIProcess/DrawingAreaProxyImpl.h:
        (WebKit::DrawingAreaProxyImpl::isInAcceleratedCompositingMode):
        Add simple getter.

        * WebProcess/WebPage/DrawingAreaImpl.cpp:
        (WebKit::DrawingAreaImpl::setSize):
        Pass along the layer tree context.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@77546 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/LayerTreeContext.h
Source/WebKit2/Shared/mac/LayerTreeContextMac.mm
Source/WebKit2/UIProcess/DrawingAreaProxy.h
Source/WebKit2/UIProcess/DrawingAreaProxy.messages.in
Source/WebKit2/UIProcess/DrawingAreaProxyImpl.cpp
Source/WebKit2/UIProcess/DrawingAreaProxyImpl.h
Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp

index aa4a54d..9667347 100644 (file)
@@ -2,6 +2,48 @@
 
         Reviewed by Dan Bernstein.
 
+        Change DidSetSize to take a LayerTreeContext parameter
+        https://bugs.webkit.org/show_bug.cgi?id=53724
+
+        Since SetSize can cause layout to happen, we need to pass along a layer tree context to 
+        the DidSetSize message so the UI process can enter/exit accelerated compositing mode appropriately.
+        
+        * Shared/LayerTreeContext.h:
+        * Shared/mac/LayerTreeContextMac.mm:
+        Add equality operators to LayerTreeContext.
+
+        * UIProcess/DrawingAreaProxy.h:
+        (WebKit::DrawingAreaProxy::didSetSize):
+        This now takes a LayerTreeContext parameter.
+        
+        * UIProcess/DrawingAreaProxy.messages.in:
+        Add LayerTreeContext parameter.
+
+        * UIProcess/DrawingAreaProxyImpl.cpp:
+        Get rid of m_isInAcceleratedCompositingMode and use the current layer context instead.
+
+        (WebKit::DrawingAreaProxyImpl::paint):
+        Bail if the call to DidSetSize ended up entering accelerated compositing mode.
+
+        (WebKit::DrawingAreaProxyImpl::didSetSize):
+        If the new layer tree context is different, enter/exit accelerated compositing mode accordingly.
+
+        (WebKit::DrawingAreaProxyImpl::enterAcceleratedCompositingMode):
+        (WebKit::DrawingAreaProxyImpl::exitAcceleratedCompositingMode):
+        Update the layer tree context.
+
+        * UIProcess/DrawingAreaProxyImpl.h:
+        (WebKit::DrawingAreaProxyImpl::isInAcceleratedCompositingMode):
+        Add simple getter.
+
+        * WebProcess/WebPage/DrawingAreaImpl.cpp:
+        (WebKit::DrawingAreaImpl::setSize):
+        Pass along the layer tree context.
+
+2011-02-03  Anders Carlsson  <andersca@apple.com>
+
+        Reviewed by Dan Bernstein.
+
         Get rid of LayerTreeContext::seed on Mac.
         Add sequence checks to enterAcceleratedCompositingMode and exitAcceleratedCompositingMode and
         have them call newly added overloads that don't have the checks.
index dab04f3..e2938aa 100644 (file)
@@ -50,6 +50,13 @@ public:
 #endif
 };
 
+bool operator==(const LayerTreeContext&, const LayerTreeContext&);
+
+inline bool operator!=(const LayerTreeContext& a, const LayerTreeContext& b)
+{
+    return !(a == b);
+}
+
 };
 
 #endif // USE(ACCELERATED_COMPOSITING)
index f503908..e4ad1ce 100644 (file)
@@ -58,4 +58,9 @@ bool LayerTreeContext::isEmpty() const
     return !contextID;
 }
 
+bool operator==(const LayerTreeContext& a, const LayerTreeContext& b)
+{
+    return a.contextID == b.contextID;
+}
+
 } // namespace WebKit
index 1639668..0e3b555 100644 (file)
@@ -97,7 +97,7 @@ private:
     // CoreIPC message handlers.
     // FIXME: These should be pure virtual.
     virtual void update(uint64_t sequenceNumber, const UpdateInfo&) { }
-    virtual void didSetSize(uint64_t sequenceNumber, const UpdateInfo&) { }
+    virtual void didSetSize(uint64_t sequenceNumber, const UpdateInfo&, const LayerTreeContext&) { }
 #if USE(ACCELERATED_COMPOSITING)
     virtual void enterAcceleratedCompositingMode(uint64_t sequenceNumber, const LayerTreeContext&) { }
     virtual void exitAcceleratedCompositingMode(uint64_t sequenceNumber) { }
index 4e1402f..3fa3686 100644 (file)
@@ -22,7 +22,7 @@
 
 messages -> DrawingAreaProxy {
     Update(uint64_t sequenceNumber, WebKit::UpdateInfo updateInfo)
-    DidSetSize(uint64_t sequenceNumber, WebKit::UpdateInfo updateInfo)
+    DidSetSize(uint64_t sequenceNumber, WebKit::UpdateInfo updateInfo, WebKit::LayerTreeContext context)
 
 #if USE(ACCELERATED_COMPOSITING)
     EnterAcceleratedCompositingMode(uint64_t sequenceNumber, WebKit::LayerTreeContext context)
index dae5c73..f13681e 100644 (file)
@@ -50,7 +50,6 @@ PassOwnPtr<DrawingAreaProxyImpl> DrawingAreaProxyImpl::create(WebPageProxy* webP
 DrawingAreaProxyImpl::DrawingAreaProxyImpl(WebPageProxy* webPageProxy)
     : DrawingAreaProxy(DrawingAreaInfo::Impl, webPageProxy)
     , m_isWaitingForDidSetSize(false)
-    , m_isInAcceleratedCompositingMode(false)
     , m_lastDidSetSizeSequenceNumber(0)
 {
 }
@@ -66,7 +65,7 @@ void DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context,
     if (!m_backingStore)
         return;
 
-    ASSERT(!m_isInAcceleratedCompositingMode);
+    ASSERT(!isInAcceleratedCompositingMode());
 
     if (m_isWaitingForDidSetSize) {
         if (!m_webPageProxy->isValid())
@@ -79,6 +78,10 @@ void DrawingAreaProxyImpl::paint(BackingStore::PlatformGraphicsContext context,
         m_webPageProxy->process()->connection()->waitForAndDispatchImmediately<Messages::DrawingAreaProxy::DidSetSize>(m_webPageProxy->pageID(), didSetSizeTimeout);
     }
 
+    // Dispatching DidSetSize could change the compositing mode, return if that happens.
+    if (isInAcceleratedCompositingMode())
+        return;
+
     m_backingStore->paint(context, rect);
     unpaintedRegion.subtract(IntRect(IntPoint(), m_backingStore->size()));
 }
@@ -141,7 +144,7 @@ void DrawingAreaProxyImpl::update(uint64_t sequenceNumber, const UpdateInfo& upd
     m_webPageProxy->process()->send(Messages::DrawingArea::DidUpdate(), m_webPageProxy->pageID());
 }
 
-void DrawingAreaProxyImpl::didSetSize(uint64_t sequenceNumber, const UpdateInfo& updateInfo)
+void DrawingAreaProxyImpl::didSetSize(uint64_t sequenceNumber, const UpdateInfo& updateInfo, const LayerTreeContext& layerTreeContext)
 {
     ASSERT(sequenceNumber > m_lastDidSetSizeSequenceNumber);
     m_lastDidSetSizeSequenceNumber = sequenceNumber;
@@ -152,7 +155,19 @@ void DrawingAreaProxyImpl::didSetSize(uint64_t sequenceNumber, const UpdateInfo&
     if (m_size != updateInfo.viewSize)
         sendSetSize();
 
-    if (m_isInAcceleratedCompositingMode) {
+    if (layerTreeContext != m_layerTreeContext) {
+        if (!m_layerTreeContext.isEmpty()) {
+            exitAcceleratedCompositingMode();
+            ASSERT(m_layerTreeContext.isEmpty());
+        }
+
+        if (!layerTreeContext.isEmpty()) {
+            enterAcceleratedCompositingMode(layerTreeContext);
+            ASSERT(layerTreeContext == m_layerTreeContext);
+        }            
+    }
+
+    if (isInAcceleratedCompositingMode()) {
         ASSERT(!m_backingStore);
         return;
     }
@@ -179,7 +194,7 @@ void DrawingAreaProxyImpl::exitAcceleratedCompositingMode(uint64_t sequenceNumbe
 
 void DrawingAreaProxyImpl::incorporateUpdate(const UpdateInfo& updateInfo)
 {
-    ASSERT(!m_isInAcceleratedCompositingMode);
+    ASSERT(!isInAcceleratedCompositingMode());
 
     if (updateInfo.updateRectBounds.isEmpty())
         return;
@@ -215,18 +230,18 @@ void DrawingAreaProxyImpl::sendSetSize()
 
 void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext)
 {
-    ASSERT(!m_isInAcceleratedCompositingMode);
-    m_isInAcceleratedCompositingMode = true;
-    
+    ASSERT(!isInAcceleratedCompositingMode());
+
     m_backingStore = nullptr;
+    m_layerTreeContext = layerTreeContext;
     m_webPageProxy->enterAcceleratedCompositingMode(layerTreeContext);
 }
 
 void DrawingAreaProxyImpl::exitAcceleratedCompositingMode()
 {
-    ASSERT(m_isInAcceleratedCompositingMode);
-    m_isInAcceleratedCompositingMode = false;
-    
+    ASSERT(isInAcceleratedCompositingMode());
+
+    m_layerTreeContext = LayerTreeContext();    
     m_webPageProxy->exitAcceleratedCompositingMode();
 }
 
index ebc1e8a..665f69b 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "BackingStore.h"
 #include "DrawingAreaProxy.h"
+#include "LayerTreeContext.h"
 
 namespace WebKit {
 
@@ -55,7 +56,7 @@ private:
 
     // CoreIPC message handlers
     virtual void update(uint64_t sequenceNumber, const UpdateInfo&);
-    virtual void didSetSize(uint64_t sequenceNumber, const UpdateInfo&);
+    virtual void didSetSize(uint64_t sequenceNumber, const UpdateInfo&, const LayerTreeContext&);
     virtual void enterAcceleratedCompositingMode(uint64_t sequenceNumber, const LayerTreeContext&);
     virtual void exitAcceleratedCompositingMode(uint64_t sequenceNumber);
 
@@ -65,13 +66,15 @@ private:
     void enterAcceleratedCompositingMode(const LayerTreeContext&);
     void exitAcceleratedCompositingMode();
 
+    bool isInAcceleratedCompositingMode() const { return !m_layerTreeContext.isEmpty(); }
+
+    // The current layer tree context.
+    LayerTreeContext m_layerTreeContext;
+    
     // Whether we've sent a SetSize message and are now waiting for a DidSetSize message.
     // Used to throttle SetSize messages so we don't send them faster than the Web process can handle.
     bool m_isWaitingForDidSetSize;
 
-    // Whether we're in accelerated compositing mode or not.
-    bool m_isInAcceleratedCompositingMode;
-
     // The sequence number of the last DidSetSize message
     uint64_t m_lastDidSetSizeSequenceNumber;
 
index 76fda8e..b704efd 100644 (file)
@@ -183,13 +183,17 @@ void DrawingAreaImpl::setSize(const IntSize& size)
     m_webPage->layoutIfNeeded();
 
     UpdateInfo updateInfo;
+    LayerTreeContext layerTreeContext;
+
+    if (m_layerTreeHost)
+        layerTreeContext = m_layerTreeHost->layerTreeContext();
 
     if (m_isPaintingSuspended || m_layerTreeHost) {
         updateInfo.viewSize = m_webPage->size();
     } else
         display(updateInfo);
 
-    m_webPage->send(Messages::DrawingAreaProxy::DidSetSize(generateSequenceNumber(), updateInfo));
+    m_webPage->send(Messages::DrawingAreaProxy::DidSetSize(generateSequenceNumber(), updateInfo, layerTreeContext));
 
     m_inSetSize = false;
 }