| 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/PropertyTreeManager.h" | 5 #include "platform/graphics/compositing/PropertyTreeManager.h" |
| 6 | 6 |
| 7 #include "cc/layers/layer.h" | 7 #include "cc/layers/layer.h" |
| 8 #include "cc/trees/clip_node.h" | 8 #include "cc/trees/clip_node.h" |
| 9 #include "cc/trees/effect_node.h" | 9 #include "cc/trees/effect_node.h" |
| 10 #include "cc/trees/layer_tree_host.h" | 10 #include "cc/trees/layer_tree_host.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 transformTree.set_needs_update(true); | 92 transformTree.set_needs_update(true); |
| 93 | 93 |
| 94 m_transformNodeMap.set(TransformPaintPropertyNode::root(), transformNode.id); | 94 m_transformNodeMap.set(TransformPaintPropertyNode::root(), transformNode.id); |
| 95 m_rootLayer->SetTransformTreeIndex(transformNode.id); | 95 m_rootLayer->SetTransformTreeIndex(transformNode.id); |
| 96 } | 96 } |
| 97 | 97 |
| 98 void PropertyTreeManager::setupRootClipNode() { | 98 void PropertyTreeManager::setupRootClipNode() { |
| 99 // cc is hardcoded to use clip node index 1 for viewport clip. | 99 // cc is hardcoded to use clip node index 1 for viewport clip. |
| 100 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; | 100 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; |
| 101 clipTree.clear(); | 101 clipTree.clear(); |
| 102 m_propertyTrees.layer_id_to_clip_node_index.clear(); | |
| 103 cc::ClipNode& clipNode = | 102 cc::ClipNode& clipNode = |
| 104 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); | 103 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); |
| 105 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); | 104 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); |
| 106 | 105 |
| 107 clipNode.resets_clip = true; | 106 clipNode.resets_clip = true; |
| 108 clipNode.owning_layer_id = m_rootLayer->id(); | 107 clipNode.owning_layer_id = m_rootLayer->id(); |
| 109 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 108 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 110 clipNode.clip = gfx::RectF( | 109 clipNode.clip = gfx::RectF( |
| 111 gfx::SizeF(m_rootLayer->layer_tree_host()->device_viewport_size())); | 110 gfx::SizeF(m_rootLayer->layer_tree_host()->device_viewport_size())); |
| 112 clipNode.transform_id = kRealRootNodeId; | 111 clipNode.transform_id = kRealRootNodeId; |
| 113 clipNode.target_transform_id = kRealRootNodeId; | 112 clipNode.target_transform_id = kRealRootNodeId; |
| 114 clipNode.target_effect_id = kSecondaryRootNodeId; | 113 clipNode.target_effect_id = kSecondaryRootNodeId; |
| 115 m_propertyTrees.layer_id_to_clip_node_index[clipNode.owning_layer_id] = | 114 clipTree.SetOwningLayerIdForNode(&clipNode, clipNode.owning_layer_id); |
| 116 clipNode.id; | |
| 117 | 115 |
| 118 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); | 116 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); |
| 119 m_rootLayer->SetClipTreeIndex(clipNode.id); | 117 m_rootLayer->SetClipTreeIndex(clipNode.id); |
| 120 } | 118 } |
| 121 | 119 |
| 122 void PropertyTreeManager::setupRootEffectNode() { | 120 void PropertyTreeManager::setupRootEffectNode() { |
| 123 // cc is hardcoded to use effect node index 1 for root render surface. | 121 // cc is hardcoded to use effect node index 1 for root render surface. |
| 124 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; | 122 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; |
| 125 effectTree.clear(); | 123 effectTree.clear(); |
| 126 m_propertyTrees.layer_id_to_effect_node_index.clear(); | |
| 127 m_propertyTrees.element_id_to_effect_node_index.clear(); | 124 m_propertyTrees.element_id_to_effect_node_index.clear(); |
| 128 cc::EffectNode& effectNode = | 125 cc::EffectNode& effectNode = |
| 129 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); | 126 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); |
| 130 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); | 127 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); |
| 131 effectNode.owning_layer_id = m_rootLayer->id(); | 128 effectNode.owning_layer_id = m_rootLayer->id(); |
| 132 effectNode.transform_id = kRealRootNodeId; | 129 effectNode.transform_id = kRealRootNodeId; |
| 133 effectNode.clip_id = kSecondaryRootNodeId; | 130 effectNode.clip_id = kSecondaryRootNodeId; |
| 134 effectNode.has_render_surface = true; | 131 effectNode.has_render_surface = true; |
| 135 m_propertyTrees.layer_id_to_effect_node_index[effectNode.owning_layer_id] = | 132 effectTree.SetOwningLayerIdForNode(&effectNode, effectNode.owning_layer_id); |
| 136 effectNode.id; | |
| 137 | 133 |
| 138 m_effectStack.push_back( | 134 m_effectStack.push_back( |
| 139 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); | 135 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); |
| 140 m_rootLayer->SetEffectTreeIndex(effectNode.id); | 136 m_rootLayer->SetEffectTreeIndex(effectNode.id); |
| 141 } | 137 } |
| 142 | 138 |
| 143 void PropertyTreeManager::setupRootScrollNode() { | 139 void PropertyTreeManager::setupRootScrollNode() { |
| 144 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; | 140 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; |
| 145 scrollTree.clear(); | 141 scrollTree.clear(); |
| 146 m_propertyTrees.layer_id_to_scroll_node_index.clear(); | |
| 147 m_propertyTrees.element_id_to_scroll_node_index.clear(); | 142 m_propertyTrees.element_id_to_scroll_node_index.clear(); |
| 148 cc::ScrollNode& scrollNode = | 143 cc::ScrollNode& scrollNode = |
| 149 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); | 144 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); |
| 150 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); | 145 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); |
| 151 scrollNode.owning_layer_id = m_rootLayer->id(); | 146 scrollNode.owning_layer_id = m_rootLayer->id(); |
| 152 scrollNode.transform_id = kSecondaryRootNodeId; | 147 scrollNode.transform_id = kSecondaryRootNodeId; |
| 153 m_propertyTrees.layer_id_to_scroll_node_index[scrollNode.owning_layer_id] = | 148 scrollTree.SetOwningLayerIdForNode(&scrollNode, scrollNode.owning_layer_id); |
| 154 scrollNode.id; | |
| 155 | 149 |
| 156 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); | 150 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); |
| 157 m_rootLayer->SetScrollTreeIndex(scrollNode.id); | 151 m_rootLayer->SetScrollTreeIndex(scrollNode.id); |
| 158 } | 152 } |
| 159 | 153 |
| 160 int PropertyTreeManager::ensureCompositorTransformNode( | 154 int PropertyTreeManager::ensureCompositorTransformNode( |
| 161 const TransformPaintPropertyNode* transformNode) { | 155 const TransformPaintPropertyNode* transformNode) { |
| 162 DCHECK(transformNode); | 156 DCHECK(transformNode); |
| 163 // TODO(crbug.com/645615): Remove the failsafe here. | 157 // TODO(crbug.com/645615): Remove the failsafe here. |
| 164 if (!transformNode) | 158 if (!transformNode) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 auto it = m_clipNodeMap.find(clipNode); | 216 auto it = m_clipNodeMap.find(clipNode); |
| 223 if (it != m_clipNodeMap.end()) | 217 if (it != m_clipNodeMap.end()) |
| 224 return it->value; | 218 return it->value; |
| 225 | 219 |
| 226 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 220 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 227 int parentId = ensureCompositorClipNode(clipNode->parent()); | 221 int parentId = ensureCompositorClipNode(clipNode->parent()); |
| 228 int id = clipTree().Insert(cc::ClipNode(), parentId); | 222 int id = clipTree().Insert(cc::ClipNode(), parentId); |
| 229 | 223 |
| 230 cc::ClipNode& compositorNode = *clipTree().Node(id); | 224 cc::ClipNode& compositorNode = *clipTree().Node(id); |
| 231 compositorNode.owning_layer_id = dummyLayer->id(); | 225 compositorNode.owning_layer_id = dummyLayer->id(); |
| 232 m_propertyTrees.layer_id_to_clip_node_index[compositorNode.owning_layer_id] = | 226 clipTree().SetOwningLayerIdForNode(&compositorNode, |
| 233 id; | 227 compositorNode.owning_layer_id); |
| 234 | 228 |
| 235 // TODO(jbroman): Don't discard rounded corners. | 229 // TODO(jbroman): Don't discard rounded corners. |
| 236 compositorNode.clip = clipNode->clipRect().rect(); | 230 compositorNode.clip = clipNode->clipRect().rect(); |
| 237 compositorNode.transform_id = | 231 compositorNode.transform_id = |
| 238 ensureCompositorTransformNode(clipNode->localTransformSpace()); | 232 ensureCompositorTransformNode(clipNode->localTransformSpace()); |
| 239 compositorNode.target_transform_id = kRealRootNodeId; | 233 compositorNode.target_transform_id = kRealRootNodeId; |
| 240 compositorNode.target_effect_id = kSecondaryRootNodeId; | 234 compositorNode.target_effect_id = kSecondaryRootNodeId; |
| 241 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 235 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 242 compositorNode.layers_are_clipped = true; | 236 compositorNode.layers_are_clipped = true; |
| 243 compositorNode.layers_are_clipped_when_surfaces_disabled = true; | 237 compositorNode.layers_are_clipped_when_surfaces_disabled = true; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 // set in updateLayerScrollMapping but that should occur here. | 318 // set in updateLayerScrollMapping but that should occur here. |
| 325 } | 319 } |
| 326 | 320 |
| 327 void PropertyTreeManager::updateLayerScrollMapping( | 321 void PropertyTreeManager::updateLayerScrollMapping( |
| 328 cc::Layer* layer, | 322 cc::Layer* layer, |
| 329 const TransformPaintPropertyNode* transform) { | 323 const TransformPaintPropertyNode* transform) { |
| 330 auto* enclosingScrollNode = transform->findEnclosingScrollNode(); | 324 auto* enclosingScrollNode = transform->findEnclosingScrollNode(); |
| 331 int scrollNodeId = ensureCompositorScrollNode(enclosingScrollNode); | 325 int scrollNodeId = ensureCompositorScrollNode(enclosingScrollNode); |
| 332 layer->SetScrollTreeIndex(scrollNodeId); | 326 layer->SetScrollTreeIndex(scrollNodeId); |
| 333 int layerId = layer->id(); | 327 int layerId = layer->id(); |
| 334 m_propertyTrees.layer_id_to_scroll_node_index[layerId] = scrollNodeId; | 328 auto& compositorScrollNode = *scrollTree().Node(scrollNodeId); |
| 329 |
| 330 scrollTree().SetOwningLayerIdForNode(&compositorScrollNode, layerId); |
| 335 | 331 |
| 336 if (!transform->isScrollTranslation()) | 332 if (!transform->isScrollTranslation()) |
| 337 return; | 333 return; |
| 338 | 334 |
| 339 auto& compositorScrollNode = *scrollTree().Node(scrollNodeId); | |
| 340 | |
| 341 // TODO(pdr): Remove the scroll node's owning_layer_id. This approach of | 335 // TODO(pdr): Remove the scroll node's owning_layer_id. This approach of |
| 342 // setting owning_layer_id only when it is not set lets us maintain a 1:1 | 336 // setting owning_layer_id only when it is not set lets us maintain a 1:1 |
| 343 // mapping from layer to scroll node. | 337 // mapping from layer to scroll node. |
| 344 if (compositorScrollNode.owning_layer_id == cc::Layer::INVALID_ID) { | 338 if (compositorScrollNode.owning_layer_id == cc::Layer::INVALID_ID) { |
| 345 compositorScrollNode.owning_layer_id = layerId; | 339 compositorScrollNode.owning_layer_id = layerId; |
| 346 auto& compositorTransformNode = | 340 auto& compositorTransformNode = |
| 347 *transformTree().Node(compositorScrollNode.transform_id); | 341 *transformTree().Node(compositorScrollNode.transform_id); |
| 348 // TODO(pdr): Set this in updateScrollAndScrollTranslationNodes once the | 342 // TODO(pdr): Set this in updateScrollAndScrollTranslationNodes once the |
| 349 // layer id is no longer needed. | 343 // layer id is no longer needed. |
| 350 scrollTree().SetScrollOffset(layerId, | 344 scrollTree().SetScrollOffset(layerId, |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 // We are cutting corner here by support only specific configuration. | 434 // We are cutting corner here by support only specific configuration. |
| 441 DCHECK(nextEffect->colorFilter() == ColorFilterLuminanceToAlpha); | 435 DCHECK(nextEffect->colorFilter() == ColorFilterLuminanceToAlpha); |
| 442 DCHECK(nextEffect->blendMode() == SkBlendMode::kDstIn); | 436 DCHECK(nextEffect->blendMode() == SkBlendMode::kDstIn); |
| 443 DCHECK(nextEffect->filter().isEmpty()); | 437 DCHECK(nextEffect->filter().isEmpty()); |
| 444 effectNode.filters.Append(cc::FilterOperation::CreateReferenceFilter( | 438 effectNode.filters.Append(cc::FilterOperation::CreateReferenceFilter( |
| 445 SkColorFilterImageFilter::Make(SkLumaColorFilter::Make(), nullptr))); | 439 SkColorFilterImageFilter::Make(SkLumaColorFilter::Make(), nullptr))); |
| 446 } else { | 440 } else { |
| 447 effectNode.filters = nextEffect->filter().asCcFilterOperations(); | 441 effectNode.filters = nextEffect->filter().asCcFilterOperations(); |
| 448 } | 442 } |
| 449 effectNode.blend_mode = nextEffect->blendMode(); | 443 effectNode.blend_mode = nextEffect->blendMode(); |
| 450 m_propertyTrees.layer_id_to_effect_node_index[effectNode.owning_layer_id] = | 444 effectTree().SetOwningLayerIdForNode(&effectNode, effectNode.owning_layer_id); |
| 451 effectNode.id; | |
| 452 CompositorElementId compositorElementId = nextEffect->compositorElementId(); | 445 CompositorElementId compositorElementId = nextEffect->compositorElementId(); |
| 453 if (compositorElementId) { | 446 if (compositorElementId) { |
| 454 m_propertyTrees.element_id_to_effect_node_index[compositorElementId] = | 447 m_propertyTrees.element_id_to_effect_node_index[compositorElementId] = |
| 455 effectNode.id; | 448 effectNode.id; |
| 456 } | 449 } |
| 457 m_effectStack.push_back(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); | 450 m_effectStack.push_back(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); |
| 458 | 451 |
| 459 dummyLayer->set_property_tree_sequence_number(m_sequenceNumber); | 452 dummyLayer->set_property_tree_sequence_number(m_sequenceNumber); |
| 460 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 453 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
| 461 dummyLayer->SetClipTreeIndex(outputClipId); | 454 dummyLayer->SetClipTreeIndex(outputClipId); |
| 462 dummyLayer->SetEffectTreeIndex(effectNode.id); | 455 dummyLayer->SetEffectTreeIndex(effectNode.id); |
| 463 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 456 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 464 } | 457 } |
| 465 | 458 |
| 466 } // namespace blink | 459 } // namespace blink |
| OLD | NEW |