Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp

Issue 1393083003: Implement interest rects for synchronized paint. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index f358ae9248b7933605c7c73644e3edf846050cf8..3b2864face23115e43b6bca362949caa93bffd3a 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -2166,8 +2166,54 @@ static void paintScrollbar(const Scrollbar* scrollbar, GraphicsContext& context,
scrollbar->paint(&context, transformedClip);
}
-// Up-call from compositing layer drawing callback.
-void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, const IntRect& clip) const
+static const int kPixelDistanceToRecord = 4000;
+
+IntRect CompositedLayerMapping::computeInterestRect(const GraphicsLayer* graphicsLayer, LayoutObject* owningLayoutObject)
+{
+ FloatRect graphicsLayerBounds(FloatPoint(), graphicsLayer->size());
+
+ // Start with the bounds of the graphics layer in the space of the owning LayoutObject.
+ FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds);
+ graphicsLayerBoundsInObjectSpace.move(graphicsLayer->offsetFromLayoutObject());
+
+ // Now map the bounds to its visible content rect in screen space, including applying clips along the way.
wkorman 2015/10/09 19:46:32 Where are the clips applied, is it basically just
chrishtr 2015/10/09 20:54:52 mapRectToPaintInvalidationBacking actually takes c
+ LayoutRect visibleContentRect(graphicsLayerBoundsInObjectSpace);
+ LayoutView* rootView = owningLayoutObject->view();
+ while (rootView->frame()->ownerLayoutObject())
+ rootView = rootView->frame()->ownerLayoutObject()->view();
+ owningLayoutObject->mapRectToPaintInvalidationBacking(rootView, visibleContentRect, 0);
+ visibleContentRect.intersect(LayoutRect(rootView->frameView()->visibleContentRect()));
+
+ // Map the visible content rect from screen space to local graphics layer space.
+ IntRect localInterestRect;
+ // If the visible content rect is empty, then it makes no sense to map it back since there is nothing to map.
+ if (!visibleContentRect.isEmpty()) {
+ localInterestRect = owningLayoutObject->absoluteToLocalQuad(FloatRect(visibleContentRect), UseTransforms).enclosingBoundingBox();
+ localInterestRect.move(-graphicsLayer->offsetFromLayoutObject());
+ }
+ // Expand by interest rect padding amount.
+ localInterestRect.expand(IntRectOutsets(kPixelDistanceToRecord, kPixelDistanceToRecord, kPixelDistanceToRecord, kPixelDistanceToRecord));
wkorman 2015/10/09 19:46:32 If we have no visible content rect, do we still ne
chrishtr 2015/10/09 20:54:52 Yes, or otherwise nothing will be recorded because
+ localInterestRect.intersect(enclosingIntRect(graphicsLayerBounds));
+ return localInterestRect;
+}
ajuma 2015/10/09 20:55:27 Do you have a sense of how efficient this approach
chrishtr 2015/10/09 21:35:45 In that example it should be relatively cheap, bec
+
+void CompositedLayerMapping::paintContentsIfNeeded(const GraphicsLayer* graphicsLayer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase) const
+{
+ // TODO(chrishtr): paint if needsDisplay is true *or* the interest rect has changed sufficiently.
+ if (!graphicsLayer->needsDisplay())
+ return;
+
+ IntRect interestRect;
+ if (graphicsLayer == m_graphicsLayer || graphicsLayer == m_squashingLayer)
+ interestRect = computeInterestRect(graphicsLayer, m_owningLayer.layoutObject());
+ else
+ interestRect = enclosingIntRect(FloatRect(FloatPoint(), graphicsLayer->size()));
+
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled());
+ paintContents(graphicsLayer, context, graphicsLayerPaintingPhase, interestRect);
+}
+
+void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, GraphicsContext& context, GraphicsLayerPaintingPhase graphicsLayerPaintingPhase, const IntRect& interestRect) const
{
// https://code.google.com/p/chromium/issues/detail?id=343772
DisableCompositingQueryAsserts disabler;
@@ -2176,7 +2222,8 @@ void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G
if (Page* page = layoutObject()->frame()->page())
page->setIsPainting(true);
#endif
- TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data(m_owningLayer.layoutObject(), LayoutRect(clip), graphicsLayer));
+
+ TRACE_EVENT1("devtools.timeline", "Paint", "data", InspectorPaintEvent::data(m_owningLayer.layoutObject(), LayoutRect(interestRect), graphicsLayer));
PaintLayerFlags paintLayerFlags = 0;
if (graphicsLayerPaintingPhase & GraphicsLayerPaintBackground)
@@ -2211,20 +2258,20 @@ void CompositedLayerMapping::paintContents(const GraphicsLayer* graphicsLayer, G
paintInfo.offsetFromLayoutObject = graphicsLayer->offsetFromLayoutObject();
// We have to use the same root as for hit testing, because both methods can compute and cache clipRects.
- doPaintTask(paintInfo, paintLayerFlags, &context, clip);
+ doPaintTask(paintInfo, paintLayerFlags, &context, interestRect);
} else if (graphicsLayer == m_squashingLayer.get()) {
for (size_t i = 0; i < m_squashedLayers.size(); ++i)
- doPaintTask(m_squashedLayers[i], paintLayerFlags, &context, clip);
+ doPaintTask(m_squashedLayers[i], paintLayerFlags, &context, interestRect);
} else if (graphicsLayer == layerForHorizontalScrollbar()) {
- paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), context, clip);
+ paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), context, interestRect);
} else if (graphicsLayer == layerForVerticalScrollbar()) {
- paintScrollbar(m_owningLayer.scrollableArea()->verticalScrollbar(), context, clip);
+ paintScrollbar(m_owningLayer.scrollableArea()->verticalScrollbar(), context, interestRect);
} else if (graphicsLayer == layerForScrollCorner()) {
IntPoint scrollCornerAndResizerLocation = m_owningLayer.scrollableArea()->scrollCornerAndResizerRect().location();
- ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintScrollCorner(&context, -scrollCornerAndResizerLocation, clip);
- ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintResizer(&context, -scrollCornerAndResizerLocation, clip);
+ ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintScrollCorner(&context, -scrollCornerAndResizerLocation, interestRect);
+ ScrollableAreaPainter(*m_owningLayer.scrollableArea()).paintResizer(&context, -scrollCornerAndResizerLocation, interestRect);
}
- InspectorInstrumentation::didPaint(m_owningLayer.layoutObject(), graphicsLayer, &context, LayoutRect(clip));
+ InspectorInstrumentation::didPaint(m_owningLayer.layoutObject(), graphicsLayer, &context, LayoutRect(interestRect));
#if ENABLE(ASSERT)
if (Page* page = layoutObject()->frame()->page())
page->setIsPainting(false);

Powered by Google App Engine
This is Rietveld 408576698