Modified: trunk/Source/WebCore/ChangeLog (143690 => 143691)
--- trunk/Source/WebCore/ChangeLog 2013-02-22 06:25:44 UTC (rev 143690)
+++ trunk/Source/WebCore/ChangeLog 2013-02-22 06:33:52 UTC (rev 143691)
@@ -1,3 +1,29 @@
+2013-02-21 Antoine Quint <[email protected]>
+
+ Expose a list of all reasons that qualify a RenderLayer to be composited
+ https://bugs.webkit.org/show_bug.cgi?id=110505
+
+ Expose the various reasons that can qualify a RenderLayer to be composited
+ via a new bitmask returned by the reasonForCompositing() method on
+ RenderLayerCompositor. This method already existed and was used for logging
+ purposes, but the previous functionality is now accessed via the
+ logReasonForCompositing() method.
+
+ This will allow the the InspectorLayerTreeAgent to provide this information
+ to the front-end on a per-layer basis as requested by the front-end.
+
+ Reviewed by Simon Fraser.
+
+ No new tests.
+
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::logLayerInfo):
+ (WebCore::RenderLayerCompositor::reasonsForCompositing):
+ (WebCore):
+ (WebCore::RenderLayerCompositor::logReasonsForCompositing):
+ * rendering/RenderLayerCompositor.h:
+ (RenderLayerCompositor):
+
2013-02-21 Takashi Sakamoto <[email protected]>
RenderTable::paintBoxDecorations sometimes draws box-shadow twice.
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (143690 => 143691)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-02-22 06:25:44 UTC (rev 143690)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-02-22 06:33:52 UTC (rev 143691)
@@ -578,7 +578,7 @@
LOG(Compositing, "%*p %dx%d %.2fKB (%s) %s\n", 12 + depth * 2, layer, backing->compositedBounds().width(), backing->compositedBounds().height(),
backing->backingStoreMemoryEstimate() / 1024,
- reasonForCompositing(layer), layer->name().utf8().data());
+ logReasonsForCompositing(layer), layer->name().utf8().data());
}
#endif
@@ -1713,9 +1713,13 @@
return false;
}
-#if !LOG_DISABLED
-const char* RenderLayerCompositor::reasonForCompositing(const RenderLayer* layer)
+CompositingReasons RenderLayerCompositor::reasonsForCompositing(const RenderLayer* layer) const
{
+ CompositingReasons reasons = CompositingReasonNone;
+
+ if (!layer || !layer->isComposited())
+ return reasons;
+
RenderObject* renderer = layer->renderer();
if (layer->isReflection()) {
renderer = renderer->parent();
@@ -1723,77 +1727,152 @@
}
if (requiresCompositingForTransform(renderer))
- return "3D transform";
+ reasons |= CompositingReason3DTransform;
if (requiresCompositingForVideo(renderer))
- return "video";
+ reasons |= CompositingReasonVideo;
if (requiresCompositingForCanvas(renderer))
- return "canvas";
+ reasons |= CompositingReasonCanvas;
if (requiresCompositingForPlugin(renderer))
- return "plugin";
+ reasons |= CompositingReasonPlugin;
if (requiresCompositingForFrame(renderer))
- return "iframe";
+ reasons |= CompositingReasonIFrame;
if ((canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden))
- return "backface-visibility: hidden";
+ reasons |= CompositingReasonBackfaceVisibilityHidden;
if (clipsCompositingDescendants(layer))
- return "clips compositing descendants";
+ reasons |= CompositingReasonClipsCompositingDescendants;
if (requiresCompositingForAnimation(renderer))
- return "animation";
+ reasons |= CompositingReasonAnimation;
if (requiresCompositingForFilters(renderer))
- return "filters";
+ reasons |= CompositingReasonFilters;
if (requiresCompositingForPosition(renderer, layer))
- return renderer->style()->position() == FixedPosition ? "position: fixed" : "position: sticky";
+ reasons |= renderer->style()->position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;
if (requiresCompositingForOverflowScrolling(layer))
- return "-webkit-overflow-scrolling: touch";
+ reasons |= CompositingReasonOverflowScrollingTouch;
if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForStacking)
- return "stacking";
-
- if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForOverlap)
- return "overlap";
-
- if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForBackgroundLayer)
- return "negative z-index children";
-
- if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForGraphicalEffect) {
+ reasons |= CompositingReasonStacking;
+ else if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForOverlap)
+ reasons |= CompositingReasonOverlap;
+ else if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForBackgroundLayer)
+ reasons |= CompositingReasonNegativeZIndexChildren;
+ else if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForGraphicalEffect) {
if (layer->transform())
- return "transform with composited descendants";
+ reasons |= CompositingReasonTransformWithCompositedDescendants;
if (renderer->isTransparent())
- return "opacity with composited descendants";
+ reasons |= CompositingReasonOpacityWithCompositedDescendants;
if (renderer->hasMask())
- return "mask with composited descendants";
+ reasons |= CompositingReasonMaskWithCompositedDescendants;
if (renderer->hasReflection())
- return "reflection with composited descendants";
+ reasons |= CompositingReasonReflectionWithCompositedDescendants;
if (renderer->hasFilter())
- return "filter with composited descendants";
+ reasons |= CompositingReasonFilterWithCompositedDescendants;
if (renderer->hasBlendMode())
- return "blending with composited descendants";
- }
+ reasons |= CompositingReasonBlendingWithCompositedDescendants;
+ } else if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForPerspective)
+ reasons |= CompositingReasonPerspective;
+ else if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForPreserve3D)
+ reasons |= CompositingReasonPreserve3D;
- if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForPerspective)
+ if (inCompositingMode() && layer->isRootLayer())
+ reasons |= CompositingReasonRoot;
+
+ return reasons;
+}
+
+#if !LOG_DISABLED
+const char* RenderLayerCompositor::logReasonsForCompositing(const RenderLayer* layer)
+{
+ CompositingReasons reasons = reasonsForCompositing(layer);
+
+ if (!reasons)
+ return "";
+
+ if (reasons & CompositingReason3DTransform)
+ return "3D transform";
+
+ if (reasons & CompositingReasonVideo)
+ return "video";
+
+ if (reasons & CompositingReasonCanvas)
+ return "canvas";
+
+ if (reasons & CompositingReasonPlugin)
+ return "plugin";
+
+ if (reasons & CompositingReasonIFrame)
+ return "iframe";
+
+ if (reasons & CompositingReasonBackfaceVisibilityHidden)
+ return "backface-visibility: hidden";
+
+ if (reasons & CompositingReasonClipsCompositingDescendants)
+ return "clips compositing descendants";
+
+ if (reasons & CompositingReasonAnimation)
+ return "animation";
+
+ if (reasons & CompositingReasonFilters)
+ return "filters";
+
+ if (reasons & CompositingReasonPositionFixed)
+ return "position: fixed";
+
+ if (reasons & CompositingReasonPositionSticky)
+ return "position: sticky";
+
+ if (reasons & CompositingReasonOverflowScrollingTouch)
+ return "-webkit-overflow-scrolling: touch";
+
+ if (reasons & CompositingReasonStacking)
+ return "stacking";
+
+ if (reasons & CompositingReasonOverlap)
+ return "overlap";
+
+ if (reasons & CompositingReasonNegativeZIndexChildren)
+ return "negative z-index children";
+
+ if (reasons & CompositingReasonTransformWithCompositedDescendants)
+ return "transform with composited descendants";
+
+ if (reasons & CompositingReasonOpacityWithCompositedDescendants)
+ return "opacity with composited descendants";
+
+ if (reasons & CompositingReasonMaskWithCompositedDescendants)
+ return "mask with composited descendants";
+
+ if (reasons & CompositingReasonReflectionWithCompositedDescendants)
+ return "reflection with composited descendants";
+
+ if (reasons & CompositingReasonFilterWithCompositedDescendants)
+ return "filter with composited descendants";
+
+ if (reasons & CompositingReasonBlendingWithCompositedDescendants)
+ return "blending with composited descendants";
+
+ if (reasons & CompositingReasonPerspective)
return "perspective";
- if (layer->indirectCompositingReason() == RenderLayer::IndirectCompositingForPreserve3D)
+ if (reasons & CompositingReasonPreserve3D)
return "preserve-3d";
- if (inCompositingMode() && layer->isRootLayer())
+ if (reasons & CompositingReasonRoot)
return "root";
-
- return "";
}
#endif
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (143690 => 143691)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2013-02-22 06:25:44 UTC (rev 143690)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2013-02-22 06:33:52 UTC (rev 143691)
@@ -55,6 +55,35 @@
CompositingUpdateOnCompositedScroll
};
+enum {
+ CompositingReasonNone = 0,
+ CompositingReason3DTransform = 1 << 0,
+ CompositingReasonVideo = 1 << 1,
+ CompositingReasonCanvas = 1 << 2,
+ CompositingReasonPlugin = 1 << 3,
+ CompositingReasonIFrame = 1 << 4,
+ CompositingReasonBackfaceVisibilityHidden = 1 << 5,
+ CompositingReasonClipsCompositingDescendants = 1 << 6,
+ CompositingReasonAnimation = 1 << 7,
+ CompositingReasonFilters = 1 << 8,
+ CompositingReasonPositionFixed = 1 << 9,
+ CompositingReasonPositionSticky = 1 << 10,
+ CompositingReasonOverflowScrollingTouch = 1 << 11,
+ CompositingReasonStacking = 1 << 12,
+ CompositingReasonOverlap = 1 << 13,
+ CompositingReasonNegativeZIndexChildren = 1 << 14,
+ CompositingReasonTransformWithCompositedDescendants = 1 << 15,
+ CompositingReasonOpacityWithCompositedDescendants = 1 << 16,
+ CompositingReasonMaskWithCompositedDescendants = 1 << 17,
+ CompositingReasonReflectionWithCompositedDescendants = 1 << 18,
+ CompositingReasonFilterWithCompositedDescendants = 1 << 19,
+ CompositingReasonBlendingWithCompositedDescendants = 1 << 20,
+ CompositingReasonPerspective = 1 << 21,
+ CompositingReasonPreserve3D = 1 << 22,
+ CompositingReasonRoot = 1 << 23
+};
+typedef unsigned CompositingReasons;
+
// RenderLayerCompositor manages the hierarchy of
// composited RenderLayers. It determines which RenderLayers
// become compositing, and creates and maintains a hierarchy of
@@ -341,10 +370,12 @@
#endif
#if !LOG_DISABLED
- const char* reasonForCompositing(const RenderLayer*);
+ const char* logReasonsForCompositing(const RenderLayer*);
void logLayerInfo(const RenderLayer*, int depth);
#endif
+ CompositingReasons reasonsForCompositing(const RenderLayer*) const;
+
private:
RenderView* m_renderView;
OwnPtr<GraphicsLayer> m_rootContentLayer;