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 |