| 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 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 void PropertyTreeManager::setupRootClipNode() { | 681 void PropertyTreeManager::setupRootClipNode() { |
| 682 // cc is hardcoded to use clip node index 1 for viewport clip. | 682 // cc is hardcoded to use clip node index 1 for viewport clip. |
| 683 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; | 683 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; |
| 684 clipTree.clear(); | 684 clipTree.clear(); |
| 685 m_propertyTrees.clip_id_to_index_map.clear(); | 685 m_propertyTrees.clip_id_to_index_map.clear(); |
| 686 cc::ClipNode& clipNode = | 686 cc::ClipNode& clipNode = |
| 687 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); | 687 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); |
| 688 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); | 688 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); |
| 689 | 689 |
| 690 clipNode.resets_clip = true; | 690 clipNode.resets_clip = true; |
| 691 clipNode.owner_id = m_rootLayer->id(); | 691 clipNode.owning_layer_id = m_rootLayer->id(); |
| 692 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 692 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 693 clipNode.clip = gfx::RectF( | 693 clipNode.clip = gfx::RectF( |
| 694 gfx::SizeF(m_rootLayer->GetLayerTree()->device_viewport_size())); | 694 gfx::SizeF(m_rootLayer->GetLayerTree()->device_viewport_size())); |
| 695 clipNode.transform_id = kRealRootNodeId; | 695 clipNode.transform_id = kRealRootNodeId; |
| 696 clipNode.target_transform_id = kRealRootNodeId; | 696 clipNode.target_transform_id = kRealRootNodeId; |
| 697 clipNode.target_effect_id = kSecondaryRootNodeId; | 697 clipNode.target_effect_id = kSecondaryRootNodeId; |
| 698 m_propertyTrees.clip_id_to_index_map[clipNode.owner_id] = clipNode.id; | 698 m_propertyTrees.clip_id_to_index_map[clipNode.owning_layer_id] = clipNode.id; |
| 699 | 699 |
| 700 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); | 700 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); |
| 701 m_rootLayer->SetClipTreeIndex(clipNode.id); | 701 m_rootLayer->SetClipTreeIndex(clipNode.id); |
| 702 } | 702 } |
| 703 | 703 |
| 704 void PropertyTreeManager::setupRootEffectNode() { | 704 void PropertyTreeManager::setupRootEffectNode() { |
| 705 // cc is hardcoded to use effect node index 1 for root render surface. | 705 // cc is hardcoded to use effect node index 1 for root render surface. |
| 706 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; | 706 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; |
| 707 effectTree.clear(); | 707 effectTree.clear(); |
| 708 m_propertyTrees.effect_id_to_index_map.clear(); | 708 m_propertyTrees.effect_id_to_index_map.clear(); |
| 709 cc::EffectNode& effectNode = | 709 cc::EffectNode& effectNode = |
| 710 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); | 710 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); |
| 711 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); | 711 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); |
| 712 effectNode.owner_id = m_rootLayer->id(); | 712 effectNode.owning_layer_id = m_rootLayer->id(); |
| 713 effectNode.transform_id = kRealRootNodeId; | 713 effectNode.transform_id = kRealRootNodeId; |
| 714 effectNode.clip_id = kSecondaryRootNodeId; | 714 effectNode.clip_id = kSecondaryRootNodeId; |
| 715 effectNode.has_render_surface = true; | 715 effectNode.has_render_surface = true; |
| 716 m_propertyTrees.effect_id_to_index_map[effectNode.owner_id] = effectNode.id; | 716 m_propertyTrees.effect_id_to_index_map[effectNode.owning_layer_id] = |
| 717 effectNode.id; |
| 717 | 718 |
| 718 m_effectStack.append( | 719 m_effectStack.append( |
| 719 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); | 720 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); |
| 720 m_rootLayer->SetEffectTreeIndex(effectNode.id); | 721 m_rootLayer->SetEffectTreeIndex(effectNode.id); |
| 721 } | 722 } |
| 722 | 723 |
| 723 void PropertyTreeManager::setupRootScrollNode() { | 724 void PropertyTreeManager::setupRootScrollNode() { |
| 724 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; | 725 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; |
| 725 scrollTree.clear(); | 726 scrollTree.clear(); |
| 726 m_propertyTrees.scroll_id_to_index_map.clear(); | 727 m_propertyTrees.scroll_id_to_index_map.clear(); |
| 727 cc::ScrollNode& scrollNode = | 728 cc::ScrollNode& scrollNode = |
| 728 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); | 729 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); |
| 729 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); | 730 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); |
| 730 scrollNode.owner_id = m_rootLayer->id(); | 731 scrollNode.owning_layer_id = m_rootLayer->id(); |
| 731 scrollNode.transform_id = kSecondaryRootNodeId; | 732 scrollNode.transform_id = kSecondaryRootNodeId; |
| 732 m_propertyTrees.scroll_id_to_index_map[scrollNode.owner_id] = scrollNode.id; | 733 m_propertyTrees.scroll_id_to_index_map[scrollNode.owning_layer_id] = |
| 734 scrollNode.id; |
| 733 | 735 |
| 734 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); | 736 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); |
| 735 m_rootLayer->SetScrollTreeIndex(scrollNode.id); | 737 m_rootLayer->SetScrollTreeIndex(scrollNode.id); |
| 736 } | 738 } |
| 737 | 739 |
| 738 int PropertyTreeManager::compositorIdForTransformNode( | 740 int PropertyTreeManager::compositorIdForTransformNode( |
| 739 const TransformPaintPropertyNode* transformNode) { | 741 const TransformPaintPropertyNode* transformNode) { |
| 740 DCHECK(transformNode); | 742 DCHECK(transformNode); |
| 741 // TODO(crbug.com/645615): Remove the failsafe here. | 743 // TODO(crbug.com/645615): Remove the failsafe here. |
| 742 if (!transformNode) | 744 if (!transformNode) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 | 791 |
| 790 auto it = m_clipNodeMap.find(clipNode); | 792 auto it = m_clipNodeMap.find(clipNode); |
| 791 if (it != m_clipNodeMap.end()) | 793 if (it != m_clipNodeMap.end()) |
| 792 return it->value; | 794 return it->value; |
| 793 | 795 |
| 794 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 796 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 795 int parentId = compositorIdForClipNode(clipNode->parent()); | 797 int parentId = compositorIdForClipNode(clipNode->parent()); |
| 796 int id = clipTree().Insert(cc::ClipNode(), parentId); | 798 int id = clipTree().Insert(cc::ClipNode(), parentId); |
| 797 | 799 |
| 798 cc::ClipNode& compositorNode = *clipTree().Node(id); | 800 cc::ClipNode& compositorNode = *clipTree().Node(id); |
| 799 compositorNode.owner_id = dummyLayer->id(); | 801 compositorNode.owning_layer_id = dummyLayer->id(); |
| 800 m_propertyTrees.clip_id_to_index_map[compositorNode.owner_id] = id; | 802 m_propertyTrees.clip_id_to_index_map[compositorNode.owning_layer_id] = id; |
| 801 | 803 |
| 802 // TODO(jbroman): Don't discard rounded corners. | 804 // TODO(jbroman): Don't discard rounded corners. |
| 803 compositorNode.clip = clipNode->clipRect().rect(); | 805 compositorNode.clip = clipNode->clipRect().rect(); |
| 804 compositorNode.transform_id = | 806 compositorNode.transform_id = |
| 805 compositorIdForTransformNode(clipNode->localTransformSpace()); | 807 compositorIdForTransformNode(clipNode->localTransformSpace()); |
| 806 compositorNode.target_transform_id = kRealRootNodeId; | 808 compositorNode.target_transform_id = kRealRootNodeId; |
| 807 compositorNode.target_effect_id = kSecondaryRootNodeId; | 809 compositorNode.target_effect_id = kSecondaryRootNodeId; |
| 808 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 810 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 809 compositorNode.layers_are_clipped = true; | 811 compositorNode.layers_are_clipped = true; |
| 810 compositorNode.layers_are_clipped_when_surfaces_disabled = true; | 812 compositorNode.layers_are_clipped_when_surfaces_disabled = true; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 830 return kSecondaryRootNodeId; | 832 return kSecondaryRootNodeId; |
| 831 | 833 |
| 832 auto it = m_scrollNodeMap.find(scrollNode); | 834 auto it = m_scrollNodeMap.find(scrollNode); |
| 833 if (it != m_scrollNodeMap.end()) | 835 if (it != m_scrollNodeMap.end()) |
| 834 return it->value; | 836 return it->value; |
| 835 | 837 |
| 836 int parentId = compositorIdForScrollNode(scrollNode->parent()); | 838 int parentId = compositorIdForScrollNode(scrollNode->parent()); |
| 837 int id = scrollTree().Insert(cc::ScrollNode(), parentId); | 839 int id = scrollTree().Insert(cc::ScrollNode(), parentId); |
| 838 | 840 |
| 839 cc::ScrollNode& compositorNode = *scrollTree().Node(id); | 841 cc::ScrollNode& compositorNode = *scrollTree().Node(id); |
| 840 compositorNode.owner_id = parentId; | 842 compositorNode.owning_layer_id = parentId; |
| 841 m_propertyTrees.scroll_id_to_index_map[compositorNode.owner_id] = id; | 843 m_propertyTrees.scroll_id_to_index_map[compositorNode.owning_layer_id] = id; |
| 842 | 844 |
| 843 compositorNode.scrollable = true; | 845 compositorNode.scrollable = true; |
| 844 | 846 |
| 845 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), | 847 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), |
| 846 scrollNode->clip().height()); | 848 scrollNode->clip().height()); |
| 847 compositorNode.bounds.SetSize(scrollNode->bounds().width(), | 849 compositorNode.bounds.SetSize(scrollNode->bounds().width(), |
| 848 scrollNode->bounds().height()); | 850 scrollNode->bounds().height()); |
| 849 compositorNode.user_scrollable_horizontal = | 851 compositorNode.user_scrollable_horizontal = |
| 850 scrollNode->userScrollableHorizontal(); | 852 scrollNode->userScrollableHorizontal(); |
| 851 compositorNode.user_scrollable_vertical = | 853 compositorNode.user_scrollable_vertical = |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 // We currently create dummy layers to host effect nodes and corresponding | 969 // We currently create dummy layers to host effect nodes and corresponding |
| 968 // render surfaces. This should be removed once cc implements better support | 970 // render surfaces. This should be removed once cc implements better support |
| 969 // for freestanding property trees. | 971 // for freestanding property trees. |
| 970 scoped_refptr<cc::Layer> dummyLayer = nextEffect->ensureDummyLayer(); | 972 scoped_refptr<cc::Layer> dummyLayer = nextEffect->ensureDummyLayer(); |
| 971 m_rootLayer->AddChild(dummyLayer); | 973 m_rootLayer->AddChild(dummyLayer); |
| 972 | 974 |
| 973 int outputClipId = compositorIdForClipNode(nextEffect->outputClip()); | 975 int outputClipId = compositorIdForClipNode(nextEffect->outputClip()); |
| 974 | 976 |
| 975 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( | 977 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( |
| 976 cc::EffectNode(), compositorIdForCurrentEffectNode())); | 978 cc::EffectNode(), compositorIdForCurrentEffectNode())); |
| 977 effectNode.owner_id = dummyLayer->id(); | 979 effectNode.owning_layer_id = dummyLayer->id(); |
| 978 effectNode.clip_id = outputClipId; | 980 effectNode.clip_id = outputClipId; |
| 979 // Every effect is supposed to have render surface enabled for grouping, | 981 // Every effect is supposed to have render surface enabled for grouping, |
| 980 // but we can get away without one if the effect is opacity-only and has only | 982 // but we can get away without one if the effect is opacity-only and has only |
| 981 // one compositing child with kSrcOver blend mode. This is both for | 983 // one compositing child with kSrcOver blend mode. This is both for |
| 982 // optimization and not introducing sub-pixel differences in layout tests. | 984 // optimization and not introducing sub-pixel differences in layout tests. |
| 983 // See PropertyTreeManager::switchToEffectNode() and above where we | 985 // See PropertyTreeManager::switchToEffectNode() and above where we |
| 984 // retrospectively enable render surface when more than one compositing child | 986 // retrospectively enable render surface when more than one compositing child |
| 985 // or a child with exotic blend mode is detected. | 987 // or a child with exotic blend mode is detected. |
| 986 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface | 988 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface |
| 987 // decision until later phase of the pipeline. Remove premature optimization | 989 // decision until later phase of the pipeline. Remove premature optimization |
| 988 // here once the work is ready. | 990 // here once the work is ready. |
| 989 if (!nextEffect->filter().isEmpty() || | 991 if (!nextEffect->filter().isEmpty() || |
| 990 nextEffect->blendMode() != SkBlendMode::kSrcOver) | 992 nextEffect->blendMode() != SkBlendMode::kSrcOver) |
| 991 effectNode.has_render_surface = true; | 993 effectNode.has_render_surface = true; |
| 992 effectNode.opacity = nextEffect->opacity(); | 994 effectNode.opacity = nextEffect->opacity(); |
| 993 effectNode.filters = nextEffect->filter().asCcFilterOperations(); | 995 effectNode.filters = nextEffect->filter().asCcFilterOperations(); |
| 994 effectNode.blend_mode = nextEffect->blendMode(); | 996 effectNode.blend_mode = nextEffect->blendMode(); |
| 995 m_propertyTrees.effect_id_to_index_map[effectNode.owner_id] = effectNode.id; | 997 m_propertyTrees.effect_id_to_index_map[effectNode.owning_layer_id] = |
| 998 effectNode.id; |
| 996 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); | 999 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); |
| 997 | 1000 |
| 998 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 1001 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 999 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 1002 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
| 1000 dummyLayer->SetClipTreeIndex(outputClipId); | 1003 dummyLayer->SetClipTreeIndex(outputClipId); |
| 1001 dummyLayer->SetEffectTreeIndex(effectNode.id); | 1004 dummyLayer->SetEffectTreeIndex(effectNode.id); |
| 1002 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 1005 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 1003 } | 1006 } |
| 1004 | 1007 |
| 1005 } // namespace | 1008 } // namespace |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1197 #ifndef NDEBUG | 1200 #ifndef NDEBUG |
| 1198 void PaintArtifactCompositor::showDebugData() { | 1201 void PaintArtifactCompositor::showDebugData() { |
| 1199 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) | 1202 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) |
| 1200 ->toPrettyJSONString() | 1203 ->toPrettyJSONString() |
| 1201 .utf8() | 1204 .utf8() |
| 1202 .data(); | 1205 .data(); |
| 1203 } | 1206 } |
| 1204 #endif | 1207 #endif |
| 1205 | 1208 |
| 1206 } // namespace blink | 1209 } // namespace blink |
| OLD | NEW |