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

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 first round of reviewer comments 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 } 173 }
174 174
175 RenderGeometryMap& geometryMap() { return m_geometryMap; } 175 RenderGeometryMap& geometryMap() { return m_geometryMap; }
176 176
177 private: 177 private:
178 Vector<OverlapMapContainer> m_overlapStack; 178 Vector<OverlapMapContainer> m_overlapStack;
179 HashSet<const RenderLayer*> m_layers; 179 HashSet<const RenderLayer*> m_layers;
180 RenderGeometryMap m_geometryMap; 180 RenderGeometryMap m_geometryMap;
181 }; 181 };
182 182
183 struct CompositingState { 183 struct CompositingRecursionData {
Julien - ping for review 2013/10/03 20:08:36 This renamed feels like it's piggy backing on an a
shawnsingh 2013/10/07 11:45:04 Done, landed this separately already, since it was
184 CompositingState(RenderLayer* compAncestor, bool testOverlap) 184 CompositingRecursionData(RenderLayer* compAncestor, bool testOverlap)
185 : m_compositingAncestor(compAncestor) 185 : m_compositingAncestor(compAncestor)
186 , m_subtreeIsCompositing(false) 186 , m_subtreeIsCompositing(false)
187 , m_testingOverlap(testOverlap) 187 , m_testingOverlap(testOverlap)
188 #ifndef NDEBUG 188 #ifndef NDEBUG
189 , m_depth(0) 189 , m_depth(0)
190 #endif 190 #endif
191 { 191 {
192 } 192 }
193 193
194 CompositingState(const CompositingState& other) 194 CompositingRecursionData(const CompositingRecursionData& other)
195 : m_compositingAncestor(other.m_compositingAncestor) 195 : m_compositingAncestor(other.m_compositingAncestor)
196 , m_subtreeIsCompositing(other.m_subtreeIsCompositing) 196 , m_subtreeIsCompositing(other.m_subtreeIsCompositing)
197 , m_testingOverlap(other.m_testingOverlap) 197 , m_testingOverlap(other.m_testingOverlap)
198 #ifndef NDEBUG 198 #ifndef NDEBUG
199 , m_depth(other.m_depth + 1) 199 , m_depth(other.m_depth + 1)
200 #endif 200 #endif
201 { 201 {
202 } 202 }
203 203
204 RenderLayer* m_compositingAncestor; 204 RenderLayer* m_compositingAncestor;
(...skipping 112 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->backing() ? 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 double startTime = 0; 421 double startTime = 0;
422 if (compositingLogEnabled()) { 422 if (compositingLogEnabled()) {
423 ++m_rootLayerUpdateCount; 423 ++m_rootLayerUpdateCount;
424 startTime = currentTime(); 424 startTime = currentTime();
425 } 425 }
426 #endif 426 #endif
427 427
428 if (checkForHierarchyUpdate) { 428 if (checkForHierarchyUpdate) {
429 // Go through the layers in presentation order, so that we can compute w hich RenderLayers need compositing layers. 429 // Go through the layers in presentation order, so that we can compute w hich RenderLayers need compositing layers.
430 // FIXME: we could maybe do this and the hierarchy udpate in one pass, b ut the parenting logic would be more complex. 430 // FIXME: we could maybe do this and the hierarchy udpate in one pass, b ut the parenting logic would be more complex.
431 CompositingState compState(updateRoot, true); 431 CompositingRecursionData compState(updateRoot, true);
432 bool layersChanged = false; 432 bool layersChanged = false;
433 bool saw3DTransform = false; 433 bool saw3DTransform = false;
434 { 434 {
435 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::computeCompo sitingRequirements"); 435 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::computeCompo sitingRequirements");
436 OverlapMap overlapTestRequestMap; 436 OverlapMap overlapTestRequestMap;
437 437
438 // FIXME: Passing these unclippedDescendants down and keeping track 438 // FIXME: Passing these unclippedDescendants down and keeping track
439 // of them dynamically, we are requiring a full tree walk. This 439 // of them dynamically, we are requiring a full tree walk. This
440 // should be removed as soon as proper overlap testing based on 440 // should be removed as soon as proper overlap testing based on
441 // scrolling and animation bounds is implemented (crbug.com/252472). 441 // scrolling and animation bounds is implemented (crbug.com/252472).
(...skipping 194 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 = updateBacking(layer, shouldRepaint); 647 bool layerChanged = updateBacking(layer, shouldRepaint);
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->backing() && layer->backing()->updateGraphicsLayerConfiguration() ) 651 if (layer->backing() && layer->backing()->updateGraphicsLayerConfiguration() )
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->backing()); 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->backing() || parent->renderer()->documentBeingDestroyed())
710 return; 717 return;
711 718
712 removeViewportConstrainedLayer(child); 719 removeViewportConstrainedLayer(child);
713 repaintInCompositedAncestor(child, child->backing()->compositedBounds()); 720 repaintInCompositedAncestor(child, child->backing()->compositedBounds());
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 806
800 // Recurse through the layers in z-index and overflow order (which is equivalen t to painting order) 807 // Recurse through the layers in z-index and overflow order (which is equivalen t to painting order)
801 // For the z-order children of a compositing layer: 808 // For the z-order children of a compositing layer:
802 // If a child layers has a compositing layer, then all subsequent layers mu st 809 // If a child layers has a compositing layer, then all subsequent layers mu st
803 // be compositing in order to render above that layer. 810 // be compositing in order to render above that layer.
804 // 811 //
805 // If a child in the negative z-order list is compositing, then the layer i tself 812 // If a child in the negative z-order list is compositing, then the layer i tself
806 // must be compositing so that its contents render over that child. 813 // must be compositing so that its contents render over that child.
807 // This implies that its positive z-index children must also be compositing . 814 // This implies that its positive z-index children must also be compositing .
808 // 815 //
809 void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor Layer, RenderLayer* layer, OverlapMap* overlapMap, CompositingState& compositing State, bool& layersChanged, bool& descendantHas3DTransform, Vector<RenderLayer*> & unclippedDescendants) 816 void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor Layer, RenderLayer* layer, OverlapMap* overlapMap, CompositingRecursionData& cur rentRecursionState, bool& layersChanged, bool& descendantHas3DTransform, Vector< RenderLayer*>& unclippedDescendants)
810 { 817 {
811 layer->updateLayerListsIfNeeded(); 818 layer->updateLayerListsIfNeeded();
812 819
813 if (overlapMap) 820 if (overlapMap)
814 overlapMap->geometryMap().pushMappingsToAncestor(layer, ancestorLayer); 821 overlapMap->geometryMap().pushMappingsToAncestor(layer, ancestorLayer);
815 822
816 // Clear the flag 823 // Clear the flag
817 layer->setHasCompositingDescendant(false); 824 layer->setHasCompositingDescendant(false);
818 825
819 // Start by assuming this layer will not need to composite. 826 // Start by assuming this layer will not need to composite.
820 CompositingReasons reasonsToComposite = CompositingReasonNone; 827 CompositingReasons reasonsToComposite = CompositingReasonNone;
821 828
822 // First accumulate the straightforward compositing reasons. 829 // First accumulate the straightforward compositing reasons.
823 CompositingReasons directReasons = directReasonsForCompositing(layer); 830 CompositingReasons directReasons = directReasonsForCompositing(layer);
824 831
825 // Video is special. It's the only RenderLayer type that can both have 832 // Video is special. It's the only RenderLayer type that can both have
826 // RenderLayer children and whose children can't use its backing to render 833 // RenderLayer children and whose children can't use its backing to render
827 // into. These children (the controls) always need to be promoted into their 834 // into. These children (the controls) always need to be promoted into their
828 // own layers to draw on top of the accelerated video. 835 // own layers to draw on top of the accelerated video.
829 if (compositingState.m_compositingAncestor && compositingState.m_compositing Ancestor->renderer()->isVideo()) 836 if (currentRecursionState.m_compositingAncestor && currentRecursionState.m_c ompositingAncestor->renderer()->isVideo())
830 directReasons |= CompositingReasonLayerForVideoOverlay; 837 directReasons |= CompositingReasonLayerForVideoOverlay;
831 838
832 if (canBeComposited(layer)) { 839 if (canBeComposited(layer)) {
833 reasonsToComposite |= directReasons; 840 reasonsToComposite |= directReasons;
834 reasonsToComposite |= (inCompositingMode() && layer->isRootLayer()) ? Co mpositingReasonRoot : CompositingReasonNone; 841 reasonsToComposite |= (inCompositingMode() && layer->isRootLayer()) ? Co mpositingReasonRoot : CompositingReasonNone;
835 } 842 }
836 843
837 // Next, accumulate reasons related to overlap. 844 // Next, accumulate reasons related to overlap.
838 // If overlap testing is used, this reason will be overridden. If overlap te sting is not 845 // If overlap testing is used, this reason will be overridden. If overlap te sting is not
839 // used, we must assume we overlap if there is anything composited behind us in paint-order. 846 // used, we must assume we overlap if there is anything composited behind us in paint-order.
840 CompositingReasons overlapCompositingReason = compositingState.m_subtreeIsCo mpositing ? CompositingReasonAssumedOverlap : CompositingReasonNone; 847 CompositingReasons overlapCompositingReason = currentRecursionState.m_subtre eIsCompositing ? CompositingReasonAssumedOverlap : CompositingReasonNone;
841 848
842 if (rootRenderLayer()->compositorDrivenAcceleratedScrollingEnabled()) { 849 if (rootRenderLayer()->compositorDrivenAcceleratedScrollingEnabled()) {
843 Vector<size_t> unclippedDescendantsToRemove; 850 Vector<size_t> unclippedDescendantsToRemove;
844 for (size_t i = 0; i < unclippedDescendants.size(); i++) { 851 for (size_t i = 0; i < unclippedDescendants.size(); i++) {
845 RenderLayer* unclippedDescendant = unclippedDescendants.at(i); 852 RenderLayer* unclippedDescendant = unclippedDescendants.at(i);
846 // If we've reached the containing block of one of the unclipped 853 // If we've reached the containing block of one of the unclipped
847 // descendants, that element is no longer relevant to whether or not we 854 // descendants, that element is no longer relevant to whether or not we
848 // should opt in. Unfortunately we can't easily remove from the list 855 // should opt in. Unfortunately we can't easily remove from the list
849 // while we're iterating, so we have to store it for later removal. 856 // while we're iterating, so we have to store it for later removal.
850 if (unclippedDescendant->renderer()->containingBlock() == layer->ren derer()) { 857 if (unclippedDescendant->renderer()->containingBlock() == layer->ren derer()) {
851 unclippedDescendantsToRemove.append(i); 858 unclippedDescendantsToRemove.append(i);
852 continue; 859 continue;
853 } 860 }
854 if (layer->scrollsWithRespectTo(unclippedDescendant)) 861 if (layer->scrollsWithRespectTo(unclippedDescendant))
855 reasonsToComposite |= CompositingReasonAssumedOverlap; 862 reasonsToComposite |= CompositingReasonAssumedOverlap;
856 } 863 }
857 864
858 // Remove irrelevant unclipped descendants in reverse order so our store d 865 // Remove irrelevant unclipped descendants in reverse order so our store d
859 // indices remain valid. 866 // indices remain valid.
860 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++) 867 for (size_t i = 0; i < unclippedDescendantsToRemove.size(); i++)
861 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1)); 868 unclippedDescendants.remove(unclippedDescendantsToRemove.at(unclippe dDescendantsToRemove.size() - i - 1));
862 869
863 if (reasonsToComposite & CompositingReasonOutOfFlowClipping) 870 if (reasonsToComposite & CompositingReasonOutOfFlowClipping)
864 unclippedDescendants.append(layer); 871 unclippedDescendants.append(layer);
865 } 872 }
866 873
867 bool haveComputedBounds = false; 874 bool haveComputedBounds = false;
868 IntRect absBounds; 875 IntRect absBounds;
869 // If we know for sure the layer is going to be composited, don't bother loo king it up in the overlap map. 876 // If we know for sure the layer is going to be composited, don't bother loo king it up in the overlap map.
870 if (overlapMap && !overlapMap->isEmpty() && compositingState.m_testingOverla p && !requiresCompositing(directReasons)) { 877 if (overlapMap && !overlapMap->isEmpty() && currentRecursionState.m_testingO verlap && !requiresCompositing(directReasons)) {
871 // If we're testing for overlap, we only need to composite if we overlap something that is already composited. 878 // If we're testing for overlap, we only need to composite if we overlap something that is already composited.
872 absBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect(laye r->overlapBounds())); 879 absBounds = enclosingIntRect(overlapMap->geometryMap().absoluteRect(laye r->overlapBounds()));
873 880
874 // Empty rects never intersect, but we need them to for the purposes of overlap testing. 881 // Empty rects never intersect, but we need them to for the purposes of overlap testing.
875 if (absBounds.isEmpty()) 882 if (absBounds.isEmpty())
876 absBounds.setSize(IntSize(1, 1)); 883 absBounds.setSize(IntSize(1, 1));
877 haveComputedBounds = true; 884 haveComputedBounds = true;
878 overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? Compo sitingReasonOverlap : CompositingReasonNone; 885 overlapCompositingReason = overlapMap->overlapsLayers(absBounds) ? Compo sitingReasonOverlap : CompositingReasonNone;
879 } 886 }
880 887
881 reasonsToComposite |= overlapCompositingReason; 888 reasonsToComposite |= overlapCompositingReason;
882 889
883 // The children of this layer don't need to composite, unless there is 890 // The children of this layer don't need to composite, unless there is
884 // a compositing layer among them, so start by inheriting the compositing 891 // a compositing layer among them, so start by inheriting the compositing
885 // ancestor with m_subtreeIsCompositing set to false. 892 // ancestor with m_subtreeIsCompositing set to false.
886 CompositingState childState(compositingState); 893 CompositingRecursionData childRecursionState(currentRecursionState);
887 childState.m_subtreeIsCompositing = false; 894 childRecursionState.m_subtreeIsCompositing = false;
888 895
889 bool willBeComposited = canBeComposited(layer) && requiresCompositing(reason sToComposite); 896 bool willBeComposited = canBeComposited(layer) && requiresCompositing(reason sToComposite);
890 if (willBeComposited) { 897 if (willBeComposited) {
891 // Tell the parent it has compositing descendants. 898 // Tell the parent it has compositing descendants.
892 compositingState.m_subtreeIsCompositing = true; 899 currentRecursionState.m_subtreeIsCompositing = true;
893 // This layer now acts as the ancestor for kids. 900 // This layer now acts as the ancestor for kids.
894 childState.m_compositingAncestor = layer; 901 childRecursionState.m_compositingAncestor = layer;
895 902
896 // Here we know that all children and the layer's own contents can blind ly paint into 903 // Here we know that all children and the layer's own contents can blind ly paint into
897 // this layer's backing, until a descendant is composited. So, we don't need to check 904 // this layer's backing, until a descendant is composited. So, we don't need to check
898 // for overlap with anything behind this layer. 905 // for overlap with anything behind this layer.
899 if (overlapMap) 906 if (overlapMap)
900 overlapMap->beginNewOverlapTestingContext(); 907 overlapMap->beginNewOverlapTestingContext();
901 // This layer is going to be composited, so children can safely ignore t he fact that there's an 908 // This layer is going to be composited, so children can safely ignore t he fact that there's an
902 // animation running behind this layer, meaning they can rely on the ove rlap map testing again. 909 // animation running behind this layer, meaning they can rely on the ove rlap map testing again.
903 childState.m_testingOverlap = true; 910 childRecursionState.m_testingOverlap = true;
904 } 911 }
905 912
906 #if !ASSERT_DISABLED 913 #if !ASSERT_DISABLED
907 LayerListMutationDetector mutationChecker(layer); 914 LayerListMutationDetector mutationChecker(layer);
908 #endif 915 #endif
909 916
910 bool anyDescendantHas3DTransform = false; 917 bool anyDescendantHas3DTransform = false;
911 bool willHaveForegroundLayer = false; 918 bool willHaveForegroundLayer = false;
912 919
913 if (layer->isStackingContainer()) { 920 if (layer->isStackingContainer()) {
914 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) { 921 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
915 size_t listSize = negZOrderList->size(); 922 size_t listSize = negZOrderList->size();
916 for (size_t i = 0; i < listSize; ++i) { 923 for (size_t i = 0; i < listSize; ++i) {
917 RenderLayer* curLayer = negZOrderList->at(i); 924 RenderLayer* curLayer = negZOrderList->at(i);
918 computeCompositingRequirements(layer, curLayer, overlapMap, chil dState, layersChanged, anyDescendantHas3DTransform, unclippedDescendants); 925 computeCompositingRequirements(layer, curLayer, overlapMap, chil dRecursionState, layersChanged, anyDescendantHas3DTransform, unclippedDescendant s);
919 926
920 // If we have to make a layer for this child, make one now so we can have a contents layer 927 // If we have to make a layer for this child, make one now so we can have a contents layer
921 // (since we need to ensure that the -ve z-order child renders u nderneath our contents). 928 // (since we need to ensure that the -ve z-order child renders u nderneath our contents).
922 if (childState.m_subtreeIsCompositing) { 929 if (childRecursionState.m_subtreeIsCompositing) {
923 reasonsToComposite |= CompositingReasonNegativeZIndexChildre n; 930 reasonsToComposite |= CompositingReasonNegativeZIndexChildre n;
924 931
925 if (!willBeComposited) { 932 if (!willBeComposited) {
926 // make layer compositing 933 // make layer compositing
927 childState.m_compositingAncestor = layer; 934 childRecursionState.m_compositingAncestor = layer;
928 overlapMap->beginNewOverlapTestingContext(); 935 overlapMap->beginNewOverlapTestingContext();
929 willBeComposited = true; 936 willBeComposited = true;
930 willHaveForegroundLayer = true; 937 willHaveForegroundLayer = true;
931 938
932 // FIXME: temporary solution for the first negative z-in dex composited child: 939 // FIXME: temporary solution for the first negative z-in dex composited child:
933 // re-compute the absBounds for the child so that we can add the 940 // re-compute the absBounds for the child so that we can add the
934 // negative z-index child's bounds to the new ove rlap context. 941 // negative z-index child's bounds to the new ove rlap context.
935 if (overlapMap) { 942 if (overlapMap) {
936 overlapMap->geometryMap().pushMappingsToAncestor(cur Layer, layer); 943 overlapMap->geometryMap().pushMappingsToAncestor(cur Layer, layer);
937 IntRect childAbsBounds = enclosingIntRect(overlapMap ->geometryMap().absoluteRect(curLayer->overlapBounds())); 944 IntRect childAbsBounds = enclosingIntRect(overlapMap ->geometryMap().absoluteRect(curLayer->overlapBounds()));
(...skipping 12 matching lines...) Expand all
950 if (overlapMap && willHaveForegroundLayer) { 957 if (overlapMap && willHaveForegroundLayer) {
951 ASSERT(willBeComposited); 958 ASSERT(willBeComposited);
952 // A foreground layer effectively is a new backing for all subsequent ch ildren, so 959 // A foreground layer effectively is a new backing for all subsequent ch ildren, so
953 // we don't need to test for overlap with anything behind this. So, we c an finish 960 // we don't need to test for overlap with anything behind this. So, we c an finish
954 // the previous context that was accumulating rects for the negative z-i ndex 961 // the previous context that was accumulating rects for the negative z-i ndex
955 // children, and start with a fresh new empty context. 962 // children, and start with a fresh new empty context.
956 overlapMap->finishCurrentOverlapTestingContext(); 963 overlapMap->finishCurrentOverlapTestingContext();
957 overlapMap->beginNewOverlapTestingContext(); 964 overlapMap->beginNewOverlapTestingContext();
958 // This layer is going to be composited, so children can safely ignore t he fact that there's an 965 // This layer is going to be composited, so children can safely ignore t he fact that there's an
959 // animation running behind this layer, meaning they can rely on the ove rlap map testing again 966 // animation running behind this layer, meaning they can rely on the ove rlap map testing again
960 childState.m_testingOverlap = true; 967 childRecursionState.m_testingOverlap = true;
961 } 968 }
962 969
963 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) { 970 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
964 size_t listSize = normalFlowList->size(); 971 size_t listSize = normalFlowList->size();
965 for (size_t i = 0; i < listSize; ++i) { 972 for (size_t i = 0; i < listSize; ++i) {
966 RenderLayer* curLayer = normalFlowList->at(i); 973 RenderLayer* curLayer = normalFlowList->at(i);
967 computeCompositingRequirements(layer, curLayer, overlapMap, childSta te, layersChanged, anyDescendantHas3DTransform, unclippedDescendants); 974 computeCompositingRequirements(layer, curLayer, overlapMap, childRec ursionState, layersChanged, anyDescendantHas3DTransform, unclippedDescendants);
968 } 975 }
969 } 976 }
970 977
971 if (layer->isStackingContainer()) { 978 if (layer->isStackingContainer()) {
972 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) { 979 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
973 size_t listSize = posZOrderList->size(); 980 size_t listSize = posZOrderList->size();
974 for (size_t i = 0; i < listSize; ++i) { 981 for (size_t i = 0; i < listSize; ++i) {
975 RenderLayer* curLayer = posZOrderList->at(i); 982 RenderLayer* curLayer = posZOrderList->at(i);
976 computeCompositingRequirements(layer, curLayer, overlapMap, chil dState, layersChanged, anyDescendantHas3DTransform, unclippedDescendants); 983 computeCompositingRequirements(layer, curLayer, overlapMap, chil dRecursionState, layersChanged, anyDescendantHas3DTransform, unclippedDescendant s);
977 } 984 }
978 } 985 }
979 } 986 }
980 987
981 // Now that the subtree has been traversed, we can check for compositing rea sons that depended on the state of the subtree. 988 // Now that the subtree has been traversed, we can check for compositing rea sons that depended on the state of the subtree.
982 989
983 // If we entered compositing mode during the recursion, the root will also n eed to be composited (as long as accelerated compositing is enabled). 990 // If we entered compositing mode during the recursion, the root will also n eed to be composited (as long as accelerated compositing is enabled).
984 if (layer->isRootLayer()) { 991 if (layer->isRootLayer()) {
985 if (inCompositingMode() && m_hasAcceleratedCompositing) 992 if (inCompositingMode() && m_hasAcceleratedCompositing)
986 willBeComposited = true; 993 willBeComposited = true;
987 } 994 }
988 995
989 // All layers (even ones that aren't being composited) need to get added to 996 // All layers (even ones that aren't being composited) need to get added to
990 // the overlap map. Layers that do not composite will draw into their 997 // the overlap map. Layers that do not composite will draw into their
991 // compositing ancestor's backing, and so are still considered for overlap. 998 // compositing ancestor's backing, and so are still considered for overlap.
992 if (overlapMap && childState.m_compositingAncestor && !childState.m_composit ingAncestor->isRootLayer()) 999 if (overlapMap && childRecursionState.m_compositingAncestor && !childRecursi onState.m_compositingAncestor->isRootLayer())
993 addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds); 1000 addToOverlapMap(*overlapMap, layer, absBounds, haveComputedBounds);
994 1001
995 // Now check for reasons to become composited that depend on the state of de scendant layers. 1002 // Now check for reasons to become composited that depend on the state of de scendant layers.
996 CompositingReasons subtreeCompositingReasons = subtreeReasonsForCompositing( layer->renderer(), childState.m_subtreeIsCompositing, anyDescendantHas3DTransfor m); 1003 CompositingReasons subtreeCompositingReasons = subtreeReasonsForCompositing( layer->renderer(), childRecursionState.m_subtreeIsCompositing, anyDescendantHas3 DTransform);
997 reasonsToComposite |= subtreeCompositingReasons; 1004 reasonsToComposite |= subtreeCompositingReasons;
998 if (!willBeComposited && canBeComposited(layer) && requiresCompositing(subtr eeCompositingReasons)) { 1005 if (!willBeComposited && canBeComposited(layer) && requiresCompositing(subtr eeCompositingReasons)) {
999 childState.m_compositingAncestor = layer; 1006 childRecursionState.m_compositingAncestor = layer;
1000 if (overlapMap) { 1007 if (overlapMap) {
1001 // FIXME: this context push is effectively a no-op but needs to exis t for 1008 // FIXME: this context push is effectively a no-op but needs to exis t for
1002 // now, because the code is designed to push overlap information to the 1009 // now, because the code is designed to push overlap information to the
1003 // second-from-top context of the stack. 1010 // second-from-top context of the stack.
1004 overlapMap->beginNewOverlapTestingContext(); 1011 overlapMap->beginNewOverlapTestingContext();
1005 addToOverlapMapRecursive(*overlapMap, layer); 1012 addToOverlapMapRecursive(*overlapMap, layer);
1006 } 1013 }
1007 willBeComposited = true; 1014 willBeComposited = true;
1008 } 1015 }
1009 1016
1010 // If the original layer is composited, the reflection needs to be, too. 1017 // If the original layer is composited, the reflection needs to be, too.
1011 if (layer->reflectionLayer()) { 1018 if (layer->reflectionLayer()) {
1012 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer? 1019 // FIXME: Shouldn't we call computeCompositingRequirements to handle a r eflection overlapping with another renderer?
1013 CompositingReasons reflectionCompositingReason = willBeComposited ? Comp ositingReasonReflectionOfCompositedParent : CompositingReasonNone; 1020 CompositingReasons reflectionCompositingReason = willBeComposited ? Comp ositingReasonReflectionOfCompositedParent : CompositingReasonNone;
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 (childState.m_subtreeIsCompositing) 1025 if (childRecursionState.m_subtreeIsCompositing)
1019 compositingState.m_subtreeIsCompositing = true; 1026 currentRecursionState.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(childState.m_subtreeIsCompositing); 1029 layer->setHasCompositingDescendant(childRecursionState.m_subtreeIsCompositin g);
1023 1030
1024 1031
1025 // Turn overlap testing off for later layers if it's already off, or if we h ave an animating transform. 1032 // 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 1033 // 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. 1034 // 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); 1035 bool isCompositedClippingLayer = canBeComposited(layer) && (reasonsToComposi te & CompositingReasonClipsCompositingDescendants);
1029 if ((!childState.m_testingOverlap && !isCompositedClippingLayer) || isRunnin gAcceleratedTransformAnimation(layer->renderer())) 1036 if ((!childRecursionState.m_testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer->renderer()))
1030 compositingState.m_testingOverlap = false; 1037 currentRecursionState.m_testingOverlap = false;
1031 1038
1032 if (overlapMap && childState.m_compositingAncestor == layer && !layer->isRoo tLayer()) 1039 if (overlapMap && childRecursionState.m_compositingAncestor == layer && !lay er->isRootLayer())
1033 overlapMap->finishCurrentOverlapTestingContext(); 1040 overlapMap->finishCurrentOverlapTestingContext();
1034 1041
1035 // If we're back at the root, and no other layers need to be composited, and the root layer itself doesn't need 1042 // If we're back at the root, and no other layers need to be composited, and the root layer itself doesn't need
1036 // to be composited, then we can drop out of compositing mode altogether. Ho wever, don't drop out of compositing mode 1043 // to be composited, then we can drop out of compositing mode altogether. Ho wever, don't drop out of compositing mode
1037 // if there are composited layers that we didn't hit in our traversal (e.g. because of visibility:hidden). 1044 // if there are composited layers that we didn't hit in our traversal (e.g. because of visibility:hidden).
1038 // FIXME: hasAnyAdditionalCompositedLayers() code seems fishy. We need to ma ke root layer logic more obvious. 1045 // FIXME: hasAnyAdditionalCompositedLayers() code seems fishy. We need to ma ke root layer logic more obvious.
1039 if (layer->isRootLayer() && !childState.m_subtreeIsCompositing && !requiresC ompositing(directReasons) && !m_forceCompositingMode && !hasAnyAdditionalComposi tedLayers(layer)) { 1046 if (layer->isRootLayer() && !childRecursionState.m_subtreeIsCompositing && ! requiresCompositing(directReasons) && !m_forceCompositingMode && !hasAnyAddition alCompositedLayers(layer)) {
1040 enableCompositingMode(false); 1047 enableCompositingMode(false);
1041 willBeComposited = false; 1048 willBeComposited = false;
1042 reasonsToComposite = CompositingReasonNone; 1049 reasonsToComposite = CompositingReasonNone;
1043 } 1050 }
1044 1051
1045 // At this point we have finished collecting all reasons to composite this l ayer. 1052 // At this point we have finished collecting all reasons to composite this l ayer.
1046 layer->setCompositingReasons(reasonsToComposite); 1053 layer->setCompositingReasons(reasonsToComposite);
1047 1054
1048 // Update backing now, so that we can use isComposited() reliably during tre e traversal in rebuildCompositingLayerTree(). 1055 // Update backing now, so that we can use backing() reliably during tree tra versal in rebuildCompositingLayerTree().
1049 if (updateBacking(layer, CompositingChangeRepaintNow)) 1056 if (updateBacking(layer, CompositingChangeRepaintNow))
1050 layersChanged = true; 1057 layersChanged = true;
1051 1058
1052 if (layer->reflectionLayer() && updateLayerCompositingState(layer->reflectio nLayer(), CompositingChangeRepaintNow)) 1059 if (layer->reflectionLayer() && updateLayerCompositingState(layer->reflectio nLayer(), CompositingChangeRepaintNow))
1053 layersChanged = true; 1060 layersChanged = true;
1054 1061
1055 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DTrans form(); 1062 descendantHas3DTransform |= anyDescendantHas3DTransform || layer->has3DTrans form();
1056 1063
1057 if (overlapMap) 1064 if (overlapMap)
1058 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer); 1065 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer);
1059 } 1066 }
1060 1067
1061 void RenderLayerCompositor::setCompositingParent(RenderLayer* childLayer, Render Layer* parentLayer) 1068 void RenderLayerCompositor::setCompositingParent(RenderLayer* childLayer, Render Layer* parentLayer)
1062 { 1069 {
1063 ASSERT(!parentLayer || childLayer->ancestorCompositingLayer() == parentLayer ); 1070 ASSERT(!parentLayer || childLayer->ancestorCompositingLayer() == parentLayer );
1064 ASSERT(childLayer->isComposited()); 1071 ASSERT(childLayer->backing());
1065 1072
1066 // It's possible to be called with a parent that isn't yet composited when w e're doing 1073 // 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; 1074 // partial updates as required by painting or hit testing. Just bail in that case;
1068 // we'll do a full layer update soon. 1075 // we'll do a full layer update soon.
1069 if (!parentLayer || !parentLayer->isComposited()) 1076 if (!parentLayer || !parentLayer->backing())
1070 return; 1077 return;
1071 1078
1072 if (parentLayer) { 1079 if (parentLayer) {
1073 GraphicsLayer* hostingLayer = parentLayer->backing()->parentForSublayers (); 1080 GraphicsLayer* hostingLayer = parentLayer->backing()->parentForSublayers ();
1074 GraphicsLayer* hostedLayer = childLayer->backing()->childForSuperlayers( ); 1081 GraphicsLayer* hostedLayer = childLayer->backing()->childForSuperlayers( );
1075 1082
1076 hostingLayer->addChild(hostedLayer); 1083 hostingLayer->addChild(hostedLayer);
1077 } else 1084 } else
1078 childLayer->backing()->childForSuperlayers()->removeFromParent(); 1085 childLayer->backing()->childForSuperlayers()->removeFromParent();
1079 } 1086 }
1080 1087
1081 void RenderLayerCompositor::removeCompositedChildren(RenderLayer* layer) 1088 void RenderLayerCompositor::removeCompositedChildren(RenderLayer* layer)
1082 { 1089 {
1083 ASSERT(layer->isComposited()); 1090 ASSERT(layer->backing());
1084 1091
1085 GraphicsLayer* hostingLayer = layer->backing()->parentForSublayers(); 1092 GraphicsLayer* hostingLayer = layer->backing()->parentForSublayers();
1086 hostingLayer->removeAllChildren(); 1093 hostingLayer->removeAllChildren();
1087 } 1094 }
1088 1095
1089 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const 1096 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const
1090 { 1097 {
1091 if (!m_hasAcceleratedCompositing) 1098 if (!m_hasAcceleratedCompositing)
1092 return false; 1099 return false;
1093 1100
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 return 0; 1369 return 0;
1363 } 1370 }
1364 1371
1365 bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer) 1372 bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer)
1366 { 1373 {
1367 RenderLayerCompositor* innerCompositor = frameContentsCompositor(renderer); 1374 RenderLayerCompositor* innerCompositor = frameContentsCompositor(renderer);
1368 if (!innerCompositor || !innerCompositor->inCompositingMode() || innerCompos itor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame) 1375 if (!innerCompositor || !innerCompositor->inCompositingMode() || innerCompos itor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame)
1369 return false; 1376 return false;
1370 1377
1371 RenderLayer* layer = renderer->layer(); 1378 RenderLayer* layer = renderer->layer();
1372 if (!layer->isComposited()) 1379 if (!layer->backing())
1373 return false; 1380 return false;
1374 1381
1375 RenderLayerBacking* backing = layer->backing(); 1382 RenderLayerBacking* backing = layer->backing();
1376 GraphicsLayer* hostingLayer = backing->parentForSublayers(); 1383 GraphicsLayer* hostingLayer = backing->parentForSublayers();
1377 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer(); 1384 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer();
1378 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) { 1385 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) {
1379 hostingLayer->removeAllChildren(); 1386 hostingLayer->removeAllChildren();
1380 hostingLayer->addChild(rootLayer); 1387 hostingLayer->addChild(rootLayer);
1381 } 1388 }
1382 return true; 1389 return true;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 1495
1489 1496
1490 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect) 1497 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect)
1491 { 1498 {
1492 recursiveRepaintLayer(rootRenderLayer(), absRect); 1499 recursiveRepaintLayer(rootRenderLayer(), absRect);
1493 } 1500 }
1494 1501
1495 void RenderLayerCompositor::recursiveRepaintLayer(RenderLayer* layer, const IntR ect* rect) 1502 void RenderLayerCompositor::recursiveRepaintLayer(RenderLayer* layer, const IntR ect* rect)
1496 { 1503 {
1497 // FIXME: This method does not work correctly with transforms. 1504 // FIXME: This method does not work correctly with transforms.
1498 if (layer->isComposited() && !layer->backing()->paintsIntoCompositedAncestor ()) { 1505 if (layer->compositingState() == PaintsIntoOwnBacking) {
1499 if (rect) 1506 if (rect)
1500 layer->setBackingNeedsRepaintInRect(*rect); 1507 layer->setBackingNeedsRepaintInRect(*rect);
1501 else 1508 else
1502 layer->setBackingNeedsRepaint(); 1509 layer->setBackingNeedsRepaint();
1503 } 1510 }
1504 1511
1505 #if !ASSERT_DISABLED 1512 #if !ASSERT_DISABLED
1506 LayerListMutationDetector mutationChecker(layer); 1513 LayerListMutationDetector mutationChecker(layer);
1507 #endif 1514 #endif
1508 1515
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 1588
1582 detachRootLayer(); 1589 detachRootLayer();
1583 } 1590 }
1584 } 1591 }
1585 1592
1586 void RenderLayerCompositor::clearBackingForLayerIncludingDescendants(RenderLayer * layer) 1593 void RenderLayerCompositor::clearBackingForLayerIncludingDescendants(RenderLayer * layer)
1587 { 1594 {
1588 if (!layer) 1595 if (!layer)
1589 return; 1596 return;
1590 1597
1591 if (layer->isComposited()) { 1598 if (layer->backing()) {
1592 removeViewportConstrainedLayer(layer); 1599 removeViewportConstrainedLayer(layer);
1593 layer->clearBacking(); 1600 layer->clearBacking();
1594 } 1601 }
1595 1602
1596 for (RenderLayer* currLayer = layer->firstChild(); currLayer; currLayer = cu rrLayer->nextSibling()) 1603 for (RenderLayer* currLayer = layer->firstChild(); currLayer; currLayer = cu rrLayer->nextSibling())
1597 clearBackingForLayerIncludingDescendants(currLayer); 1604 clearBackingForLayerIncludingDescendants(currLayer);
1598 } 1605 }
1599 1606
1600 void RenderLayerCompositor::clearBackingForAllLayers() 1607 void RenderLayerCompositor::clearBackingForAllLayers()
1601 { 1608 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1635 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const 1642 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
1636 { 1643 {
1637 // 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.
1638 // See http://webkit.org/b/84900 to re-enable it. 1645 // See http://webkit.org/b/84900 to re-enable it.
1639 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && layer- >renderer()->flowThreadState() == RenderObject::NotInsideFlowThread; 1646 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && layer- >renderer()->flowThreadState() == RenderObject::NotInsideFlowThread;
1640 } 1647 }
1641 1648
1642 bool RenderLayerCompositor::requiresOwnBackingStore(const RenderLayer* layer, co nst RenderLayer* compositingAncestorLayer) const 1649 bool RenderLayerCompositor::requiresOwnBackingStore(const RenderLayer* layer, co nst RenderLayer* compositingAncestorLayer) const
1643 { 1650 {
1644 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.
1645 if (compositingAncestorLayer 1654 if (compositingAncestorLayer
1646 && !(compositingAncestorLayer->backing()->graphicsLayer()->drawsContent( ) 1655 && !(compositingAncestorLayer->backing()->graphicsLayer()->drawsContent( )
1647 || compositingAncestorLayer->backing()->paintsIntoCompositedAncestor ())) 1656 || compositingAncestorLayer->backing()->paintsIntoCompositedAncestor ()))
1648 return true; 1657 return true;
1649 1658
1650 if (layer->isRootLayer() 1659 if (layer->isRootLayer()
1651 || layer->transform() // note: excludes perspective and transformStyle3D . 1660 || layer->transform() // note: excludes perspective and transformStyle3D .
1652 || requiresCompositingForVideo(renderer) 1661 || requiresCompositingForVideo(renderer)
1653 || requiresCompositingForCanvas(renderer) 1662 || requiresCompositingForCanvas(renderer)
1654 || requiresCompositingForPlugin(renderer) 1663 || requiresCompositingForPlugin(renderer)
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 if (requiresCompositingForOutOfFlowClipping(layer)) 1734 if (requiresCompositingForOutOfFlowClipping(layer))
1726 directReasons |= CompositingReasonOutOfFlowClipping; 1735 directReasons |= CompositingReasonOutOfFlowClipping;
1727 1736
1728 return directReasons; 1737 return directReasons;
1729 } 1738 }
1730 1739
1731 CompositingReasons RenderLayerCompositor::reasonsForCompositing(const RenderLaye r* layer) const 1740 CompositingReasons RenderLayerCompositor::reasonsForCompositing(const RenderLaye r* layer) const
1732 { 1741 {
1733 CompositingReasons reasons = CompositingReasonNone; 1742 CompositingReasons reasons = CompositingReasonNone;
1734 1743
1735 if (!layer || !layer->isComposited()) 1744 if (!layer || !layer->backing())
1736 return reasons; 1745 return reasons;
1737 1746
1738 return layer->compositingReasons(); 1747 return layer->compositingReasons();
1739 } 1748 }
1740 1749
1741 #if !LOG_DISABLED 1750 #if !LOG_DISABLED
1742 const char* RenderLayerCompositor::logReasonsForCompositing(const RenderLayer* l ayer) 1751 const char* RenderLayerCompositor::logReasonsForCompositing(const RenderLayer* l ayer)
1743 { 1752 {
1744 CompositingReasons reasons = reasonsForCompositing(layer); 1753 CompositingReasons reasons = reasonsForCompositing(layer);
1745 1754
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 } 1825 }
1817 #endif 1826 #endif
1818 1827
1819 // 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,
1820 // 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
1821 // 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.
1822 // 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,
1823 // but a sibling in the z-order hierarchy. 1832 // but a sibling in the z-order hierarchy.
1824 bool RenderLayerCompositor::clippedByAncestor(const RenderLayer* layer) const 1833 bool RenderLayerCompositor::clippedByAncestor(const RenderLayer* layer) const
1825 { 1834 {
1826 if (!layer->isComposited() || !layer->parent()) 1835 if (!layer->backing() || !layer->parent())
1827 return false; 1836 return false;
1828 1837
1829 const RenderLayer* compositingAncestor = layer->ancestorCompositingLayer(); 1838 const RenderLayer* compositingAncestor = layer->ancestorCompositingLayer();
1830 if (!compositingAncestor) 1839 if (!compositingAncestor)
1831 return false; 1840 return false;
1832 1841
1833 // 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(),
1834 // 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),
1835 // and layer. 1844 // and layer.
1836 const RenderLayer* computeClipRoot = 0; 1845 const RenderLayer* computeClipRoot = 0;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 1934
1926 bool composite = renderer->isEmbeddedObject() && toRenderEmbeddedObject(rend erer)->allowsAcceleratedCompositing(); 1935 bool composite = renderer->isEmbeddedObject() && toRenderEmbeddedObject(rend erer)->allowsAcceleratedCompositing();
1927 if (!composite) 1936 if (!composite)
1928 return false; 1937 return false;
1929 1938
1930 m_reevaluateCompositingAfterLayout = true; 1939 m_reevaluateCompositingAfterLayout = true;
1931 1940
1932 RenderWidget* pluginRenderer = toRenderWidget(renderer); 1941 RenderWidget* pluginRenderer = toRenderWidget(renderer);
1933 // 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.
1934 if (pluginRenderer->needsLayout()) 1943 if (pluginRenderer->needsLayout())
1935 return pluginRenderer->hasLayer() && pluginRenderer->layer()->isComposit ed(); 1944 return pluginRenderer->hasLayer() && pluginRenderer->layer()->backing();
1936 1945
1937 // 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.
1938 IntRect contentBox = pixelSnappedIntRect(pluginRenderer->contentBoxRect()); 1947 IntRect contentBox = pixelSnappedIntRect(pluginRenderer->contentBoxRect());
1939 return contentBox.height() * contentBox.width() > 1; 1948 return contentBox.height() * contentBox.width() > 1;
1940 } 1949 }
1941 1950
1942 bool RenderLayerCompositor::requiresCompositingForFrame(RenderObject* renderer) const 1951 bool RenderLayerCompositor::requiresCompositingForFrame(RenderObject* renderer) const
1943 { 1952 {
1944 if (!renderer->isRenderPart()) 1953 if (!renderer->isRenderPart())
1945 return false; 1954 return false;
1946 1955
1947 RenderPart* frameRenderer = toRenderPart(renderer); 1956 RenderPart* frameRenderer = toRenderPart(renderer);
1948 1957
1949 if (!frameRenderer->requiresAcceleratedCompositing()) 1958 if (!frameRenderer->requiresAcceleratedCompositing())
1950 return false; 1959 return false;
1951 1960
1952 m_reevaluateCompositingAfterLayout = true; 1961 m_reevaluateCompositingAfterLayout = true;
1953 1962
1954 RenderLayerCompositor* innerCompositor = frameContentsCompositor(frameRender er); 1963 RenderLayerCompositor* innerCompositor = frameContentsCompositor(frameRender er);
1955 if (!innerCompositor) 1964 if (!innerCompositor)
1956 return false; 1965 return false;
1957 1966
1958 // 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.
1959 if (renderer->needsLayout()) 1968 if (renderer->needsLayout())
1960 return frameRenderer->hasLayer() && frameRenderer->layer()->isComposited (); 1969 return frameRenderer->hasLayer() && frameRenderer->layer()->backing();
1961 1970
1962 // 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.
1963 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect()); 1972 IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect());
1964 return contentBox.height() * contentBox.width() > 0; 1973 return contentBox.height() * contentBox.width() > 0;
1965 } 1974 }
1966 1975
1967 bool RenderLayerCompositor::requiresCompositingForBackfaceVisibilityHidden(Rende rObject* renderer) const 1976 bool RenderLayerCompositor::requiresCompositingForBackfaceVisibilityHidden(Rende rObject* renderer) const
1968 { 1977 {
1969 return canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden; 1978 return canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden;
1970 } 1979 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2125 2134
2126 if (!hasScrollableAncestor) { 2135 if (!hasScrollableAncestor) {
2127 if (viewportConstrainedNotCompositedReason) 2136 if (viewportConstrainedNotCompositedReason)
2128 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForUnscrollableAncestors; 2137 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForUnscrollableAncestors;
2129 return false; 2138 return false;
2130 } 2139 }
2131 2140
2132 // 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.
2133 if (!m_inPostLayoutUpdate) { 2142 if (!m_inPostLayoutUpdate) {
2134 m_reevaluateCompositingAfterLayout = true; 2143 m_reevaluateCompositingAfterLayout = true;
2135 return layer->isComposited(); 2144 return layer->backing();
2136 } 2145 }
2137 2146
2138 bool paintsContent = layer->isVisuallyNonEmpty() || layer->hasVisibleDescend ant(); 2147 bool paintsContent = layer->isVisuallyNonEmpty() || layer->hasVisibleDescend ant();
2139 if (!paintsContent) { 2148 if (!paintsContent) {
2140 if (viewportConstrainedNotCompositedReason) 2149 if (viewportConstrainedNotCompositedReason)
2141 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForNoVisibleContent; 2150 *viewportConstrainedNotCompositedReason = RenderLayer::NotComposited ForNoVisibleContent;
2142 return false; 2151 return false;
2143 } 2152 }
2144 2153
2145 // 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
2236 return supportsFixedRootBackgroundCompositing() && m_renderView->rootBackgro undIsEntirelyFixed(); 2245 return supportsFixedRootBackgroundCompositing() && m_renderView->rootBackgro undIsEntirelyFixed();
2237 } 2246 }
2238 2247
2239 GraphicsLayer* RenderLayerCompositor::fixedRootBackgroundLayer() const 2248 GraphicsLayer* RenderLayerCompositor::fixedRootBackgroundLayer() const
2240 { 2249 {
2241 // Get the fixed root background from the RenderView layer's backing. 2250 // Get the fixed root background from the RenderView layer's backing.
2242 RenderLayer* viewLayer = m_renderView->layer(); 2251 RenderLayer* viewLayer = m_renderView->layer();
2243 if (!viewLayer) 2252 if (!viewLayer)
2244 return 0; 2253 return 0;
2245 2254
2246 if (viewLayer->isComposited() && viewLayer->backing()->backgroundLayerPaints FixedRootBackground()) 2255 if (viewLayer->compositingState() == PaintsIntoOwnBacking && viewLayer->back ing()->backgroundLayerPaintsFixedRootBackground())
2247 return viewLayer->backing()->backgroundLayer(); 2256 return viewLayer->backing()->backgroundLayer();
2248 2257
2249 return 0; 2258 return 0;
2250 } 2259 }
2251 2260
2252 static void resetTrackedRepaintRectsRecursive(GraphicsLayer* graphicsLayer) 2261 static void resetTrackedRepaintRectsRecursive(GraphicsLayer* graphicsLayer)
2253 { 2262 {
2254 if (!graphicsLayer) 2263 if (!graphicsLayer)
2255 return; 2264 return;
2256 2265
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 2658
2650 static bool isRootmostFixedOrStickyLayer(RenderLayer* layer) 2659 static bool isRootmostFixedOrStickyLayer(RenderLayer* layer)
2651 { 2660 {
2652 if (layer->renderer()->isStickyPositioned()) 2661 if (layer->renderer()->isStickyPositioned())
2653 return true; 2662 return true;
2654 2663
2655 if (layer->renderer()->style()->position() != FixedPosition) 2664 if (layer->renderer()->style()->position() != FixedPosition)
2656 return false; 2665 return false;
2657 2666
2658 for (RenderLayer* stackingContainer = layer->ancestorStackingContainer(); st ackingContainer; stackingContainer = stackingContainer->ancestorStackingContaine r()) { 2667 for (RenderLayer* stackingContainer = layer->ancestorStackingContainer(); st ackingContainer; stackingContainer = stackingContainer->ancestorStackingContaine r()) {
2659 if (stackingContainer->isComposited() && stackingContainer->renderer()-> style()->position() == FixedPosition) 2668 if (stackingContainer->backing() && stackingContainer->renderer()->style ()->position() == FixedPosition)
2660 return false; 2669 return false;
2661 } 2670 }
2662 2671
2663 return true; 2672 return true;
2664 } 2673 }
2665 2674
2666 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer) 2675 void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer)
2667 { 2676 {
2668 if (isRootmostFixedOrStickyLayer(layer)) 2677 if (isRootmostFixedOrStickyLayer(layer))
2669 addViewportConstrainedLayer(layer); 2678 addViewportConstrainedLayer(layer);
2670 else 2679 else
2671 removeViewportConstrainedLayer(layer); 2680 removeViewportConstrainedLayer(layer);
2672 } 2681 }
2673 2682
2674 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer) 2683 void RenderLayerCompositor::addViewportConstrainedLayer(RenderLayer* layer)
2675 { 2684 {
2676 m_viewportConstrainedLayers.add(layer); 2685 m_viewportConstrainedLayers.add(layer);
2677 } 2686 }
2678 2687
2679 void RenderLayerCompositor::removeViewportConstrainedLayer(RenderLayer* layer) 2688 void RenderLayerCompositor::removeViewportConstrainedLayer(RenderLayer* layer)
2680 { 2689 {
2681 if (!m_viewportConstrainedLayers.contains(layer)) 2690 if (!m_viewportConstrainedLayers.contains(layer))
2682 return; 2691 return;
2683 2692
2684 m_viewportConstrainedLayers.remove(layer); 2693 m_viewportConstrainedLayers.remove(layer);
2685 } 2694 }
2686 2695
2687 FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportCons traints(RenderLayer* layer) const 2696 FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportCons traints(RenderLayer* layer) const
2688 { 2697 {
2689 ASSERT(layer->isComposited()); 2698 ASSERT(layer->backing());
2690 2699
2691 FrameView* frameView = m_renderView->frameView(); 2700 FrameView* frameView = m_renderView->frameView();
2692 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ; 2701 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ;
2693 2702
2694 FixedPositionViewportConstraints constraints; 2703 FixedPositionViewportConstraints constraints;
2695 2704
2696 GraphicsLayer* graphicsLayer = layer->backing()->graphicsLayer(); 2705 GraphicsLayer* graphicsLayer = layer->backing()->graphicsLayer();
2697 2706
2698 constraints.setLayerPositionAtLastLayout(graphicsLayer->position()); 2707 constraints.setLayerPositionAtLastLayout(graphicsLayer->position());
2699 constraints.setViewportRectAtLastLayout(viewportRect); 2708 constraints.setViewportRectAtLastLayout(viewportRect);
(...skipping 17 matching lines...) Expand all
2717 2726
2718 // If top and bottom are auto, use top. 2727 // If top and bottom are auto, use top.
2719 if (style->top().isAuto() && style->bottom().isAuto()) 2728 if (style->top().isAuto() && style->bottom().isAuto())
2720 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop); 2729 constraints.addAnchorEdge(ViewportConstraints::AnchorEdgeTop);
2721 2730
2722 return constraints; 2731 return constraints;
2723 } 2732 }
2724 2733
2725 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo nstraints(RenderLayer* layer) const 2734 StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo nstraints(RenderLayer* layer) const
2726 { 2735 {
2727 ASSERT(layer->isComposited()); 2736 ASSERT(layer->backing());
2728 2737
2729 FrameView* frameView = m_renderView->frameView(); 2738 FrameView* frameView = m_renderView->frameView();
2730 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ; 2739 LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect() ;
2731 2740
2732 StickyPositionViewportConstraints constraints; 2741 StickyPositionViewportConstraints constraints;
2733 2742
2734 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer()); 2743 RenderBoxModelObject* renderer = toRenderBoxModelObject(layer->renderer());
2735 2744
2736 renderer->computeStickyPositionConstraints(constraints, viewportRect); 2745 renderer->computeStickyPositionConstraints(constraints, viewportRect);
2737 2746
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2787 } else if (graphicsLayer == m_scrollLayer.get()) { 2796 } else if (graphicsLayer == m_scrollLayer.get()) {
2788 name = "Frame Scrolling Layer"; 2797 name = "Frame Scrolling Layer";
2789 } else { 2798 } else {
2790 ASSERT_NOT_REACHED(); 2799 ASSERT_NOT_REACHED();
2791 } 2800 }
2792 2801
2793 return name; 2802 return name;
2794 } 2803 }
2795 2804
2796 } // namespace WebCore 2805 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698