| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" | 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" |
| 6 | 6 |
| 7 #include "cc/layers/content_layer_client.h" | 7 #include "cc/layers/content_layer_client.h" |
| 8 #include "cc/layers/layer.h" | 8 #include "cc/layers/layer.h" |
| 9 #include "cc/layers/picture_layer.h" | 9 #include "cc/layers/picture_layer.h" |
| 10 #include "cc/playback/compositing_display_item.h" | 10 #include "cc/playback/compositing_display_item.h" |
| (...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 void setupRootEffectNode(); | 603 void setupRootEffectNode(); |
| 604 void setupRootScrollNode(); | 604 void setupRootScrollNode(); |
| 605 | 605 |
| 606 // A brief discourse on cc property tree nodes, identifiers, and current and | 606 // A brief discourse on cc property tree nodes, identifiers, and current and |
| 607 // future design evolution envisioned: | 607 // future design evolution envisioned: |
| 608 // | 608 // |
| 609 // cc property trees identify nodes by their |id|, which implementation-wise | 609 // cc property trees identify nodes by their |id|, which implementation-wise |
| 610 // is actually its index in the property tree's vector of its node type. More | 610 // is actually its index in the property tree's vector of its node type. More |
| 611 // recent cc code now refers to these as 'node indices', or 'property tree | 611 // recent cc code now refers to these as 'node indices', or 'property tree |
| 612 // indices'. |parent_id| is the same sort of 'node index' of that node's | 612 // indices'. |parent_id| is the same sort of 'node index' of that node's |
| 613 // parent, whereas |owner_id| is the layer id of the layer owning that node. | 613 // parent. |
| 614 // | 614 // |
| 615 // Note there are two other primary types of 'ids' referenced in cc property | 615 // Note there are two other primary types of 'ids' referenced in cc property |
| 616 // tree related logic: (1) ElementId, also known Blink-side as | 616 // tree related logic: (1) ElementId, also known Blink-side as |
| 617 // CompositorElementId, used by the animation system to allow tying an element | 617 // CompositorElementId, used by the animation system to allow tying an element |
| 618 // to its respective layer, and (2) layer ids. There are other ancillary ids | 618 // to its respective layer, and (2) layer ids. There are other ancillary ids |
| 619 // not relevant to any of the above, such as | 619 // not relevant to any of the above, such as |
| 620 // cc::TransformNode::sorting_context_id | 620 // cc::TransformNode::sorting_context_id |
| 621 // (a.k.a. blink::TransformPaintPropertyNode::renderingContextId()). | 621 // (a.k.a. blink::TransformPaintPropertyNode::renderingContextId()). |
| 622 // | 622 // |
| 623 // There is a vision to move toward a world where cc property nodes have no | 623 // There is a vision to move toward a world where cc property nodes have no |
| 624 // association with layers and instead have a |stable_id|. The id could come | 624 // association with layers and instead have a |stable_id|. The id could come |
| 625 // from an ElementId in turn derived from the layout object responsible for | 625 // from an ElementId in turn derived from the layout object responsible for |
| 626 // creating the property node. | 626 // creating the property node. |
| 627 // | 627 // |
| 628 // We would also like to explore moving to use a single shared property tree | 628 // We would also like to explore moving to use a single shared property tree |
| 629 // representation across both cc and Blink. See | 629 // representation across both cc and Blink. See |
| 630 // platform/graphics/paint/README.md for more. | 630 // platform/graphics/paint/README.md for more. |
| 631 // | 631 // |
| 632 // With the above as background, we can now state more clearly a description | 632 // With the above as background, we can now state more clearly a description |
| 633 // of the below set of compositor id generation methods: they take Blink paint | 633 // of the below set of compositor node methods: they take Blink paint property |
| 634 // property tree nodes as input and produce a corresponding cc 'node id', | 634 // tree nodes as input, create a corresponding compositor property tree node |
| 635 // a.k.a., 'node index', for use as we build out the corresponding cc property | 635 // if none yet exists, and return the compositor node's 'node id', a.k.a., |
| 636 // tree representation. | 636 // 'node index'. |
| 637 | 637 |
| 638 int compositorIdForTransformNode(const TransformPaintPropertyNode*); | 638 int ensureCompositorTransformNode(const TransformPaintPropertyNode*); |
| 639 int compositorIdForClipNode(const ClipPaintPropertyNode*); | 639 int ensureCompositorClipNode(const ClipPaintPropertyNode*); |
| 640 int ensureCompositorScrollNode(const ScrollPaintPropertyNode*); |
| 641 |
| 640 int switchToEffectNode(const EffectPaintPropertyNode& nextEffect); | 642 int switchToEffectNode(const EffectPaintPropertyNode& nextEffect); |
| 641 int compositorIdForCurrentEffectNode() const { | 643 int getCurrentCompositorEffectNodeIndex() const { |
| 642 return m_effectStack.back().id; | 644 return m_effectStack.back().id; |
| 643 } | 645 } |
| 644 int compositorIdForScrollNode(const ScrollPaintPropertyNode*); | |
| 645 | 646 |
| 646 // Scroll offset has special treatment in the transform and scroll trees. | 647 // Scroll offset has special treatment in the transform and scroll trees. |
| 647 void updateScrollOffset(int layerId, int scrollId); | 648 void updateScrollOffset(int layerId, int scrollId); |
| 648 | 649 |
| 649 private: | 650 private: |
| 650 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect); | 651 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect); |
| 651 | 652 |
| 652 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } | 653 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } |
| 653 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } | 654 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } |
| 654 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; } | 655 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); | 766 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); |
| 766 scrollNode.owning_layer_id = m_rootLayer->id(); | 767 scrollNode.owning_layer_id = m_rootLayer->id(); |
| 767 scrollNode.transform_id = kSecondaryRootNodeId; | 768 scrollNode.transform_id = kSecondaryRootNodeId; |
| 768 m_propertyTrees.layer_id_to_scroll_node_index[scrollNode.owning_layer_id] = | 769 m_propertyTrees.layer_id_to_scroll_node_index[scrollNode.owning_layer_id] = |
| 769 scrollNode.id; | 770 scrollNode.id; |
| 770 | 771 |
| 771 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); | 772 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); |
| 772 m_rootLayer->SetScrollTreeIndex(scrollNode.id); | 773 m_rootLayer->SetScrollTreeIndex(scrollNode.id); |
| 773 } | 774 } |
| 774 | 775 |
| 775 int PropertyTreeManager::compositorIdForTransformNode( | 776 int PropertyTreeManager::ensureCompositorTransformNode( |
| 776 const TransformPaintPropertyNode* transformNode) { | 777 const TransformPaintPropertyNode* transformNode) { |
| 777 DCHECK(transformNode); | 778 DCHECK(transformNode); |
| 778 // TODO(crbug.com/645615): Remove the failsafe here. | 779 // TODO(crbug.com/645615): Remove the failsafe here. |
| 779 if (!transformNode) | 780 if (!transformNode) |
| 780 return kSecondaryRootNodeId; | 781 return kSecondaryRootNodeId; |
| 781 | 782 |
| 782 auto it = m_transformNodeMap.find(transformNode); | 783 auto it = m_transformNodeMap.find(transformNode); |
| 783 if (it != m_transformNodeMap.end()) | 784 if (it != m_transformNodeMap.end()) |
| 784 return it->value; | 785 return it->value; |
| 785 | 786 |
| 786 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 787 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 787 int parentId = compositorIdForTransformNode(transformNode->parent()); | 788 int parentId = ensureCompositorTransformNode(transformNode->parent()); |
| 788 int id = transformTree().Insert(cc::TransformNode(), parentId); | 789 int id = transformTree().Insert(cc::TransformNode(), parentId); |
| 789 | 790 |
| 790 cc::TransformNode& compositorNode = *transformTree().Node(id); | 791 cc::TransformNode& compositorNode = *transformTree().Node(id); |
| 791 transformTree().SetTargetId(id, kRealRootNodeId); | 792 transformTree().SetTargetId(id, kRealRootNodeId); |
| 792 transformTree().SetContentTargetId(id, kRealRootNodeId); | 793 transformTree().SetContentTargetId(id, kRealRootNodeId); |
| 793 compositorNode.source_node_id = parentId; | 794 compositorNode.source_node_id = parentId; |
| 794 | 795 |
| 795 FloatPoint3D origin = transformNode->origin(); | 796 FloatPoint3D origin = transformNode->origin(); |
| 796 compositorNode.pre_local.matrix().setTranslate(-origin.x(), -origin.y(), | 797 compositorNode.pre_local.matrix().setTranslate(-origin.x(), -origin.y(), |
| 797 -origin.z()); | 798 -origin.z()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 810 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 811 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 811 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 812 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 812 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 813 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 813 | 814 |
| 814 auto result = m_transformNodeMap.set(transformNode, id); | 815 auto result = m_transformNodeMap.set(transformNode, id); |
| 815 DCHECK(result.isNewEntry); | 816 DCHECK(result.isNewEntry); |
| 816 transformTree().set_needs_update(true); | 817 transformTree().set_needs_update(true); |
| 817 return id; | 818 return id; |
| 818 } | 819 } |
| 819 | 820 |
| 820 int PropertyTreeManager::compositorIdForClipNode( | 821 int PropertyTreeManager::ensureCompositorClipNode( |
| 821 const ClipPaintPropertyNode* clipNode) { | 822 const ClipPaintPropertyNode* clipNode) { |
| 822 DCHECK(clipNode); | 823 DCHECK(clipNode); |
| 823 // TODO(crbug.com/645615): Remove the failsafe here. | 824 // TODO(crbug.com/645615): Remove the failsafe here. |
| 824 if (!clipNode) | 825 if (!clipNode) |
| 825 return kSecondaryRootNodeId; | 826 return kSecondaryRootNodeId; |
| 826 | 827 |
| 827 auto it = m_clipNodeMap.find(clipNode); | 828 auto it = m_clipNodeMap.find(clipNode); |
| 828 if (it != m_clipNodeMap.end()) | 829 if (it != m_clipNodeMap.end()) |
| 829 return it->value; | 830 return it->value; |
| 830 | 831 |
| 831 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 832 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 832 int parentId = compositorIdForClipNode(clipNode->parent()); | 833 int parentId = ensureCompositorClipNode(clipNode->parent()); |
| 833 int id = clipTree().Insert(cc::ClipNode(), parentId); | 834 int id = clipTree().Insert(cc::ClipNode(), parentId); |
| 834 | 835 |
| 835 cc::ClipNode& compositorNode = *clipTree().Node(id); | 836 cc::ClipNode& compositorNode = *clipTree().Node(id); |
| 836 compositorNode.owning_layer_id = dummyLayer->id(); | 837 compositorNode.owning_layer_id = dummyLayer->id(); |
| 837 m_propertyTrees.layer_id_to_clip_node_index[compositorNode.owning_layer_id] = | 838 m_propertyTrees.layer_id_to_clip_node_index[compositorNode.owning_layer_id] = |
| 838 id; | 839 id; |
| 839 | 840 |
| 840 // TODO(jbroman): Don't discard rounded corners. | 841 // TODO(jbroman): Don't discard rounded corners. |
| 841 compositorNode.clip = clipNode->clipRect().rect(); | 842 compositorNode.clip = clipNode->clipRect().rect(); |
| 842 compositorNode.transform_id = | 843 compositorNode.transform_id = |
| 843 compositorIdForTransformNode(clipNode->localTransformSpace()); | 844 ensureCompositorTransformNode(clipNode->localTransformSpace()); |
| 844 compositorNode.target_transform_id = kRealRootNodeId; | 845 compositorNode.target_transform_id = kRealRootNodeId; |
| 845 compositorNode.target_effect_id = kSecondaryRootNodeId; | 846 compositorNode.target_effect_id = kSecondaryRootNodeId; |
| 846 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 847 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 847 compositorNode.layers_are_clipped = true; | 848 compositorNode.layers_are_clipped = true; |
| 848 compositorNode.layers_are_clipped_when_surfaces_disabled = true; | 849 compositorNode.layers_are_clipped_when_surfaces_disabled = true; |
| 849 | 850 |
| 850 m_rootLayer->AddChild(dummyLayer); | 851 m_rootLayer->AddChild(dummyLayer); |
| 851 dummyLayer->SetTransformTreeIndex(compositorNode.transform_id); | 852 dummyLayer->SetTransformTreeIndex(compositorNode.transform_id); |
| 852 dummyLayer->SetClipTreeIndex(id); | 853 dummyLayer->SetClipTreeIndex(id); |
| 853 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 854 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 854 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 855 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 855 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 856 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 856 | 857 |
| 857 auto result = m_clipNodeMap.set(clipNode, id); | 858 auto result = m_clipNodeMap.set(clipNode, id); |
| 858 DCHECK(result.isNewEntry); | 859 DCHECK(result.isNewEntry); |
| 859 clipTree().set_needs_update(true); | 860 clipTree().set_needs_update(true); |
| 860 return id; | 861 return id; |
| 861 } | 862 } |
| 862 | 863 |
| 863 int PropertyTreeManager::compositorIdForScrollNode( | 864 int PropertyTreeManager::ensureCompositorScrollNode( |
| 864 const ScrollPaintPropertyNode* scrollNode) { | 865 const ScrollPaintPropertyNode* scrollNode) { |
| 865 DCHECK(scrollNode); | 866 DCHECK(scrollNode); |
| 866 // TODO(crbug.com/645615): Remove the failsafe here. | 867 // TODO(crbug.com/645615): Remove the failsafe here. |
| 867 if (!scrollNode) | 868 if (!scrollNode) |
| 868 return kSecondaryRootNodeId; | 869 return kSecondaryRootNodeId; |
| 869 | 870 |
| 870 auto it = m_scrollNodeMap.find(scrollNode); | 871 auto it = m_scrollNodeMap.find(scrollNode); |
| 871 if (it != m_scrollNodeMap.end()) | 872 if (it != m_scrollNodeMap.end()) |
| 872 return it->value; | 873 return it->value; |
| 873 | 874 |
| 874 int parentId = compositorIdForScrollNode(scrollNode->parent()); | 875 int parentId = ensureCompositorScrollNode(scrollNode->parent()); |
| 875 int id = scrollTree().Insert(cc::ScrollNode(), parentId); | 876 int id = scrollTree().Insert(cc::ScrollNode(), parentId); |
| 876 | 877 |
| 877 cc::ScrollNode& compositorNode = *scrollTree().Node(id); | 878 cc::ScrollNode& compositorNode = *scrollTree().Node(id); |
| 878 compositorNode.owning_layer_id = parentId; | 879 compositorNode.owning_layer_id = parentId; |
| 879 m_propertyTrees | 880 m_propertyTrees |
| 880 .layer_id_to_scroll_node_index[compositorNode.owning_layer_id] = id; | 881 .layer_id_to_scroll_node_index[compositorNode.owning_layer_id] = id; |
| 881 | 882 |
| 882 compositorNode.scrollable = true; | 883 compositorNode.scrollable = true; |
| 883 | 884 |
| 884 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), | 885 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), |
| 885 scrollNode->clip().height()); | 886 scrollNode->clip().height()); |
| 886 compositorNode.bounds.SetSize(scrollNode->bounds().width(), | 887 compositorNode.bounds.SetSize(scrollNode->bounds().width(), |
| 887 scrollNode->bounds().height()); | 888 scrollNode->bounds().height()); |
| 888 compositorNode.user_scrollable_horizontal = | 889 compositorNode.user_scrollable_horizontal = |
| 889 scrollNode->userScrollableHorizontal(); | 890 scrollNode->userScrollableHorizontal(); |
| 890 compositorNode.user_scrollable_vertical = | 891 compositorNode.user_scrollable_vertical = |
| 891 scrollNode->userScrollableVertical(); | 892 scrollNode->userScrollableVertical(); |
| 892 compositorNode.transform_id = | 893 compositorNode.transform_id = |
| 893 compositorIdForTransformNode(scrollNode->scrollOffsetTranslation()); | 894 ensureCompositorTransformNode(scrollNode->scrollOffsetTranslation()); |
| 894 compositorNode.main_thread_scrolling_reasons = | 895 compositorNode.main_thread_scrolling_reasons = |
| 895 scrollNode->mainThreadScrollingReasons(); | 896 scrollNode->mainThreadScrollingReasons(); |
| 896 | 897 |
| 897 auto result = m_scrollNodeMap.set(scrollNode, id); | 898 auto result = m_scrollNodeMap.set(scrollNode, id); |
| 898 DCHECK(result.isNewEntry); | 899 DCHECK(result.isNewEntry); |
| 899 scrollTree().set_needs_update(true); | 900 scrollTree().set_needs_update(true); |
| 900 | 901 |
| 901 return id; | 902 return id; |
| 902 } | 903 } |
| 903 | 904 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 m_effectStack.pop_back(); | 964 m_effectStack.pop_back(); |
| 964 | 965 |
| 965 // Now the current effect is the lowest common ancestor of previous effect | 966 // Now the current effect is the lowest common ancestor of previous effect |
| 966 // and the next effect. That implies it is an existing node that already has | 967 // and the next effect. That implies it is an existing node that already has |
| 967 // at least one paint chunk or child effect, and we are going to either attach | 968 // at least one paint chunk or child effect, and we are going to either attach |
| 968 // another paint chunk or child effect to it. We can no longer omit render | 969 // another paint chunk or child effect to it. We can no longer omit render |
| 969 // surface for it even for opacity-only nodes. | 970 // surface for it even for opacity-only nodes. |
| 970 // See comments in PropertyTreeManager::buildEffectNodesRecursively(). | 971 // See comments in PropertyTreeManager::buildEffectNodesRecursively(). |
| 971 // TODO(crbug.com/504464): Remove premature optimization here. | 972 // TODO(crbug.com/504464): Remove premature optimization here. |
| 972 if (currentEffectNode() && currentEffectNode()->opacity() != 1.f) { | 973 if (currentEffectNode() && currentEffectNode()->opacity() != 1.f) { |
| 973 effectTree().Node(compositorIdForCurrentEffectNode())->has_render_surface = | 974 effectTree() |
| 974 true; | 975 .Node(getCurrentCompositorEffectNodeIndex()) |
| 976 ->has_render_surface = true; |
| 975 } | 977 } |
| 976 | 978 |
| 977 buildEffectNodesRecursively(&nextEffect); | 979 buildEffectNodesRecursively(&nextEffect); |
| 978 | 980 |
| 979 return compositorIdForCurrentEffectNode(); | 981 return getCurrentCompositorEffectNodeIndex(); |
| 980 } | 982 } |
| 981 | 983 |
| 982 void PropertyTreeManager::buildEffectNodesRecursively( | 984 void PropertyTreeManager::buildEffectNodesRecursively( |
| 983 const EffectPaintPropertyNode* nextEffect) { | 985 const EffectPaintPropertyNode* nextEffect) { |
| 984 if (nextEffect == currentEffectNode()) | 986 if (nextEffect == currentEffectNode()) |
| 985 return; | 987 return; |
| 986 DCHECK(nextEffect); | 988 DCHECK(nextEffect); |
| 987 | 989 |
| 988 buildEffectNodesRecursively(nextEffect->parent()); | 990 buildEffectNodesRecursively(nextEffect->parent()); |
| 989 DCHECK_EQ(nextEffect->parent(), currentEffectNode()); | 991 DCHECK_EQ(nextEffect->parent(), currentEffectNode()); |
| 990 | 992 |
| 991 #if DCHECK_IS_ON() | 993 #if DCHECK_IS_ON() |
| 992 DCHECK(!m_effectNodesConverted.contains(nextEffect)) | 994 DCHECK(!m_effectNodesConverted.contains(nextEffect)) |
| 993 << "Malformed paint artifact. Paint chunks under the same effect should " | 995 << "Malformed paint artifact. Paint chunks under the same effect should " |
| 994 "be contiguous."; | 996 "be contiguous."; |
| 995 m_effectNodesConverted.add(nextEffect); | 997 m_effectNodesConverted.add(nextEffect); |
| 996 #endif | 998 #endif |
| 997 | 999 |
| 998 // An effect node can't omit render surface if it has child with exotic | 1000 // An effect node can't omit render surface if it has child with exotic |
| 999 // blending mode. See comments below for more detail. | 1001 // blending mode. See comments below for more detail. |
| 1000 // TODO(crbug.com/504464): Remove premature optimization here. | 1002 // TODO(crbug.com/504464): Remove premature optimization here. |
| 1001 if (nextEffect->blendMode() != SkBlendMode::kSrcOver) { | 1003 if (nextEffect->blendMode() != SkBlendMode::kSrcOver) { |
| 1002 effectTree().Node(compositorIdForCurrentEffectNode())->has_render_surface = | 1004 effectTree() |
| 1003 true; | 1005 .Node(getCurrentCompositorEffectNodeIndex()) |
| 1006 ->has_render_surface = true; |
| 1004 } | 1007 } |
| 1005 | 1008 |
| 1006 // We currently create dummy layers to host effect nodes and corresponding | 1009 // We currently create dummy layers to host effect nodes and corresponding |
| 1007 // render surfaces. This should be removed once cc implements better support | 1010 // render surfaces. This should be removed once cc implements better support |
| 1008 // for freestanding property trees. | 1011 // for freestanding property trees. |
| 1009 scoped_refptr<cc::Layer> dummyLayer = nextEffect->ensureDummyLayer(); | 1012 scoped_refptr<cc::Layer> dummyLayer = nextEffect->ensureDummyLayer(); |
| 1010 m_rootLayer->AddChild(dummyLayer); | 1013 m_rootLayer->AddChild(dummyLayer); |
| 1011 | 1014 |
| 1012 int outputClipId = compositorIdForClipNode(nextEffect->outputClip()); | 1015 int outputClipId = ensureCompositorClipNode(nextEffect->outputClip()); |
| 1013 | 1016 |
| 1014 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( | 1017 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( |
| 1015 cc::EffectNode(), compositorIdForCurrentEffectNode())); | 1018 cc::EffectNode(), getCurrentCompositorEffectNodeIndex())); |
| 1016 effectNode.owning_layer_id = dummyLayer->id(); | 1019 effectNode.owning_layer_id = dummyLayer->id(); |
| 1017 effectNode.clip_id = outputClipId; | 1020 effectNode.clip_id = outputClipId; |
| 1018 // Every effect is supposed to have render surface enabled for grouping, | 1021 // Every effect is supposed to have render surface enabled for grouping, |
| 1019 // but we can get away without one if the effect is opacity-only and has only | 1022 // but we can get away without one if the effect is opacity-only and has only |
| 1020 // one compositing child with kSrcOver blend mode. This is both for | 1023 // one compositing child with kSrcOver blend mode. This is both for |
| 1021 // optimization and not introducing sub-pixel differences in layout tests. | 1024 // optimization and not introducing sub-pixel differences in layout tests. |
| 1022 // See PropertyTreeManager::switchToEffectNode() and above where we | 1025 // See PropertyTreeManager::switchToEffectNode() and above where we |
| 1023 // retrospectively enable render surface when more than one compositing child | 1026 // retrospectively enable render surface when more than one compositing child |
| 1024 // or a child with exotic blend mode is detected. | 1027 // or a child with exotic blend mode is detected. |
| 1025 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface | 1028 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 collectPendingLayers(paintArtifact, pendingLayers, geometryMapper); | 1190 collectPendingLayers(paintArtifact, pendingLayers, geometryMapper); |
| 1188 | 1191 |
| 1189 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients; | 1192 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients; |
| 1190 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 1193 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
| 1191 for (const PendingLayer& pendingLayer : pendingLayers) { | 1194 for (const PendingLayer& pendingLayer : pendingLayers) { |
| 1192 gfx::Vector2dF layerOffset; | 1195 gfx::Vector2dF layerOffset; |
| 1193 scoped_refptr<cc::Layer> layer = compositedLayerForPendingLayer( | 1196 scoped_refptr<cc::Layer> layer = compositedLayerForPendingLayer( |
| 1194 paintArtifact, pendingLayer, layerOffset, newContentLayerClients, | 1197 paintArtifact, pendingLayer, layerOffset, newContentLayerClients, |
| 1195 rasterChunkInvalidations, storeDebugInfo, geometryMapper); | 1198 rasterChunkInvalidations, storeDebugInfo, geometryMapper); |
| 1196 | 1199 |
| 1197 int transformId = propertyTreeManager.compositorIdForTransformNode( | 1200 int transformId = propertyTreeManager.ensureCompositorTransformNode( |
| 1198 pendingLayer.propertyTreeState.transform()); | 1201 pendingLayer.propertyTreeState.transform()); |
| 1199 int scrollId = propertyTreeManager.compositorIdForScrollNode( | 1202 int scrollId = propertyTreeManager.ensureCompositorScrollNode( |
| 1200 pendingLayer.propertyTreeState.scroll()); | 1203 pendingLayer.propertyTreeState.scroll()); |
| 1201 int clipId = propertyTreeManager.compositorIdForClipNode( | 1204 int clipId = propertyTreeManager.ensureCompositorClipNode( |
| 1202 pendingLayer.propertyTreeState.clip()); | 1205 pendingLayer.propertyTreeState.clip()); |
| 1203 int effectId = propertyTreeManager.switchToEffectNode( | 1206 int effectId = propertyTreeManager.switchToEffectNode( |
| 1204 *pendingLayer.propertyTreeState.effect()); | 1207 *pendingLayer.propertyTreeState.effect()); |
| 1205 | 1208 |
| 1206 propertyTreeManager.updateScrollOffset(layer->id(), scrollId); | 1209 propertyTreeManager.updateScrollOffset(layer->id(), scrollId); |
| 1207 | 1210 |
| 1208 layer->set_offset_to_transform_parent(layerOffset); | 1211 layer->set_offset_to_transform_parent(layerOffset); |
| 1209 | 1212 |
| 1210 m_rootLayer->AddChild(layer); | 1213 m_rootLayer->AddChild(layer); |
| 1211 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 1214 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1231 #ifndef NDEBUG | 1234 #ifndef NDEBUG |
| 1232 void PaintArtifactCompositor::showDebugData() { | 1235 void PaintArtifactCompositor::showDebugData() { |
| 1233 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) | 1236 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) |
| 1234 ->toPrettyJSONString() | 1237 ->toPrettyJSONString() |
| 1235 .utf8() | 1238 .utf8() |
| 1236 .data(); | 1239 .data(); |
| 1237 } | 1240 } |
| 1238 #endif | 1241 #endif |
| 1239 | 1242 |
| 1240 } // namespace blink | 1243 } // namespace blink |
| OLD | NEW |