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

Side by Side Diff: Source/core/rendering/RenderLayerCompositor.cpp

Issue 24921002: Make compositingState explicit (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressed second round of reviewer feedback Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 317
318 IntRect visibleRect = m_containerLayer ? IntRect(IntPoint(), frameView->cont entsSize()) : frameView->visibleContentRect(); 318 IntRect visibleRect = m_containerLayer ? IntRect(IntPoint(), frameView->cont entsSize()) : frameView->visibleContentRect();
319 if (rootLayer->visibleRectChangeRequiresFlush(visibleRect)) { 319 if (rootLayer->visibleRectChangeRequiresFlush(visibleRect)) {
320 if (Page* page = this->page()) 320 if (Page* page = this->page())
321 page->chrome().client().scheduleCompositingLayerFlush(); 321 page->chrome().client().scheduleCompositingLayerFlush();
322 } 322 }
323 } 323 }
324 324
325 bool RenderLayerCompositor::hasAnyAdditionalCompositedLayers(const RenderLayer* rootLayer) const 325 bool RenderLayerCompositor::hasAnyAdditionalCompositedLayers(const RenderLayer* rootLayer) const
326 { 326 {
327 return m_compositedLayerCount > (rootLayer->isComposited() ? 1 : 0); 327 return m_compositedLayerCount > (rootLayer->compositedLayerMapping() ? 1 : 0 );
328 } 328 }
329 329
330 void RenderLayerCompositor::updateCompositingRequirementsState() 330 void RenderLayerCompositor::updateCompositingRequirementsState()
331 { 331 {
332 if (!m_needsUpdateCompositingRequirementsState) 332 if (!m_needsUpdateCompositingRequirementsState)
333 return; 333 return;
334 334
335 TRACE_EVENT0("blink_rendering,comp-scroll", "RenderLayerCompositor::updateCo mpositingRequirementsState"); 335 TRACE_EVENT0("blink_rendering,comp-scroll", "RenderLayerCompositor::updateCo mpositingRequirementsState");
336 336
337 m_needsUpdateCompositingRequirementsState = false; 337 m_needsUpdateCompositingRequirementsState = false;
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoor dinator()) 636 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoor dinator())
637 scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderVie w->frameView()); 637 scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderVie w->frameView());
638 } 638 }
639 } 639 }
640 640
641 return layerChanged; 641 return layerChanged;
642 } 642 }
643 643
644 bool RenderLayerCompositor::updateLayerCompositingState(RenderLayer* layer, Comp ositingChangeRepaint shouldRepaint) 644 bool RenderLayerCompositor::updateLayerCompositingState(RenderLayer* layer, Comp ositingChangeRepaint shouldRepaint)
645 { 645 {
646 CompositingState stateBeforeUpdating = layer->compositingState();
646 bool layerChanged = allocateOrClearCompositedLayerMapping(layer, shouldRepai nt); 647 bool layerChanged = allocateOrClearCompositedLayerMapping(layer, shouldRepai nt);
647 648
648 // See if we need content or clipping layers. Methods called here should ass ume 649 // See if we need content or clipping layers. Methods called here should ass ume
649 // that the compositing state of descendant layers has not been updated yet. 650 // that the compositing state of descendant layers has not been updated yet.
650 if (layer->compositedLayerMapping() && layer->compositedLayerMapping()->upda teGraphicsLayerConfiguration()) 651 if (layer->compositedLayerMapping() && layer->compositedLayerMapping()->upda teGraphicsLayerConfiguration())
651 layerChanged = true; 652 layerChanged = true;
652 653
653 return layerChanged; 654 // While this code is gradually evolving, this sanity check will help.
655 CompositingState stateAfterUpdating = layer->compositingState();
656 bool compositingStateChanged = (stateBeforeUpdating != stateAfterUpdating);
657 ASSERT(layerChanged == compositingStateChanged);
658
659 // Return true for either condition to avoid bugs in production code.
660 return layerChanged || compositingStateChanged;
654 } 661 }
655 662
656 void RenderLayerCompositor::repaintOnCompositingChange(RenderLayer* layer) 663 void RenderLayerCompositor::repaintOnCompositingChange(RenderLayer* layer)
657 { 664 {
658 // If the renderer is not attached yet, no need to repaint. 665 // If the renderer is not attached yet, no need to repaint.
659 if (layer->renderer() != m_renderView && !layer->renderer()->parent()) 666 if (layer->renderer() != m_renderView && !layer->renderer()->parent())
660 return; 667 return;
661 668
662 RenderLayerModelObject* repaintContainer = layer->renderer()->containerForRe paint(); 669 RenderLayerModelObject* repaintContainer = layer->renderer()->containerForRe paint();
663 if (!repaintContainer) 670 if (!repaintContainer)
664 repaintContainer = m_renderView; 671 repaintContainer = m_renderView;
665 672
666 layer->repainter().repaintIncludingNonCompositingDescendants(repaintContaine r); 673 layer->repainter().repaintIncludingNonCompositingDescendants(repaintContaine r);
667 } 674 }
668 675
669 // This method assumes that layout is up-to-date, unlike repaintOnCompositingCha nge(). 676 // This method assumes that layout is up-to-date, unlike repaintOnCompositingCha nge().
670 void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer* layer, cons t LayoutRect& rect) 677 void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer* layer, cons t LayoutRect& rect)
671 { 678 {
672 RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint (false /*exclude self*/); 679 RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint (false /*exclude self*/);
673 if (compositedAncestor) { 680 if (compositedAncestor) {
674 ASSERT(compositedAncestor->compositedLayerMapping()); 681 ASSERT(compositedAncestor->compositingState() == PaintsIntoOwnBacking);
675 682
676 LayoutPoint offset; 683 LayoutPoint offset;
677 layer->convertToLayerCoords(compositedAncestor, offset); 684 layer->convertToLayerCoords(compositedAncestor, offset);
678 685
679 LayoutRect repaintRect = rect; 686 LayoutRect repaintRect = rect;
680 repaintRect.moveBy(offset); 687 repaintRect.moveBy(offset);
681 688
682 compositedAncestor->setBackingNeedsRepaintInRect(repaintRect); 689 compositedAncestor->setBackingNeedsRepaintInRect(repaintRect);
683 } 690 }
684 } 691 }
(...skipping 14 matching lines...) Expand all
699 return layer->calculateLayerBounds(ancestorLayer, 0, flags); 706 return layer->calculateLayerBounds(ancestorLayer, 0, flags);
700 } 707 }
701 708
702 void RenderLayerCompositor::layerWasAdded(RenderLayer* /*parent*/, RenderLayer* /*child*/) 709 void RenderLayerCompositor::layerWasAdded(RenderLayer* /*parent*/, RenderLayer* /*child*/)
703 { 710 {
704 setCompositingLayersNeedRebuild(); 711 setCompositingLayersNeedRebuild();
705 } 712 }
706 713
707 void RenderLayerCompositor::layerWillBeRemoved(RenderLayer* parent, RenderLayer* child) 714 void RenderLayerCompositor::layerWillBeRemoved(RenderLayer* parent, RenderLayer* child)
708 { 715 {
709 if (!child->isComposited() || parent->renderer()->documentBeingDestroyed()) 716 if (!child->compositedLayerMapping() || parent->renderer()->documentBeingDes troyed())
710 return; 717 return;
711 718
712 removeViewportConstrainedLayer(child); 719 removeViewportConstrainedLayer(child);
713 repaintInCompositedAncestor(child, child->compositedLayerMapping()->composit edBounds()); 720 repaintInCompositedAncestor(child, child->compositedLayerMapping()->composit edBounds());
714 721
715 setCompositingParent(child, 0); 722 setCompositingParent(child, 0);
716 setCompositingLayersNeedRebuild(); 723 setCompositingLayersNeedRebuild();
717 } 724 }
718 725
719 RenderLayer* RenderLayerCompositor::enclosingNonStackingClippingLayer(const Rend erLayer* layer) const 726 RenderLayer* RenderLayerCompositor::enclosingNonStackingClippingLayer(const Rend erLayer* layer) const
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 layer->reflectionLayer()->setCompositingReasons(layer->reflectionLayer() ->compositingReasons() | reflectionCompositingReason); 1021 layer->reflectionLayer()->setCompositingReasons(layer->reflectionLayer() ->compositingReasons() | reflectionCompositingReason);
1015 } 1022 }
1016 1023
1017 // Subsequent layers in the parent's stacking context may also need to compo site. 1024 // Subsequent layers in the parent's stacking context may also need to compo site.
1018 if (childRecursionData.m_subtreeIsCompositing) 1025 if (childRecursionData.m_subtreeIsCompositing)
1019 currentRecursionData.m_subtreeIsCompositing = true; 1026 currentRecursionData.m_subtreeIsCompositing = true;
1020 1027
1021 // Set the flag to say that this SC has compositing children. 1028 // Set the flag to say that this SC has compositing children.
1022 layer->setHasCompositingDescendant(childRecursionData.m_subtreeIsCompositing ); 1029 layer->setHasCompositingDescendant(childRecursionData.m_subtreeIsCompositing );
1023 1030
1024
1025 // Turn overlap testing off for later layers if it's already off, or if we h ave an animating transform. 1031 // Turn overlap testing off for later layers if it's already off, or if we h ave an animating transform.
1026 // Note that if the layer clips its descendants, there's no reason to propag ate the child animation to the parent layers. That's because 1032 // Note that if the layer clips its descendants, there's no reason to propag ate the child animation to the parent layers. That's because
1027 // we know for sure the animation is contained inside the clipping rectangle , which is already added to the overlap map. 1033 // we know for sure the animation is contained inside the clipping rectangle , which is already added to the overlap map.
1028 bool isCompositedClippingLayer = canBeComposited(layer) && (reasonsToComposi te & CompositingReasonClipsCompositingDescendants); 1034 bool isCompositedClippingLayer = canBeComposited(layer) && (reasonsToComposi te & CompositingReasonClipsCompositingDescendants);
1029 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer->renderer())) 1035 if ((!childRecursionData.m_testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer->renderer()))
1030 currentRecursionData.m_testingOverlap = false; 1036 currentRecursionData.m_testingOverlap = false;
1031 1037
1032 if (overlapMap && childRecursionData.m_compositingAncestor == layer && !laye r->isRootLayer()) 1038 if (overlapMap && childRecursionData.m_compositingAncestor == layer && !laye r->isRootLayer())
1033 overlapMap->finishCurrentOverlapTestingContext(); 1039 overlapMap->finishCurrentOverlapTestingContext();
1034 1040
(...skipping 19 matching lines...) Expand all
1054 1060
1055 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DTrans form(); 1061 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DTrans form();
1056 1062
1057 if (overlapMap) 1063 if (overlapMap)
1058 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer); 1064 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer);
1059 } 1065 }
1060 1066
1061 void RenderLayerCompositor::setCompositingParent(RenderLayer* childLayer, Render Layer* parentLayer) 1067 void RenderLayerCompositor::setCompositingParent(RenderLayer* childLayer, Render Layer* parentLayer)
1062 { 1068 {
1063 ASSERT(!parentLayer || childLayer->ancestorCompositingLayer() == parentLayer ); 1069 ASSERT(!parentLayer || childLayer->ancestorCompositingLayer() == parentLayer );
1064 ASSERT(childLayer->isComposited()); 1070 ASSERT(childLayer->compositedLayerMapping());
1065 1071
1066 // It's possible to be called with a parent that isn't yet composited when w e're doing 1072 // It's possible to be called with a parent that isn't yet composited when w e're doing
1067 // partial updates as required by painting or hit testing. Just bail in that case; 1073 // partial updates as required by painting or hit testing. Just bail in that case;
1068 // we'll do a full layer update soon. 1074 // we'll do a full layer update soon.
1069 if (!parentLayer || !parentLayer->isComposited()) 1075 if (!parentLayer || !parentLayer->compositedLayerMapping())
1070 return; 1076 return;
1071 1077
1072 if (parentLayer) { 1078 if (parentLayer) {
1073 GraphicsLayer* hostingLayer = parentLayer->compositedLayerMapping()->par entForSublayers(); 1079 GraphicsLayer* hostingLayer = parentLayer->compositedLayerMapping()->par entForSublayers();
1074 GraphicsLayer* hostedLayer = childLayer->compositedLayerMapping()->child ForSuperlayers(); 1080 GraphicsLayer* hostedLayer = childLayer->compositedLayerMapping()->child ForSuperlayers();
1075 1081
1076 hostingLayer->addChild(hostedLayer); 1082 hostingLayer->addChild(hostedLayer);
1077 } else { 1083 } else {
1078 childLayer->compositedLayerMapping()->childForSuperlayers()->removeFromP arent(); 1084 childLayer->compositedLayerMapping()->childForSuperlayers()->removeFromP arent();
1079 } 1085 }
1080 } 1086 }
1081 1087
1082 void RenderLayerCompositor::removeCompositedChildren(RenderLayer* layer) 1088 void RenderLayerCompositor::removeCompositedChildren(RenderLayer* layer)
1083 { 1089 {
1084 ASSERT(layer->isComposited()); 1090 ASSERT(layer->compositedLayerMapping());
1085 1091
1086 GraphicsLayer* hostingLayer = layer->compositedLayerMapping()->parentForSubl ayers(); 1092 GraphicsLayer* hostingLayer = layer->compositedLayerMapping()->parentForSubl ayers();
1087 hostingLayer->removeAllChildren(); 1093 hostingLayer->removeAllChildren();
1088 } 1094 }
1089 1095
1090 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const 1096 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const
1091 { 1097 {
1092 if (!m_hasAcceleratedCompositing) 1098 if (!m_hasAcceleratedCompositing)
1093 return false; 1099 return false;
1094 1100
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 return 0; 1369 return 0;
1364 } 1370 }
1365 1371
1366 bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer) 1372 bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer)
1367 { 1373 {
1368 RenderLayerCompositor* innerCompositor = frameContentsCompositor(renderer); 1374 RenderLayerCompositor* innerCompositor = frameContentsCompositor(renderer);
1369 if (!innerCompositor || !innerCompositor->inCompositingMode() || innerCompos itor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame) 1375 if (!innerCompositor || !innerCompositor->inCompositingMode() || innerCompos itor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame)
1370 return false; 1376 return false;
1371 1377
1372 RenderLayer* layer = renderer->layer(); 1378 RenderLayer* layer = renderer->layer();
1373 if (!layer->isComposited()) 1379 if (!layer->compositedLayerMapping())
1374 return false; 1380 return false;
1375 1381
1376 CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMappi ng(); 1382 CompositedLayerMapping* compositedLayerMapping = layer->compositedLayerMappi ng();
1377 GraphicsLayer* hostingLayer = compositedLayerMapping->parentForSublayers(); 1383 GraphicsLayer* hostingLayer = compositedLayerMapping->parentForSublayers();
1378 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer(); 1384 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer();
1379 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) { 1385 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) {
1380 hostingLayer->removeAllChildren(); 1386 hostingLayer->removeAllChildren();
1381 hostingLayer->addChild(rootLayer); 1387 hostingLayer->addChild(rootLayer);
1382 } 1388 }
1383 return true; 1389 return true;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 1495
1490 1496
1491 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect) 1497 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect)
1492 { 1498 {
1493 recursiveRepaintLayer(rootRenderLayer(), absRect); 1499 recursiveRepaintLayer(rootRenderLayer(), absRect);
1494 } 1500 }
1495 1501
1496 void RenderLayerCompositor::recursiveRepaintLayer(RenderLayer* layer, const IntR ect* rect) 1502 void RenderLayerCompositor::recursiveRepaintLayer(RenderLayer* layer, const IntR ect* rect)
1497 { 1503 {
1498 // FIXME: This method does not work correctly with transforms. 1504 // FIXME: This method does not work correctly with transforms.
1499 if (layer->isComposited() && !layer->compositedLayerMapping()->paintsIntoCom positedAncestor()) { 1505 if (layer->compositingState() == PaintsIntoOwnBacking) {
1500 if (rect) 1506 if (rect)
1501 layer->setBackingNeedsRepaintInRect(*rect); 1507 layer->setBackingNeedsRepaintInRect(*rect);
1502 else 1508 else
1503 layer->setBackingNeedsRepaint(); 1509 layer->setBackingNeedsRepaint();
1504 } 1510 }
1505 1511
1506 #if !ASSERT_DISABLED 1512 #if !ASSERT_DISABLED
1507 LayerListMutationDetector mutationChecker(layer); 1513 LayerListMutationDetector mutationChecker(layer);
1508 #endif 1514 #endif
1509 1515
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1582 1588
1583 detachRootLayer(); 1589 detachRootLayer();
1584 } 1590 }
1585 } 1591 }
1586 1592
1587 void RenderLayerCompositor::clearMappingForRenderLayerIncludingDescendants(Rende rLayer* layer) 1593 void RenderLayerCompositor::clearMappingForRenderLayerIncludingDescendants(Rende rLayer* layer)
1588 { 1594 {
1589 if (!layer) 1595 if (!layer)
1590 return; 1596 return;
1591 1597
1592 if (layer->isComposited()) { 1598 if (layer->compositedLayerMapping()) {
1593 removeViewportConstrainedLayer(layer); 1599 removeViewportConstrainedLayer(layer);
1594 layer->clearCompositedLayerMapping(); 1600 layer->clearCompositedLayerMapping();
1595 } 1601 }
1596 1602
1597 for (RenderLayer* currLayer = layer->firstChild(); currLayer; currLayer = cu rrLayer->nextSibling()) 1603 for (RenderLayer* currLayer = layer->firstChild(); currLayer; currLayer = cu rrLayer->nextSibling())
1598 clearMappingForRenderLayerIncludingDescendants(currLayer); 1604 clearMappingForRenderLayerIncludingDescendants(currLayer);
1599 } 1605 }
1600 1606
1601 void RenderLayerCompositor::clearMappingForAllRenderLayers() 1607 void RenderLayerCompositor::clearMappingForAllRenderLayers()
1602 { 1608 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1636 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const 1642 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
1637 { 1643 {
1638 // FIXME: We disable accelerated compositing for elements in a RenderFlowThr ead as it doesn't work properly. 1644 // FIXME: We disable accelerated compositing for elements in a RenderFlowThr ead as it doesn't work properly.
1639 // See http://webkit.org/b/84900 to re-enable it. 1645 // See http://webkit.org/b/84900 to re-enable it.
1640 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && layer- >renderer()->flowThreadState() == RenderObject::NotInsideFlowThread; 1646 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && layer- >renderer()->flowThreadState() == RenderObject::NotInsideFlowThread;
1641 } 1647 }
1642 1648
1643 bool RenderLayerCompositor::requiresOwnBackingStore(const RenderLayer* layer, co nst RenderLayer* compositingAncestorLayer) const 1649 bool RenderLayerCompositor::requiresOwnBackingStore(const RenderLayer* layer, co nst RenderLayer* compositingAncestorLayer) const
1644 { 1650 {
1645 RenderObject* renderer = layer->renderer(); 1651 RenderObject* renderer = layer->renderer();
1652
1653 // A layer definitely needs its own backing if we cannot paint into the comp osited ancestor.
1646 if (compositingAncestorLayer 1654 if (compositingAncestorLayer
1647 && !(compositingAncestorLayer->compositedLayerMapping()->mainGraphicsLay er()->drawsContent() 1655 && !(compositingAncestorLayer->compositedLayerMapping()->mainGraphicsLay er()->drawsContent()
1648 || compositingAncestorLayer->compositedLayerMapping()->paintsIntoCom positedAncestor())) 1656 || compositingAncestorLayer->compositedLayerMapping()->paintsIntoCom positedAncestor()))
1649 return true; 1657 return true;
1650 1658
1651 if (layer->isRootLayer() 1659 if (layer->isRootLayer()
1652 || layer->transform() // note: excludes perspective and transformStyle3D . 1660 || layer->transform() // note: excludes perspective and transformStyle3D .
1653 || requiresCompositingForVideo(renderer) 1661 || requiresCompositingForVideo(renderer)
1654 || requiresCompositingForCanvas(renderer) 1662 || requiresCompositingForCanvas(renderer)
1655 || requiresCompositingForPlugin(renderer) 1663 || requiresCompositingForPlugin(renderer)
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 if (requiresCompositingForOutOfFlowClipping(layer)) 1734 if (requiresCompositingForOutOfFlowClipping(layer))
1727 directReasons |= CompositingReasonOutOfFlowClipping; 1735 directReasons |= CompositingReasonOutOfFlowClipping;
1728 1736
1729 return directReasons; 1737 return directReasons;
1730 } 1738 }
1731 1739
1732 CompositingReasons RenderLayerCompositor::reasonsForCompositing(const RenderLaye r* layer) const 1740 CompositingReasons RenderLayerCompositor::reasonsForCompositing(const RenderLaye r* layer) const
1733 { 1741 {
1734 CompositingReasons reasons = CompositingReasonNone; 1742 CompositingReasons reasons = CompositingReasonNone;
1735 1743
1736 if (!layer || !layer->isComposited()) 1744 if (!layer || !layer->compositedLayerMapping())
1737 return reasons; 1745 return reasons;
1738 1746
1739 return layer->compositingReasons(); 1747 return layer->compositingReasons();
1740 } 1748 }
1741 1749
1742 #if !LOG_DISABLED 1750 #if !LOG_DISABLED
1743 const char* RenderLayerCompositor::logReasonsForCompositing(const RenderLayer* l ayer) 1751 const char* RenderLayerCompositor::logReasonsForCompositing(const RenderLayer* l ayer)
1744 { 1752 {
1745 CompositingReasons reasons = reasonsForCompositing(layer); 1753 CompositingReasons reasons = reasonsForCompositing(layer);
1746 1754
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 } 1825 }
1818 #endif 1826 #endif
1819 1827
1820 // Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips, 1828 // Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips,
1821 // up to the enclosing compositing ancestor. This is required because compositin g layers are parented 1829 // up to the enclosing compositing ancestor. This is required because compositin g layers are parented
1822 // according to the z-order hierarchy, yet clipping goes down the renderer hiera rchy. 1830 // according to the z-order hierarchy, yet clipping goes down the renderer hiera rchy.
1823 // Thus, a RenderLayer can be clipped by a RenderLayer that is an ancestor in th e renderer hierarchy, 1831 // Thus, a RenderLayer can be clipped by a RenderLayer that is an ancestor in th e renderer hierarchy,
1824 // but a sibling in the z-order hierarchy. 1832 // but a sibling in the z-order hierarchy.
1825 bool RenderLayerCompositor::clippedByAncestor(const RenderLayer* layer) const 1833 bool RenderLayerCompositor::clippedByAncestor(const RenderLayer* layer) const
1826 { 1834 {
1827 if (!layer->isComposited() || !layer->parent()) 1835 if (!layer->compositedLayerMapping() || !layer->parent())
1828 return false; 1836 return false;
1829 1837
1830 const RenderLayer* compositingAncestor = layer->ancestorCompositingLayer(); 1838 const RenderLayer* compositingAncestor = layer->ancestorCompositingLayer();
1831 if (!compositingAncestor) 1839 if (!compositingAncestor)
1832 return false; 1840 return false;
1833 1841
1834 // If the compositingAncestor clips, that will be taken care of by clipsComp ositingDescendants(), 1842 // If the compositingAncestor clips, that will be taken care of by clipsComp ositingDescendants(),
1835 // so we only care about clipping between its first child that is our ancest or (the computeClipRoot), 1843 // so we only care about clipping between its first child that is our ancest or (the computeClipRoot),
1836 // and layer. 1844 // and layer.
1837 const RenderLayer* computeClipRoot = 0; 1845 const RenderLayer* computeClipRoot = 0;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 1934
1927 bool composite = renderer->isEmbeddedObject() && toRenderEmbeddedObject(rend erer)->allowsAcceleratedCompositing(); 1935 bool composite = renderer->isEmbeddedObject() && toRenderEmbeddedObject(rend erer)->allowsAcceleratedCompositing();
1928 if (!composite) 1936 if (!composite)
1929 return false; 1937 return false;
1930 1938
1931 m_reevaluateCompositingAfterLayout = true; 1939 m_reevaluateCompositingAfterLayout = true;
1932 1940
1933 RenderWidget* pluginRenderer = toRenderWidget(renderer); 1941 RenderWidget* pluginRenderer = toRenderWidget(renderer);
1934 // If we can't reliably know the size of the plugin yet, don't change compos iting state. 1942 // If we can't reliably know the size of the plugin yet, don't change compos iting state.
1935 if (pluginRenderer->needsLayout()) 1943 if (pluginRenderer->needsLayout())
1936 return pluginRenderer->hasLayer() && pluginRenderer->layer()->isComposit ed(); 1944 return pluginRenderer->hasLayer() && pluginRenderer->layer()->composited LayerMapping();
1937 1945
1938 // Don't go into compositing mode if height or width are zero, or size is 1x 1. 1946 // Don't go into compositing mode if height or width are zero, or size is 1x 1.
1939 IntRect contentBox = pixelSnappedIntRect(pluginRenderer->contentBoxRect()); 1947 IntRect contentBox = pixelSnappedIntRect(pluginRenderer->contentBoxRect());
1940 return contentBox.height() * contentBox.width() > 1; 1948 return contentBox.height() * contentBox.width() > 1;
1941 } 1949 }
1942 1950
1943 bool RenderLayerCompositor::requiresCompositingForFrame(RenderObject* renderer) const 1951 bool RenderLayerCompositor::requiresCompositingForFrame(RenderObject* renderer) const
1944 { 1952 {
1945 if (!renderer->isRenderPart()) 1953 if (!renderer->isRenderPart())
1946 return false; 1954 return false;
1947 1955
1948 RenderPart* frameRenderer = toRenderPart(renderer); 1956 RenderPart* frameRenderer = toRenderPart(renderer);
1949 1957
1950 if (!frameRenderer->requiresAcceleratedCompositing()) 1958 if (!frameRenderer->requiresAcceleratedCompositing())
1951 return false; 1959 return false;
1952 1960
1953 m_reevaluateCompositingAfterLayout = true; 1961 m_reevaluateCompositingAfterLayout = true;
1954 1962
1955 RenderLayerCompositor* innerCompositor = frameContentsCompositor(frameRender er); 1963 RenderLayerCompositor* innerCompositor = frameContentsCompositor(frameRender er);
1956 if (!innerCompositor) 1964 if (!innerCompositor)
1957 return false; 1965 return false;
1958 1966
1959 // If we can't reliably know the size of the iframe yet, don't change compos iting state. 1967 // If we can't reliably know the size of the iframe yet, don't change compos iting state.
1960 if (renderer->needsLayout()) 1968 if (renderer->needsLayout())
1961 return frameRenderer->hasLayer() && frameRenderer->layer()->isComposited (); 1969 return frameRenderer->hasLayer() && frameRenderer->layer()->compositedLa yerMapping();
1962 1970
1963 // Don't go into compositing mode if height or width are zero. 1971 // Don't go into compositing mode if height or width are zero.
1964 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect()); 1972 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect());
1965 return contentBox.height() * contentBox.width() > 0; 1973 return contentBox.height() * contentBox.width() > 0;
1966 } 1974 }
1967 1975
1968 bool RenderLayerCompositor::requiresCompositingForBackfaceVisibilityHidden(Rende rObject* renderer) const 1976 bool RenderLayerCompositor::requiresCompositingForBackfaceVisibilityHidden(Rende rObject* renderer) const
1969 { 1977 {
1970 return canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden; 1978 return canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden;
1971 } 1979 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2126 2134
2127 if (!hasScrollableAncestor) { 2135 if (!hasScrollableAncestor) {
2128 if (viewportConstrainedNotCompositedReason) 2136 if (viewportConstrainedNotCompositedReason)
2129 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForUnscrollableAncestors; 2137 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForUnscrollableAncestors;
2130 return false; 2138 return false;
2131 } 2139 }
2132 2140
2133 // Subsequent tests depend on layout. If we can't tell now, just keep things the way they are until layout is done. 2141 // Subsequent tests depend on layout. If we can't tell now, just keep things the way they are until layout is done.
2134 if (!m_inPostLayoutUpdate) { 2142 if (!m_inPostLayoutUpdate) {
2135 m_reevaluateCompositingAfterLayout = true; 2143 m_reevaluateCompositingAfterLayout = true;
2136 return layer->isComposited(); 2144 return layer->compositedLayerMapping();
2137 } 2145 }
2138 2146
2139 bool paintsContent = layer->isVisuallyNonEmpty() || layer->hasVisibleDescend ant(); 2147 bool paintsContent = layer->isVisuallyNonEmpty() || layer->hasVisibleDescend ant();
2140 if (!paintsContent) { 2148 if (!paintsContent) {
2141 if (viewportConstrainedNotCompositedReason) 2149 if (viewportConstrainedNotCompositedReason)
2142 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForNoVisibleContent; 2150 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForNoVisibleContent;
2143 return false; 2151 return false;
2144 } 2152 }
2145 2153
2146 // Fixed position elements that are invisible in the current view don't get their own layer. 2154 // Fixed position elements that are invisible in the current view don't get their own layer.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
2237 return supportsFixedRootBackgroundCompositing() && m_renderView->rootBackgro undIsEntirelyFixed(); 2245 return supportsFixedRootBackgroundCompositing() && m_renderView->rootBackgro undIsEntirelyFixed();
2238 } 2246 }
2239 2247
2240 GraphicsLayer* RenderLayerCompositor::fixedRootBackgroundLayer() const 2248 GraphicsLayer* RenderLayerCompositor::fixedRootBackgroundLayer() const
2241 { 2249 {
2242 // Get the fixed root background from the RenderView layer's compositedLayer Mapping. 2250 // Get the fixed root background from the RenderView layer's compositedLayer Mapping.
2243 RenderLayer* viewLayer = m_renderView->layer(); 2251 RenderLayer* viewLayer = m_renderView->layer();
2244 if (!viewLayer) 2252 if (!viewLayer)
2245 return 0; 2253 return 0;
2246 2254
2247 if (viewLayer->isComposited() && viewLayer->compositedLayerMapping()->backgr oundLayerPaintsFixedRootBackground()) 2255 if (viewLayer->compositingState() == PaintsIntoOwnBacking && viewLayer->comp ositedLayerMapping()->backgroundLayerPaintsFixedRootBackground())
2248 return viewLayer->compositedLayerMapping()->backgroundLayer(); 2256 return viewLayer->compositedLayerMapping()->backgroundLayer();
2249 2257
2250 return 0; 2258 return 0;
2251 } 2259 }
2252 2260
2253 static void resetTrackedRepaintRectsRecursive(GraphicsLayer* graphicsLayer) 2261 static void resetTrackedRepaintRectsRecursive(GraphicsLayer* graphicsLayer)
2254 { 2262 {
2255 if (!graphicsLayer) 2263 if (!graphicsLayer)
2256 return; 2264 return;
2257 2265
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
2650 2658
2651 static bool isRootmostFixedOrStickyLayer(RenderLayer* layer) 2659 static bool isRootmostFixedOrStickyLayer(RenderLayer* layer)
2652 { 2660 {
2653 if (layer->renderer()->isStickyPositioned()) 2661 if (layer->renderer()->isStickyPositioned())
2654 return true; 2662 return true;
2655 2663
2656 if (layer->renderer()->style()->position() != FixedPosition) 2664 if (layer->renderer()->style()->position() != FixedPosition)
2657 return false; 2665 return false;
2658 2666
2659 for (RenderLayer* stackingContainer = layer->ancestorStackingContainer(); st ackingContainer; stackingContainer = stackingContainer->ancestorStackingContaine r()) { 2667 for (RenderLayer* stackingContainer = layer->ancestorStackingContainer(); st ackingContainer; stackingContainer = stackingContainer->ancestorStackingContaine r()) {
2660 if (stackingContainer->isComposited() && stackingContainer->renderer()-> style()->position() == FixedPosition) 2668 if (stackingContainer->compositedLayerMapping() && stackingContainer->re nderer()->style()->position() == FixedPosition)
2661 return false; 2669 return false;
2662 } 2670 }
2663 2671
2664 return true; 2672 return true;
2665 } 2673 }
2666 2674
2667 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer) 2675 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer)
2668 { 2676 {
2669 if (isRootmostFixedOrStickyLayer(layer)) 2677 if (isRootmostFixedOrStickyLayer(layer))
2670 addViewportConstrainedLayer(layer); 2678 addViewportConstrainedLayer(layer);
2671 else 2679 else
2672 removeViewportConstrainedLayer(layer); 2680 removeViewportConstrainedLayer(layer);
2673 } 2681 }
2674 2682
2675 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer) 2683 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer)
2676 { 2684 {
2677 m_viewportConstrainedLayers.add(layer); 2685 m_viewportConstrainedLayers.add(layer);
2678 } 2686 }
2679 2687
2680 void RenderLayerCompositor::removeViewportConstrainedLayer(RenderLayer* layer) 2688 void RenderLayerCompositor::removeViewportConstrainedLayer(RenderLayer* layer)
2681 { 2689 {
2682 if (!m_viewportConstrainedLayers.contains(layer)) 2690 if (!m_viewportConstrainedLayers.contains(layer))
2683 return; 2691 return;
2684 2692
2685 m_viewportConstrainedLayers.remove(layer); 2693 m_viewportConstrainedLayers.remove(layer);
2686 } 2694 }
2687 2695
2688 FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportCons traints(RenderLayer* layer) const 2696 FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportCons traints(RenderLayer* layer) const
2689 { 2697 {
2690 ASSERT(layer->isComposited()); 2698 ASSERT(layer->compositedLayerMapping());
2691 2699
2692 FrameView* frameView = m_renderView->frameView(); 2700 FrameView* frameView = m_renderView->frameView();
2693 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ; 2701 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ;
2694 2702
2695 FixedPositionViewportConstraints constraints; 2703 FixedPositionViewportConstraints constraints;
2696 2704
2697 GraphicsLayer* graphicsLayer = layer->compositedLayerMapping()->mainGraphics Layer(); 2705 GraphicsLayer* graphicsLayer = layer->compositedLayerMapping()->mainGraphics Layer();
2698 2706
2699 constraints.setLayerPositionAtLastLayout(graphicsLayer->position()); 2707 constraints.setLayerPositionAtLastLayout(graphicsLayer->position());
2700 constraints.setViewportRectAtLastLayout(viewportRect); 2708 constraints.setViewportRectAtLastLayout(viewportRect);
(...skipping 17 matching lines...) Expand all
2718 2726
2719 // If top and bottom are auto, use top. 2727 // If top and bottom are auto, use top.
2720 if (style->top().isAuto() && style->bottom().isAuto()) 2728 if (style->top().isAuto() && style->bottom().isAuto())
2721 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop); 2729 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop);
2722 2730
2723 return constraints; 2731 return constraints;
2724 } 2732 }
2725 2733
2726 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo nstraints(RenderLayer* layer) const 2734 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo nstraints(RenderLayer* layer) const
2727 { 2735 {
2728 ASSERT(layer->isComposited()); 2736 ASSERT(layer->compositedLayerMapping());
2729 2737
2730 FrameView* frameView = m_renderView->frameView(); 2738 FrameView* frameView = m_renderView->frameView();
2731 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ; 2739 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ;
2732 2740
2733 StickyPositionViewportConstraints constraints; 2741 StickyPositionViewportConstraints constraints;
2734 2742
2735 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer()); 2743 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer());
2736 2744
2737 renderer->computeStickyPositionConstraints(constraints, viewportRect); 2745 renderer->computeStickyPositionConstraints(constraints, viewportRect);
2738 2746
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2788 } else if (graphicsLayer == m_scrollLayer.get()) { 2796 } else if (graphicsLayer == m_scrollLayer.get()) {
2789 name = "Frame Scrolling Layer"; 2797 name = "Frame Scrolling Layer";
2790 } else { 2798 } else {
2791 ASSERT_NOT_REACHED(); 2799 ASSERT_NOT_REACHED();
2792 } 2800 }
2793 2801
2794 return name; 2802 return name;
2795 } 2803 }
2796 2804
2797 } // namespace WebCore 2805 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698