Title: [114785] trunk/Source/WebCore
Revision
114785
Author
simon.fra...@apple.com
Date
2012-04-20 14:54:45 -0700 (Fri, 20 Apr 2012)

Log Message

Set m_compositingDependsOnGeometry to false if possible
https://bugs.webkit.org/show_bug.cgi?id=84391

Reviewed by James Robinson.

For some kinds of elements, RenderLayerCompositor has to delay decisions about
compositing until the element's size and/or position are known. This was previsouly
based on the confusingly named m_compositingDependsOnGeometry flag, but another
variant of the same technique, with an additional flag m_compositingNeedsUpdate,
was added in r98627.

Also, once the m_compositingDependsOnGeometry flag was set to true, nothing
set it to false, so every compositing layer update resulted in a computeCompositingRequirements()
pass over the layers.

Rename the m_compositingDependsOnGeometry flag to m_reevaluateCompositingAfterLayout,
and clear the flag when we do a layout-related compositing layer update.
Use the same flag for position:fixed compositing.

This requires RenderLayerCompositor to distinguish between style- and layout-
related updates, requiring some minor refactoring in FrameView.

Should not change behavior.

* dom/Document.cpp:
(WebCore::Document::recalcStyle):
(WebCore::Document::implicitClose):
* page/FrameView.cpp:
(WebCore::FrameView::updateCompositingLayersAfterStyleChange):
(WebCore::FrameView::updateCompositingLayersAfterLayout):
(WebCore::FrameView::restoreBackingStores):
(WebCore::FrameView::layout):
* page/FrameView.h:
(FrameView):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::RenderLayerCompositor):
(WebCore::RenderLayerCompositor::updateCompositingLayersTimerFired):
(WebCore::RenderLayerCompositor::updateCompositingLayers):
(WebCore::RenderLayerCompositor::layerTreeAsText):
(WebCore::RenderLayerCompositor::requiresCompositingForPlugin):
(WebCore::RenderLayerCompositor::requiresCompositingForFrame):
(WebCore::RenderLayerCompositor::requiresCompositingForPosition):
* rendering/RenderLayerCompositor.h:
(RenderLayerCompositor):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (114784 => 114785)


--- trunk/Source/WebCore/ChangeLog	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/ChangeLog	2012-04-20 21:54:45 UTC (rev 114785)
@@ -1,3 +1,50 @@
+2012-04-19  Simon Fraser  <simon.fra...@apple.com>
+
+        Set m_compositingDependsOnGeometry to false if possible
+        https://bugs.webkit.org/show_bug.cgi?id=84391
+
+        Reviewed by James Robinson.
+        
+        For some kinds of elements, RenderLayerCompositor has to delay decisions about
+        compositing until the element's size and/or position are known. This was previsouly
+        based on the confusingly named m_compositingDependsOnGeometry flag, but another
+        variant of the same technique, with an additional flag m_compositingNeedsUpdate,
+        was added in r98627.
+        
+        Also, once the m_compositingDependsOnGeometry flag was set to true, nothing
+        set it to false, so every compositing layer update resulted in a computeCompositingRequirements()
+        pass over the layers.
+        
+        Rename the m_compositingDependsOnGeometry flag to m_reevaluateCompositingAfterLayout,
+        and clear the flag when we do a layout-related compositing layer update.
+        Use the same flag for position:fixed compositing.
+        
+        This requires RenderLayerCompositor to distinguish between style- and layout-
+        related updates, requiring some minor refactoring in FrameView.
+
+        Should not change behavior.
+        
+        * dom/Document.cpp:
+        (WebCore::Document::recalcStyle):
+        (WebCore::Document::implicitClose):
+        * page/FrameView.cpp:
+        (WebCore::FrameView::updateCompositingLayersAfterStyleChange):
+        (WebCore::FrameView::updateCompositingLayersAfterLayout):
+        (WebCore::FrameView::restoreBackingStores):
+        (WebCore::FrameView::layout):
+        * page/FrameView.h:
+        (FrameView):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::RenderLayerCompositor):
+        (WebCore::RenderLayerCompositor::updateCompositingLayersTimerFired):
+        (WebCore::RenderLayerCompositor::updateCompositingLayers):
+        (WebCore::RenderLayerCompositor::layerTreeAsText):
+        (WebCore::RenderLayerCompositor::requiresCompositingForPlugin):
+        (WebCore::RenderLayerCompositor::requiresCompositingForFrame):
+        (WebCore::RenderLayerCompositor::requiresCompositingForPosition):
+        * rendering/RenderLayerCompositor.h:
+        (RenderLayerCompositor):
+
 2012-04-20  Dan Bernstein  <m...@apple.com>
 
         <rdar://problem/10786000> Selection highlights of lines in adjoining blocks can overlap

Modified: trunk/Source/WebCore/dom/Document.cpp (114784 => 114785)


--- trunk/Source/WebCore/dom/Document.cpp	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/dom/Document.cpp	2012-04-20 21:54:45 UTC (rev 114785)
@@ -1690,7 +1690,7 @@
         bool layoutPending = view()->layoutPending() || renderer()->needsLayout();
         // If we didn't update compositing layers because of layout(), we need to do so here.
         if (!layoutPending)
-            view()->updateCompositingLayers();
+            view()->updateCompositingLayersAfterStyleChange();
     }
 #endif
 
@@ -2402,7 +2402,7 @@
     // If painting and compositing layer updates were suppressed pending the load event, do these actions now.
     if (renderer() && settings() && settings()->suppressesIncrementalRendering()) {
 #if USE(ACCELERATED_COMPOSITING)
-        view()->updateCompositingLayers();
+        view()->updateCompositingLayersAfterLayout();
 #endif
         renderer()->repaint();
     }

Modified: trunk/Source/WebCore/page/FrameView.cpp (114784 => 114785)


--- trunk/Source/WebCore/page/FrameView.cpp	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/page/FrameView.cpp	2012-04-20 21:54:45 UTC (rev 114785)
@@ -641,8 +641,18 @@
 }
 
 #if USE(ACCELERATED_COMPOSITING)
+void FrameView::updateCompositingLayersAfterStyleChange()
+{
+    RenderView* root = rootRenderer(this);
+    if (!root)
+        return;
 
-void FrameView::updateCompositingLayers()
+    // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
+    root->compositor()->cacheAcceleratedCompositingFlags();
+    root->compositor()->updateCompositingLayers(CompositingUpdateAfterStyleChange);
+}
+
+void FrameView::updateCompositingLayersAfterLayout()
 {
     RenderView* root = rootRenderer(this);
     if (!root)
@@ -650,7 +660,7 @@
 
     // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
     root->compositor()->cacheAcceleratedCompositingFlags();
-    root->compositor()->updateCompositingLayers(CompositingUpdateAfterLayoutOrStyleChange);
+    root->compositor()->updateCompositingLayers(CompositingUpdateAfterLayout);
 }
 
 void FrameView::clearBackingStores()
@@ -673,7 +683,7 @@
 
     RenderLayerCompositor* compositor = root->compositor();
     compositor->enableCompositingMode(true);
-    compositor->updateCompositingLayers();
+    compositor->updateCompositingLayers(CompositingUpdateAfterLayout);
 }
 
 GraphicsLayer* FrameView::layerForHorizontalScrollbar() const
@@ -1124,7 +1134,7 @@
     endDeferredRepaints();
 
 #if USE(ACCELERATED_COMPOSITING)
-    updateCompositingLayers();
+    updateCompositingLayersAfterLayout();
 #endif
     
     m_layoutCount++;

Modified: trunk/Source/WebCore/page/FrameView.h (114784 => 114785)


--- trunk/Source/WebCore/page/FrameView.h	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/page/FrameView.h	2012-04-20 21:54:45 UTC (rev 114785)
@@ -116,7 +116,8 @@
 #endif
 
 #if USE(ACCELERATED_COMPOSITING)
-    void updateCompositingLayers();
+    void updateCompositingLayersAfterStyleChange();
+    void updateCompositingLayersAfterLayout();
     bool syncCompositingStateForThisFrame(Frame* rootFrameForSync);
 
     void clearBackingStores();

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (114784 => 114785)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2012-04-20 21:54:45 UTC (rev 114785)
@@ -155,8 +155,7 @@
     , m_showRepaintCounter(false)
     , m_acceleratedDrawingEnabled(false)
     , m_compositingConsultsOverlap(true)
-    , m_compositingDependsOnGeometry(false)
-    , m_compositingNeedsUpdate(false)
+    , m_reevaluateCompositingAfterLayout(false)
     , m_compositing(false)
     , m_compositingLayersNeedRebuild(false)
     , m_flushingLayers(false)
@@ -301,7 +300,7 @@
 
 void RenderLayerCompositor::updateCompositingLayersTimerFired(Timer<RenderLayerCompositor>*)
 {
-    updateCompositingLayers();
+    updateCompositingLayers(CompositingUpdateAfterLayout);
 }
 
 bool RenderLayerCompositor::hasAnyAdditionalCompositedLayers(const RenderLayer* rootLayer) const
@@ -320,14 +319,15 @@
     if (m_forceCompositingMode && !m_compositing)
         enableCompositingMode(true);
 
-    if (!m_compositingDependsOnGeometry && !m_compositing && !m_compositingNeedsUpdate)
+    if (!m_reevaluateCompositingAfterLayout && !m_compositing)
         return;
 
-    bool checkForHierarchyUpdate = m_compositingDependsOnGeometry;
+    bool checkForHierarchyUpdate = m_reevaluateCompositingAfterLayout;
     bool needGeometryUpdate = false;
 
     switch (updateType) {
-    case CompositingUpdateAfterLayoutOrStyleChange:
+    case CompositingUpdateAfterStyleChange:
+    case CompositingUpdateAfterLayout:
     case CompositingUpdateOnHitTest:
         checkForHierarchyUpdate = true;
         break;
@@ -343,12 +343,16 @@
         return;
 
     bool needHierarchyUpdate = m_compositingLayersNeedRebuild;
+    bool isFullUpdate = !updateRoot;
     if (!updateRoot || m_compositingConsultsOverlap) {
         // Only clear the flag if we're updating the entire hierarchy.
         m_compositingLayersNeedRebuild = false;
         updateRoot = rootRenderLayer();
     }
 
+    if (isFullUpdate && updateType == CompositingUpdateAfterLayout)
+        m_reevaluateCompositingAfterLayout = false;
+
 #if PROFILE_LAYER_REBUILD
     ++m_rootLayerUpdateCount;
     
@@ -375,7 +379,7 @@
         rebuildCompositingLayerTree(updateRoot, childList);
 
         // Host the document layer in the RenderView's root layer.
-        if (updateRoot == rootRenderLayer()) {
+        if (isFullUpdate) {
             // Even when childList is empty, don't drop out of compositing mode if there are
             // composited layers that we didn't hit in our traversal (e.g. because of visibility:hidden).
             if (childList.isEmpty() && !hasAnyAdditionalCompositedLayers(updateRoot))
@@ -391,7 +395,7 @@
     
 #if PROFILE_LAYER_REBUILD
     double endTime = WTF::currentTime();
-    if (updateRoot == rootRenderLayer())
+    if (isFullUpdate)
         fprintf(stderr, "Update %d: computeCompositingRequirements for the world took %fms\n",
                     m_rootLayerUpdateCount, 1000.0 * (endTime - startTime));
 #endif
@@ -399,8 +403,6 @@
 
     if (!hasAcceleratedCompositing())
         enableCompositingMode(false);
-
-    m_compositingNeedsUpdate = false;
 }
 
 bool RenderLayerCompositor::updateBacking(RenderLayer* layer, CompositingChangeRepaint shouldRepaint)
@@ -977,7 +979,7 @@
 
 String RenderLayerCompositor::layerTreeAsText(bool showDebugInfo)
 {
-    updateCompositingLayers();
+    updateCompositingLayers(CompositingUpdateAfterLayout);
 
     if (!m_rootContentLayer)
         return String();
@@ -1480,7 +1482,7 @@
     if (!composite)
         return false;
 
-    m_compositingDependsOnGeometry = true;
+    m_reevaluateCompositingAfterLayout = true;
     
     RenderWidget* pluginRenderer = toRenderWidget(renderer);
     // If we can't reliably know the size of the plugin yet, don't change compositing state.
@@ -1502,7 +1504,7 @@
     if (!frameRenderer->requiresAcceleratedCompositing())
         return false;
 
-    m_compositingDependsOnGeometry = true;
+    m_reevaluateCompositingAfterLayout = true;
 
     RenderLayerCompositor* innerCompositor = frameContentsCompositor(frameRenderer);
     if (!innerCompositor || !innerCompositor->shouldPropagateCompositingToEnclosingFrame())
@@ -1568,7 +1570,7 @@
     RenderObject* container = renderer->container();
     // If the renderer is not hooked up yet then we have to wait until it is.
     if (!container) {
-        m_compositingNeedsUpdate = true;
+        m_reevaluateCompositingAfterLayout = true;
         return false;
     }
 

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (114784 => 114785)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2012-04-20 21:40:26 UTC (rev 114784)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2012-04-20 21:54:45 UTC (rev 114785)
@@ -43,7 +43,8 @@
 #endif
 
 enum CompositingUpdateType {
-    CompositingUpdateAfterLayoutOrStyleChange,
+    CompositingUpdateAfterStyleChange,
+    CompositingUpdateAfterLayout,
     CompositingUpdateOnHitTest,
     CompositingUpdateOnScroll
 };
@@ -100,7 +101,7 @@
     void didFlushChangesForLayer(RenderLayer*);
     
     // Rebuild the tree of compositing layers
-    void updateCompositingLayers(CompositingUpdateType = CompositingUpdateAfterLayoutOrStyleChange, RenderLayer* updateRoot = 0);
+    void updateCompositingLayers(CompositingUpdateType, RenderLayer* updateRoot = 0);
     // This is only used when state changes and we do not exepect a style update or layout to happen soon (e.g. when
     // we discover that an iframe is overlapped during painting).
     void scheduleCompositingLayerUpdate();
@@ -317,11 +318,8 @@
 
     // When true, we have to wait until layout has happened before we can decide whether to enter compositing mode,
     // because only then do we know the final size of plugins and iframes.
-    // FIXME: once set, this is never cleared.
-    mutable bool m_compositingDependsOnGeometry;
+    mutable bool m_reevaluateCompositingAfterLayout;
 
-    mutable bool m_compositingNeedsUpdate;
-
     bool m_compositing;
     bool m_compositingLayersNeedRebuild;
     bool m_flushingLayers;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to