- 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;