diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 0d07d2d9b07c..57e41ee59fc4 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,38 @@ +2017-08-16 Simon Fraser + + Make RenderLayer and RenderLayerBacking TextStream-loggable, and clean up compositing logging + https://bugs.webkit.org/show_bug.cgi?id=175634 + + Reviewed by Zalan Bujtas. + + Add operator<<(TextStream&) for RenderLayer and RenderLayer backing, and use them for compositing logging. + + Convert CompositingUpdateType to an enum class. + + * page/FrameView.cpp: + (WebCore::FrameView::updateCompositingLayersAfterLayout): + (WebCore::FrameView::updateCompositingLayersAfterScrolling): + * page/ios/FrameIOS.mm: + (WebCore::Frame::viewportOffsetChanged): + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::updateLayerPositionsAfterLayout): + (WebCore::RenderLayer::updateCompositingLayersAfterScroll): + (WebCore::RenderLayer::calculateClipRects const): + * rendering/RenderLayer.h: + * rendering/RenderLayerBacking.cpp: + (WebCore::RenderLayerBacking::updateAfterLayout): + (WebCore::RenderLayerBacking::updateGeometry): + (WebCore::operator<<): + * rendering/RenderLayerBacking.h: + * rendering/RenderLayerCompositor.cpp: + (WebCore::RenderLayerCompositor::didRecalcStyleWithNoPendingLayout): + (WebCore::RenderLayerCompositor::flushPendingLayerChanges): + (WebCore::RenderLayerCompositor::updateCompositingLayersTimerFired): + (WebCore::RenderLayerCompositor::updateCompositingLayers): + (WebCore::RenderLayerCompositor::layerTreeAsText): + (WebCore::operator<<): + * rendering/RenderLayerCompositor.h: + 2017-08-16 Fujii Hironori [HarfBuzz] Decomposed Vietnamese characters are rendered incorrectly diff --git a/Source/WebCore/page/FrameView.cpp b/Source/WebCore/page/FrameView.cpp index a2d1840f4770..8abd7dd26cc1 100644 --- a/Source/WebCore/page/FrameView.cpp +++ b/Source/WebCore/page/FrameView.cpp @@ -889,7 +889,7 @@ void FrameView::updateCompositingLayersAfterLayout() // This call will make sure the cached hasAcceleratedCompositing is updated from the pref renderView->compositor().cacheAcceleratedCompositingFlags(); - renderView->compositor().updateCompositingLayers(CompositingUpdateAfterLayout); + renderView->compositor().updateCompositingLayers(CompositingUpdateType::AfterLayout); } void FrameView::clearBackingStores() @@ -2690,7 +2690,7 @@ void FrameView::updateCompositingLayersAfterScrolling() if (m_nestedLayoutCount <= 1 && hasViewportConstrainedObjects()) { if (RenderView* renderView = this->renderView()) - renderView->compositor().updateCompositingLayers(CompositingUpdateOnScroll); + renderView->compositor().updateCompositingLayers(CompositingUpdateType::OnScroll); } } diff --git a/Source/WebCore/page/ios/FrameIOS.mm b/Source/WebCore/page/ios/FrameIOS.mm index b66387bdfb89..42c8b31ef6bf 100644 --- a/Source/WebCore/page/ios/FrameIOS.mm +++ b/Source/WebCore/page/ios/FrameIOS.mm @@ -718,7 +718,7 @@ static bool anyFrameHasTiledLayers(Frame* rootFrame) if (changeType == CompletedScrollOffset) { if (RenderView* root = contentRenderer()) - root->compositor().updateCompositingLayers(CompositingUpdateOnScroll); + root->compositor().updateCompositingLayers(CompositingUpdateType::OnScroll); } } diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp index aa8d0af85519..4eaabbd7e9d7 100644 --- a/Source/WebCore/rendering/RenderLayer.cpp +++ b/Source/WebCore/rendering/RenderLayer.cpp @@ -472,6 +472,7 @@ FilterEffectRenderer* RenderLayer::filterRenderer() const void RenderLayer::updateLayerPositionsAfterLayout(const RenderLayer* rootLayer, UpdateLayerPositionsFlags flags) { + LOG(Compositing, "RenderLayer %p updateLayerPositionsAfterLayout", this); RenderGeometryMap geometryMap(UseTransforms); if (this != rootLayer) geometryMap.pushMappingsToAncestor(parent(), nullptr); @@ -2594,9 +2595,9 @@ void RenderLayer::updateCompositingLayersAfterScroll() // repositioning, so update compositing layers from there. if (RenderLayer* compositingAncestor = stackingContainer()->enclosingCompositingLayer()) { if (usesCompositedScrolling() && !hasOutOfFlowPositionedDescendant()) - compositor().updateCompositingLayers(CompositingUpdateOnCompositedScroll, compositingAncestor); + compositor().updateCompositingLayers(CompositingUpdateType::OnCompositedScroll, compositingAncestor); else - compositor().updateCompositingLayers(CompositingUpdateOnScroll, compositingAncestor); + compositor().updateCompositingLayers(CompositingUpdateType::OnScroll, compositingAncestor); } } } @@ -6491,7 +6492,7 @@ void RenderLayer::updateCompositingAndLayerListsIfNeeded() { if (compositor().inCompositingMode()) { if (isDirtyStackingContainer() || m_normalFlowListDirty) - compositor().updateCompositingLayers(CompositingUpdateOnHitTest, this); + compositor().updateCompositingLayers(CompositingUpdateType::OnHitTest, this); return; } @@ -7235,6 +7236,24 @@ RenderNamedFlowFragment* RenderLayer::currentRenderNamedFlowFragment() const return renderer().currentRenderNamedFlowFragment(); } +TextStream& operator<<(TextStream& ts, const RenderLayer& layer) +{ + ts << "RenderLayer " << &layer << " " << layer.size(); + if (layer.transform()) + ts << " has transform"; + if (layer.hasFilter()) + ts << " has filter"; + if (layer.hasBackdropFilter()) + ts << " has backdrop filter"; + if (layer.hasBlendMode()) + ts << " has blend mode"; + if (layer.isolatesBlending()) + ts << " isolates blending"; + if (layer.isComposited()) + ts << " " << *layer.backing(); + return ts; +} + } // namespace WebCore #if ENABLE(TREE_DEBUGGING) diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h index 184199e306b1..4a1d2aad0baf 100644 --- a/Source/WebCore/rendering/RenderLayer.h +++ b/Source/WebCore/rendering/RenderLayer.h @@ -52,6 +52,10 @@ #include "ScrollableArea.h" #include +namespace WTF { +class TextStream; +} + namespace WebCore { class ClipRects; @@ -1234,6 +1238,8 @@ void makeMatrixRenderable(TransformationMatrix&, bool has3DRendering); bool compositedWithOwnBackingStore(const RenderLayer&); +WTF::TextStream& operator<<(WTF::TextStream&, const RenderLayer&); + } // namespace WebCore #if ENABLE(TREE_DEBUGGING) diff --git a/Source/WebCore/rendering/RenderLayerBacking.cpp b/Source/WebCore/rendering/RenderLayerBacking.cpp index a66704cbb6ed..0161ca516ccd 100644 --- a/Source/WebCore/rendering/RenderLayerBacking.cpp +++ b/Source/WebCore/rendering/RenderLayerBacking.cpp @@ -65,6 +65,7 @@ #include "Settings.h" #include "StyleResolver.h" #include "TiledBacking.h" +#include #if PLATFORM(IOS) #include "RuntimeApplicationChecks.h" @@ -634,6 +635,8 @@ void RenderLayerBacking::updateAfterWidgetResize() void RenderLayerBacking::updateAfterLayout(UpdateAfterLayoutFlags flags) { + LOG(Compositing, "RenderLayerBacking %p updateAfterLayout (layer %p)", this, &m_owningLayer); + if (!compositor().compositingLayersNeedRebuild()) { // Calling updateGeometry() here gives incorrect results, because the // position of this layer's GraphicsLayer depends on the position of our compositing @@ -940,6 +943,8 @@ LayoutRect RenderLayerBacking::computeParentGraphicsLayerRect(RenderLayer* compo void RenderLayerBacking::updateGeometry() { + LOG_WITH_STREAM(Compositing, stream << "updateGeometry " << m_owningLayer); + // If we haven't built z-order lists yet, wait until later. if (m_owningLayer.isStackingContainer() && m_owningLayer.m_zOrderListsDirty) return; @@ -3041,4 +3046,23 @@ double RenderLayerBacking::backingStoreMemoryEstimate() const return backingMemory; } +TextStream& operator<<(TextStream& ts, const RenderLayerBacking& backing) +{ + ts << "RenderLayerBacking " << &backing << " bounds " << backing.compositedBounds(); + + if (backing.isMainFrameLayerWithTiledBacking()) + ts << " main tiled backing"; + if (backing.paintsIntoWindow()) + ts << " paintsIntoWindow"; + if (backing.paintsIntoCompositedAncestor()) + ts << " paintsIntoCompositedAncestor"; + + ts << " primary layer ID " << backing.graphicsLayer()->primaryLayerID(); + if (auto nodeID = backing.scrollingNodeIDForRole(ViewportConstrained)) + ts << " viewport constrained scrolling node " << nodeID; + if (auto nodeID = backing.scrollingNodeIDForRole(Scrolling)) + ts << " scrolling node " << nodeID; + return ts; +} + } // namespace WebCore diff --git a/Source/WebCore/rendering/RenderLayerBacking.h b/Source/WebCore/rendering/RenderLayerBacking.h index b3a8ba16ce02..46768129fdb7 100644 --- a/Source/WebCore/rendering/RenderLayerBacking.h +++ b/Source/WebCore/rendering/RenderLayerBacking.h @@ -398,4 +398,6 @@ enum CanvasCompositingStrategy { }; CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject&); +WTF::TextStream& operator<<(WTF::TextStream&, const RenderLayerBacking&); + } // namespace WebCore diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp index 12bb0b44d05e..94ab7af591bd 100644 --- a/Source/WebCore/rendering/RenderLayerCompositor.cpp +++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp @@ -373,7 +373,7 @@ bool RenderLayerCompositor::didRecalcStyleWithNoPendingLayout() return false; cacheAcceleratedCompositingFlags(); - return updateCompositingLayers(CompositingUpdateAfterStyleChange); + return updateCompositingLayers(CompositingUpdateType::AfterStyleChange); } void RenderLayerCompositor::customPositionForVisibleRectComputation(const GraphicsLayer* graphicsLayer, FloatPoint& position) const @@ -440,7 +440,7 @@ void RenderLayerCompositor::flushPendingLayerChanges(bool isFlushRoot) if (GraphicsLayer* rootLayer = rootGraphicsLayer()) { #if PLATFORM(IOS) FloatRect exposedRect = frameView.exposedContentRect(); - LOG_WITH_STREAM(Compositing, stream << "\nRenderLayerCompositor " << this << " flushPendingLayerChanges (root " << isFlushRoot << ") exposedRect " << exposedRect); + LOG_WITH_STREAM(Compositing, stream << "\nRenderLayerCompositor " << this << " flushPendingLayerChanges (is root " << isFlushRoot << ") exposedRect " << exposedRect); // FIXME: Use optimized flushes. rootLayer->flushCompositingState(exposedRect); @@ -451,7 +451,7 @@ void RenderLayerCompositor::flushPendingLayerChanges(bool isFlushRoot) if (frameView.viewExposedRect()) visibleRect.intersect(frameView.viewExposedRect().value()); - LOG_WITH_STREAM(Compositing, stream << "\nRenderLayerCompositor " << this << " flushPendingLayerChanges(" << isFlushRoot << ") " << visibleRect); + LOG_WITH_STREAM(Compositing, stream << "\nRenderLayerCompositor " << this << " flushPendingLayerChanges (is root " << isFlushRoot << ") visible rect " << visibleRect); rootLayer->flushCompositingState(visibleRect); LOG_WITH_STREAM(Compositing, stream << "RenderLayerCompositor " << this << " flush complete\n"); #endif @@ -618,7 +618,7 @@ void RenderLayerCompositor::scheduleCompositingLayerUpdate() void RenderLayerCompositor::updateCompositingLayersTimerFired() { - updateCompositingLayers(CompositingUpdateAfterLayout); + updateCompositingLayers(CompositingUpdateType::AfterLayout); } bool RenderLayerCompositor::hasAnyAdditionalCompositedLayers(const RenderLayer& rootLayer) const @@ -634,7 +634,7 @@ void RenderLayerCompositor::cancelCompositingLayerUpdate() bool RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType updateType, RenderLayer* updateRoot) { - LOG(Compositing, "RenderLayerCompositor %p updateCompositingLayers %d %p", this, updateType, updateRoot); + LOG_WITH_STREAM(Compositing, stream << "RenderLayerCompositor " << this << " updateCompositingLayers " << updateType << " root " << updateRoot); m_updateCompositingLayersTimer.stop(); @@ -664,17 +664,17 @@ bool RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update bool needGeometryUpdate = false; switch (updateType) { - case CompositingUpdateAfterStyleChange: - case CompositingUpdateAfterLayout: - case CompositingUpdateOnHitTest: + case CompositingUpdateType::AfterStyleChange: + case CompositingUpdateType::AfterLayout: + case CompositingUpdateType::OnHitTest: checkForHierarchyUpdate = true; break; - case CompositingUpdateOnScroll: + case CompositingUpdateType::OnScroll: checkForHierarchyUpdate = true; // Overlap can change with scrolling, so need to check for hierarchy updates. needGeometryUpdate = true; break; - case CompositingUpdateOnCompositedScroll: + case CompositingUpdateType::OnCompositedScroll: needGeometryUpdate = true; break; } @@ -689,16 +689,16 @@ bool RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update m_compositingLayersNeedRebuild = false; updateRoot = &rootRenderLayer(); - if (isFullUpdate && updateType == CompositingUpdateAfterLayout) + if (isFullUpdate && updateType == CompositingUpdateType::AfterLayout) m_reevaluateCompositingAfterLayout = false; LOG(Compositing, " checkForHierarchyUpdate %d, needGeometryUpdate %d", checkForHierarchyUpdate, needHierarchyUpdate); #if !LOG_DISABLED - double startTime = 0; + MonotonicTime startTime; if (compositingLogEnabled()) { ++m_rootLayerUpdateCount; - startTime = monotonicallyIncreasingTime(); + startTime = MonotonicTime::now(); } #endif @@ -754,12 +754,12 @@ bool RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update #if !LOG_DISABLED if (compositingLogEnabled() && isFullUpdate && (needHierarchyUpdate || needGeometryUpdate)) { - double endTime = monotonicallyIncreasingTime(); + MonotonicTime endTime = MonotonicTime::now(); LOG(Compositing, "Total layers primary secondary obligatory backing (KB) secondary backing(KB) total backing (KB) update time (ms)\n"); LOG(Compositing, "%8d %11d %9d %20.2f %22.2f %22.2f %18.2f\n", m_obligateCompositedLayerCount + m_secondaryCompositedLayerCount, m_obligateCompositedLayerCount, - m_secondaryCompositedLayerCount, m_obligatoryBackingStoreBytes / 1024, m_secondaryBackingStoreBytes / 1024, (m_obligatoryBackingStoreBytes + m_secondaryBackingStoreBytes) / 1024, 1000.0 * (endTime - startTime)); + m_secondaryCompositedLayerCount, m_obligatoryBackingStoreBytes / 1024, m_secondaryBackingStoreBytes / 1024, (m_obligatoryBackingStoreBytes + m_secondaryBackingStoreBytes) / 1024, (endTime - startTime).milliseconds()); } #endif ASSERT(updateRoot || !m_compositingLayersNeedRebuild); @@ -1825,7 +1825,7 @@ void RenderLayerCompositor::fixedRootBackgroundLayerChanged() String RenderLayerCompositor::layerTreeAsText(LayerTreeFlags flags) { - updateCompositingLayers(CompositingUpdateAfterLayout); + updateCompositingLayers(CompositingUpdateType::AfterLayout); if (!m_rootContentLayer) return String(); @@ -4220,4 +4220,16 @@ Page& RenderLayerCompositor::page() const return m_renderView.page(); } +TextStream& operator<<(TextStream& ts, CompositingUpdateType updateType) +{ + switch (updateType) { + case CompositingUpdateType::AfterStyleChange: ts << "after style change"; break; + case CompositingUpdateType::AfterLayout: ts << "after layout"; break; + case CompositingUpdateType::OnHitTest: ts << "on hit test"; break; + case CompositingUpdateType::OnScroll: ts << "on scroll"; break; + case CompositingUpdateType::OnCompositedScroll: ts << "on composited scroll"; break; + } + return ts; +} + } // namespace WebCore diff --git a/Source/WebCore/rendering/RenderLayerCompositor.h b/Source/WebCore/rendering/RenderLayerCompositor.h index dce0434a54e6..e4aeba720066 100644 --- a/Source/WebCore/rendering/RenderLayerCompositor.h +++ b/Source/WebCore/rendering/RenderLayerCompositor.h @@ -47,12 +47,12 @@ class TiledBacking; typedef unsigned LayerTreeFlags; -enum CompositingUpdateType { - CompositingUpdateAfterStyleChange, - CompositingUpdateAfterLayout, - CompositingUpdateOnHitTest, - CompositingUpdateOnScroll, - CompositingUpdateOnCompositedScroll +enum class CompositingUpdateType { + AfterStyleChange, + AfterLayout, + OnHitTest, + OnScroll, + OnCompositedScroll }; enum class CompositingReason { @@ -573,4 +573,6 @@ class RenderLayerCompositor final : public GraphicsLayerClient, public GraphicsL void paintScrollbar(Scrollbar*, GraphicsContext&, const IntRect& clip); +WTF::TextStream& operator<<(WTF::TextStream&, CompositingUpdateType); + } // namespace WebCore