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

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

Issue 264013002: Allow layers that need squashing to draw into the squashing layer in some cases. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Adjust. Created 6 years, 7 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 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 // to paint on top of the background, but below the layer's main contents. F or now, because we always composite layers 599 // to paint on top of the background, but below the layer's main contents. F or now, because we always composite layers
600 // when they have a composited negative z-index child, such layers will neve r need squashing so it is not yet an issue. 600 // when they have a composited negative z-index child, such layers will neve r need squashing so it is not yet an issue.
601 if (compositedLayerUpdate == PutInSquashingLayer) { 601 if (compositedLayerUpdate == PutInSquashingLayer) {
602 // A layer that is squashed with other layers cannot have its own Compos itedLayerMapping. 602 // A layer that is squashed with other layers cannot have its own Compos itedLayerMapping.
603 ASSERT(!layer->hasCompositedLayerMapping()); 603 ASSERT(!layer->hasCompositedLayerMapping());
604 ASSERT(squashingState.hasMostRecentMapping); 604 ASSERT(squashingState.hasMostRecentMapping);
605 605
606 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layer->compu teOffsetFromTransformedAncestor(); 606 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layer->compu teOffsetFromTransformedAncestor();
607 607
608 // Compute the offset of this layer from the squashing owner. This compu tation is correct only because layers are allowed to squash only if they 608 // Compute the offset of this layer from the squashing owner. This compu tation is correct only because layers are allowed to squash only if they
609 // share a transformed ancestor (see canSquashIntoCurrentSquashingOwner) . 609 // share a transformed ancestor (see computeSquashingBehaviorWhenSquashi ngRequired).
610 LayoutSize offsetFromSquashingCLM(offsetFromTransformedAncestorForSquash edLayer.x() - squashingState.offsetFromTransformedAncestorForSquashingCLM.x(), 610 LayoutSize offsetFromSquashingCLM(offsetFromTransformedAncestorForSquash edLayer.x() - squashingState.offsetFromTransformedAncestorForSquashingCLM.x(),
611 offsetFromTransformedAncestorForSquashedLayer.y() - squashingState.o ffsetFromTransformedAncestorForSquashingCLM.y()); 611 offsetFromTransformedAncestorForSquashedLayer.y() - squashingState.o ffsetFromTransformedAncestorForSquashingCLM.y());
612 612
613 bool changedSquashingLayer = 613 bool changedSquashingLayer =
614 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay er, offsetFromSquashingCLM, squashingState.nextSquashedLayerIndex); 614 squashingState.mostRecentMapping->updateSquashingLayerAssignment(lay er, offsetFromSquashingCLM, squashingState.nextSquashedLayerIndex);
615 if (!changedSquashingLayer) 615 if (!changedSquashingLayer)
616 return true; 616 return true;
617 617
618 // If we've modified the collection of squashed layers, we must update 618 // If we've modified the collection of squashed layers, we must update
619 // the graphics layer geometry. 619 // the graphics layer geometry.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 bool RenderLayerCompositor::squashingWouldExceedSparsityTolerance(const RenderLa yer* candidate, const RenderLayerCompositor::SquashingState& squashingState) 669 bool RenderLayerCompositor::squashingWouldExceedSparsityTolerance(const RenderLa yer* candidate, const RenderLayerCompositor::SquashingState& squashingState)
670 { 670 {
671 IntRect bounds = candidate->ancestorDependentProperties().clippedAbsoluteBou ndingBox; 671 IntRect bounds = candidate->ancestorDependentProperties().clippedAbsoluteBou ndingBox;
672 IntRect newBoundingRect = squashingState.boundingRect; 672 IntRect newBoundingRect = squashingState.boundingRect;
673 newBoundingRect.unite(bounds); 673 newBoundingRect.unite(bounds);
674 const uint64_t newBoundingRectArea = newBoundingRect.size().area(); 674 const uint64_t newBoundingRectArea = newBoundingRect.size().area();
675 const uint64_t newSquashedArea = squashingState.totalAreaOfSquashedRects + b ounds.size().area(); 675 const uint64_t newSquashedArea = squashingState.totalAreaOfSquashedRects + b ounds.size().area();
676 return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea; 676 return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea;
677 } 677 }
678 678
679 bool RenderLayerCompositor::canSquashIntoCurrentSquashingOwner(const RenderLayer * layer, const RenderLayerCompositor::SquashingState& squashingState) 679 RenderLayerCompositor::NeedsSquashingBehavior RenderLayerCompositor::computeSqua shingBehaviorWhenSquashingRequired(const RenderLayer* layer, const RenderLayerCo mpositor::SquashingState& squashingState)
680 { 680 {
681 // FIXME: this special case for video exists only to deal with corner cases 681 // FIXME: this special case for video exists only to deal with corner cases
682 // where a RenderVideo does not report that it needs to be directly composit ed. 682 // where a RenderVideo does not report that it needs to be directly composit ed.
683 // Video does not currently support sharing a backing, but this could be 683 // Video does not currently support sharing a backing, but this could be
684 // generalized in the future. The following layout tests fail if we permit t he 684 // generalized in the future. The following layout tests fail if we permit t he
685 // video to share a backing with other layers. 685 // video to share a backing with other layers.
686 // 686 //
687 // compositing/video/video-controls-layer-creation.html 687 // compositing/video/video-controls-layer-creation.html
688 // virtual/softwarecompositing/video/video-controls-layer-creation.html 688 // virtual/softwarecompositing/video/video-controls-layer-creation.html
689 if (layer->renderer()->isVideo()) 689 if (layer->renderer()->isVideo())
690 return false; 690 return ShouldPaintIntoOwnLayer;
691 691
692 if (squashingWouldExceedSparsityTolerance(layer, squashingState)) 692 if (squashingWouldExceedSparsityTolerance(layer, squashingState))
693 return false; 693 return ShouldPaintIntoOwnLayer;
694 694
695 // FIXME: this is not efficient, since it walks up the tree . We should stor e these values on the AncestorDependentPropertiesCache. 695 // FIXME: this is not efficient, since it walks up the tree . We should stor e these values on the AncestorDependentPropertiesCache.
696 ASSERT(squashingState.hasMostRecentMapping); 696 ASSERT(squashingState.hasMostRecentMapping);
697 const RenderLayer& squashingLayer = squashingState.mostRecentMapping->owning Layer(); 697 const RenderLayer& squashingLayer = squashingState.mostRecentMapping->owning Layer();
698 698
699 if (layer->renderer()->clippingContainer() != squashingLayer.renderer()->cli ppingContainer())
700 return false;
701
702 // Composited descendants need to be clipped by a child contianment graphics layer, which would not be available if the layer is squashed. 699 // Composited descendants need to be clipped by a child contianment graphics layer, which would not be available if the layer is squashed.
703 if (clipsCompositingDescendants(layer)) 700 if (clipsCompositingDescendants(layer))
704 return false; 701 return ShouldPaintIntoOwnLayer;
705 702
706 if (layer->scrollsWithRespectTo(&squashingLayer)) 703 if (layer->scrollsWithRespectTo(&squashingLayer))
707 return false; 704 return ShouldPaintIntoOwnLayer;
708 705
709 const RenderLayer::AncestorDependentProperties& ancestorDependentProperties = layer->ancestorDependentProperties(); 706 const RenderLayer::AncestorDependentProperties& ancestorDependentProperties = layer->ancestorDependentProperties();
710 const RenderLayer::AncestorDependentProperties& squashingLayerAncestorDepend entProperties = squashingLayer.ancestorDependentProperties(); 707 const RenderLayer::AncestorDependentProperties& squashingLayerAncestorDepend entProperties = squashingLayer.ancestorDependentProperties();
711 708
712 if (ancestorDependentProperties.opacityAncestor != squashingLayerAncestorDep endentProperties.opacityAncestor) 709 if (ancestorDependentProperties.opacityAncestor != squashingLayerAncestorDep endentProperties.opacityAncestor)
713 return false; 710 return ShouldPaintIntoOwnLayer;
714 711
715 if (ancestorDependentProperties.transformAncestor != squashingLayerAncestorD ependentProperties.transformAncestor) 712 if (ancestorDependentProperties.transformAncestor != squashingLayerAncestorD ependentProperties.transformAncestor)
716 return false; 713 return ShouldPaintIntoOwnLayer;
717 714
718 if (ancestorDependentProperties.filterAncestor != squashingLayerAncestorDepe ndentProperties.filterAncestor) 715 if (ancestorDependentProperties.filterAncestor != squashingLayerAncestorDepe ndentProperties.filterAncestor)
719 return false; 716 return ShouldPaintIntoOwnLayer;
720 717
721 return true; 718 if (layer->renderer()->clippingContainer() != squashingLayer.renderer()->cli ppingContainer()) {
719 //layer->renderer()->showRenderObject();
720 const RenderLayer* parent = layer->renderer()->clippingContainer()->encl osingLayer()->containingGroupedLayer();
721 if (parent && squashingLayer.compositedLayerMapping().equals(parent->gro upedMapping()))
722 return ShouldPaintIntoSameLayer;
723 printf("clipping: ShouldPaintIntoOwnLayer\n");
724 return ShouldPaintIntoOwnLayer;
725 }
726
727 return ShouldSquash;
722 } 728 }
723 729
724 RenderLayerCompositor::CompositingStateTransitionType RenderLayerCompositor::com puteCompositedLayerUpdate(RenderLayer* layer) 730 RenderLayerCompositor::CompositingStateTransitionType RenderLayerCompositor::com puteCompositedLayerUpdate(RenderLayer* layer)
725 { 731 {
726 CompositingStateTransitionType update = NoCompositingStateChange; 732 CompositingStateTransitionType update = NoCompositingStateChange;
727 if (!layer->subtreeIsInvisible() && needsOwnBacking(layer)) { 733 if (!layer->subtreeIsInvisible() && needsOwnBacking(layer)) {
728 if (!layer->hasCompositedLayerMapping()) { 734 if (!layer->hasCompositedLayerMapping()) {
729 update = AllocateOwnCompositedLayerMapping; 735 update = AllocateOwnCompositedLayerMapping;
730 } 736 }
731 } else { 737 } else {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 830
825 nextSquashedLayerIndex = 0; 831 nextSquashedLayerIndex = 0;
826 mostRecentMapping = newCompositedLayerMapping; 832 mostRecentMapping = newCompositedLayerMapping;
827 hasMostRecentMapping = hasNewCompositedLayerMapping; 833 hasMostRecentMapping = hasNewCompositedLayerMapping;
828 offsetFromTransformedAncestorForSquashingCLM = newOffsetFromTransformedAnces torForSquashingCLM; 834 offsetFromTransformedAncestorForSquashingCLM = newOffsetFromTransformedAnces torForSquashingCLM;
829 } 835 }
830 836
831 void RenderLayerCompositor::assignLayersToBackings(RenderLayer* updateRoot, bool & layersChanged) 837 void RenderLayerCompositor::assignLayersToBackings(RenderLayer* updateRoot, bool & layersChanged)
832 { 838 {
833 SquashingState squashingState; 839 SquashingState squashingState;
840 printf("RenderLayerCompositor::assignLayersToBackings()\n");
834 assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged); 841 assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged);
835 if (squashingState.hasMostRecentMapping) 842 if (squashingState.hasMostRecentMapping)
836 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa shingState.nextSquashedLayerIndex); 843 squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squa shingState.nextSquashedLayerIndex);
837 } 844 }
838 845
839 void RenderLayerCompositor::assignLayersToBackingsForReflectionLayer(RenderLayer * reflectionLayer, bool& layersChanged) 846 void RenderLayerCompositor::assignLayersToBackingsForReflectionLayer(RenderLayer * reflectionLayer, bool& layersChanged)
840 { 847 {
841 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(reflectionLayer); 848 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(reflectionLayer);
842 if (compositedLayerUpdate != NoCompositingStateChange) { 849 if (compositedLayerUpdate != NoCompositingStateChange) {
843 layersChanged = true; 850 layersChanged = true;
844 allocateOrClearCompositedLayerMapping(reflectionLayer, compositedLayerUp date); 851 allocateOrClearCompositedLayerMapping(reflectionLayer, compositedLayerUp date);
845 } 852 }
846 updateDirectCompositingReasons(reflectionLayer); 853 updateDirectCompositingReasons(reflectionLayer);
847 if (reflectionLayer->hasCompositedLayerMapping()) 854 if (reflectionLayer->hasCompositedLayerMapping())
848 reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfigurat ion(GraphicsLayerUpdater::ForceUpdate); 855 reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfigurat ion(GraphicsLayerUpdater::ForceUpdate);
849 } 856 }
850 857
851 void RenderLayerCompositor::assignLayersToBackingsInternal(RenderLayer* layer, S quashingState& squashingState, bool& layersChanged) 858 void RenderLayerCompositor::assignLayersToBackingsInternal(RenderLayer* layer, S quashingState& squashingState, bool& layersChanged)
852 { 859 {
853 if (layerSquashingEnabled() && requiresSquashing(layer->compositingReasons() ) && !canSquashIntoCurrentSquashingOwner(layer, squashingState)) 860 if (layerSquashingEnabled() && requiresSquashing(layer->compositingReasons() )) {
854 layer->setCompositingReasons(layer->compositingReasons() | CompositingRe asonNoSquashingTargetFound); 861 switch (computeSquashingBehaviorWhenSquashingRequired(layer, squashingSt ate)) {
862 case ShouldPaintIntoOwnLayer: {
863 printf("assignLayersToBackingsInternal: ShouldPaintIntoOwnLayer\ n");
864 layer->setCompositingReasons(layer->compositingReasons() | Compo sitingReasonNoSquashingTargetFound);
865 break;
866 }
867 case ShouldSquash:
868 break;
869 case ShouldPaintIntoSameLayer:
870 layer->setCompositingReasons(CompositingReasonNone);
871 break;
872 }
873 }
855 874
856 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(layer); 875 CompositingStateTransitionType compositedLayerUpdate = computeCompositedLaye rUpdate(layer);
857 876
858 if (allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate)) 877 if (allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate))
859 layersChanged = true; 878 layersChanged = true;
860 879
861 // FIXME: special-casing reflection layers here is not right. 880 // FIXME: special-casing reflection layers here is not right.
862 if (layer->reflectionInfo()) 881 if (layer->reflectionInfo())
863 assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflec tionLayer(), layersChanged); 882 assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflec tionLayer(), layersChanged);
864 883
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 } else if (graphicsLayer == m_scrollLayer.get()) { 1724 } else if (graphicsLayer == m_scrollLayer.get()) {
1706 name = "LocalFrame Scrolling Layer"; 1725 name = "LocalFrame Scrolling Layer";
1707 } else { 1726 } else {
1708 ASSERT_NOT_REACHED(); 1727 ASSERT_NOT_REACHED();
1709 } 1728 }
1710 1729
1711 return name; 1730 return name;
1712 } 1731 }
1713 1732
1714 } // namespace WebCore 1733 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698