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/display_item_list.h" | 10 #include "cc/playback/display_item_list.h" |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 return nullptr; | 251 return nullptr; |
252 | 252 |
253 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI
tem&>(displayItem); | 253 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI
tem&>(displayItem); |
254 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign
LayerDisplayItem.location().y()); | 254 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign
LayerDisplayItem.location().y()); |
255 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer(); | 255 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer(); |
256 layer->SetBounds(foreignLayerDisplayItem.bounds()); | 256 layer->SetBounds(foreignLayerDisplayItem.bounds()); |
257 layer->SetIsDrawable(true); | 257 layer->SetIsDrawable(true); |
258 return layer; | 258 return layer; |
259 } | 259 } |
260 | 260 |
261 static const int kInvalidNodeId = -1; | 261 |
262 static const int kRealRootNodeId = 0; | 262 constexpr int kRealRootNodeId = 0; |
263 static const int kSecondaryRootNodeId = 1; | 263 constexpr int kSecondaryRootNodeId = 1; |
264 static const int kPropertyTreeSequenceNumber = 1; | 264 constexpr int kPropertyTreeSequenceNumber = 1; |
265 | 265 |
266 // Creates a minimal set of property trees for the compositor. | 266 // Creates a minimal set of property trees for the compositor. |
267 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) | 267 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) |
268 { | 268 { |
269 // cc's property trees expect a child of the actual root to be used. So we | 269 // cc is hardcoded to use transform node index 1 for device scale and transf
orm. |
270 // need to create and populate an additional node for each type of tree. | |
271 | |
272 cc::TransformTree& transformTree = propertyTrees->transform_tree; | 270 cc::TransformTree& transformTree = propertyTrees->transform_tree; |
273 transformTree.clear(); | 271 transformTree.clear(); |
274 transformTree.Insert(cc::TransformNode(), kRealRootNodeId); | 272 cc::TransformNode& transformNode = *transformTree.Node(transformTree.Insert(
cc::TransformNode(), kRealRootNodeId)); |
275 cc::TransformNode& transformNode = *transformTree.back(); | 273 DCHECK_EQ(transformNode.id, kSecondaryRootNodeId); |
| 274 transformNode.data.source_node_id = transformNode.parent_id; |
276 transformTree.SetTargetId(transformNode.id, kRealRootNodeId); | 275 transformTree.SetTargetId(transformNode.id, kRealRootNodeId); |
277 transformTree.SetContentTargetId(transformNode.id, kSecondaryRootNodeId); | 276 transformTree.SetContentTargetId(transformNode.id, kRealRootNodeId); |
278 transformNode.data.source_node_id = kRealRootNodeId; | |
279 transformNode.data.needs_local_transform_update = true; | |
280 transformNode.owner_id = ownerId; | |
281 transformTree.set_needs_update(true); | |
282 | 277 |
| 278 // cc is hardcoded to use clip node index 1 for viewport clip. |
283 cc::ClipTree& clipTree = propertyTrees->clip_tree; | 279 cc::ClipTree& clipTree = propertyTrees->clip_tree; |
284 clipTree.clear(); | 280 clipTree.clear(); |
285 clipTree.Insert(cc::ClipNode(), kRealRootNodeId); | 281 cc::ClipNode& clipNode = *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRea
lRootNodeId)); |
286 cc::ClipNode& clipNode = *clipTree.back(); | 282 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); |
287 clipNode.data.transform_id = kSecondaryRootNodeId; | |
288 clipNode.data.target_id = kSecondaryRootNodeId; | |
289 clipNode.owner_id = ownerId; | 283 clipNode.owner_id = ownerId; |
290 clipTree.set_needs_update(true); | |
291 | 284 |
| 285 // cc is hardcoded to use effect node index 1 for root render surface. |
292 cc::EffectTree& effectTree = propertyTrees->effect_tree; | 286 cc::EffectTree& effectTree = propertyTrees->effect_tree; |
293 effectTree.clear(); | 287 effectTree.clear(); |
294 // This matches what cc does right now: the secondary root isn't a child | 288 cc::EffectNode& effectNode = *effectTree.Node(effectTree.Insert(cc::EffectNo
de(), kRealRootNodeId)); |
295 // of the first root (at index 0). This may not have been intentional. | 289 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); |
296 effectTree.Insert(cc::EffectNode(), kInvalidNodeId); | 290 effectNode.owner_id = ownerId; |
297 cc::EffectNode& effectNode = *effectTree.back(); | 291 effectNode.data.clip_id = clipNode.id; |
298 effectNode.data.has_render_surface = true; | 292 effectNode.data.has_render_surface = true; |
299 effectNode.data.transform_id = kRealRootNodeId; | |
300 effectNode.data.clip_id = kRealRootNodeId; | |
301 effectNode.owner_id = ownerId; | |
302 effectTree.set_needs_update(true); | |
303 | 293 |
304 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree; | 294 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree; |
305 scrollTree.clear(); | 295 scrollTree.clear(); |
306 scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId); | |
307 cc::ScrollNode& scrollNode = *scrollTree.back(); | |
308 scrollNode.data.scrollable = false; | |
309 scrollNode.data.transform_id = kSecondaryRootNodeId; | |
310 scrollNode.owner_id = ownerId; | |
311 scrollTree.set_needs_update(true); | |
312 } | 296 } |
313 | 297 |
314 } // namespace | 298 } // namespace |
315 | 299 |
316 void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact) | 300 void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact) |
317 { | 301 { |
318 DCHECK(m_rootLayer); | 302 DCHECK(m_rootLayer); |
319 | 303 |
320 if (m_extraDataForTestingEnabled) | 304 if (m_extraDataForTestingEnabled) |
321 m_extraDataForTesting = wrapUnique(new ExtraDataForTesting); | 305 m_extraDataForTesting = wrapUnique(new ExtraDataForTesting); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 | 400 |
417 auto it = m_nodeMap.find(transformNode); | 401 auto it = m_nodeMap.find(transformNode); |
418 if (it != m_nodeMap.end()) | 402 if (it != m_nodeMap.end()) |
419 return it->value; | 403 return it->value; |
420 | 404 |
421 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 405 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
422 int parentId = compositorIdForNode(transformNode->parent()); | 406 int parentId = compositorIdForNode(transformNode->parent()); |
423 int id = m_transformTree.Insert(cc::TransformNode(), parentId); | 407 int id = m_transformTree.Insert(cc::TransformNode(), parentId); |
424 | 408 |
425 cc::TransformNode& compositorNode = *m_transformTree.Node(id); | 409 cc::TransformNode& compositorNode = *m_transformTree.Node(id); |
426 m_transformTree.SetTargetId(id, kSecondaryRootNodeId); | 410 m_transformTree.SetTargetId(id, kRealRootNodeId); |
427 m_transformTree.SetContentTargetId(id, kSecondaryRootNodeId); | 411 m_transformTree.SetContentTargetId(id, kRealRootNodeId); |
428 compositorNode.owner_id = dummyLayer->id(); | |
429 compositorNode.data.source_node_id = parentId; | 412 compositorNode.data.source_node_id = parentId; |
430 compositorNode.data.needs_local_transform_update = true; | |
431 | 413 |
432 FloatPoint3D origin = transformNode->origin(); | 414 FloatPoint3D origin = transformNode->origin(); |
433 compositorNode.data.pre_local.matrix().setTranslate( | 415 compositorNode.data.pre_local.matrix().setTranslate( |
434 -origin.x(), -origin.y(), -origin.z()); | 416 -origin.x(), -origin.y(), -origin.z()); |
435 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran
sformNode->matrix()); | 417 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran
sformNode->matrix()); |
436 compositorNode.data.post_local.matrix().setTranslate( | 418 compositorNode.data.post_local.matrix().setTranslate( |
437 origin.x(), origin.y(), origin.z()); | 419 origin.x(), origin.y(), origin.z()); |
438 compositorNode.data.needs_local_transform_update = true; | 420 compositorNode.data.needs_local_transform_update = true; |
439 | 421 |
440 m_rootLayer->AddChild(dummyLayer); | 422 m_rootLayer->AddChild(dummyLayer); |
441 dummyLayer->SetTransformTreeIndex(id); | 423 dummyLayer->SetTransformTreeIndex(id); |
442 dummyLayer->SetClipTreeIndex(kSecondaryRootNodeId); | 424 dummyLayer->SetClipTreeIndex(kSecondaryRootNodeId); |
443 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 425 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
444 dummyLayer->SetScrollTreeIndex(kSecondaryRootNodeId); | 426 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
445 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 427 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
446 | 428 |
447 auto result = m_nodeMap.set(transformNode, id); | 429 auto result = m_nodeMap.set(transformNode, id); |
448 DCHECK(result.isNewEntry); | 430 DCHECK(result.isNewEntry); |
449 m_transformTree.set_needs_update(true); | 431 m_transformTree.set_needs_update(true); |
450 return id; | 432 return id; |
451 } | 433 } |
452 | 434 |
453 } // namespace | 435 } // namespace |
454 | 436 |
455 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr
tifact) | 437 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr
tifact) |
456 { | 438 { |
457 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); | 439 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); |
458 | 440 |
459 // The root layer must be the owner so that the render surface | |
460 // validation works. It's expected to own at least the effect node. | |
461 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); | 441 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); |
462 m_rootLayer->RemoveAllChildren(); | 442 m_rootLayer->RemoveAllChildren(); |
463 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 443 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
464 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 444 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
465 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); | 445 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); |
466 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 446 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
467 m_rootLayer->SetScrollTreeIndex(kSecondaryRootNodeId); | 447 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); |
468 | 448 |
469 TransformTreeManager transformTreeManager(host->property_trees()->transform_
tree, m_rootLayer.get()); | 449 TransformTreeManager transformTreeManager(host->property_trees()->transform_
tree, m_rootLayer.get()); |
470 m_contentLayerClients.clear(); | 450 m_contentLayerClients.clear(); |
471 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 451 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
472 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { | 452 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { |
473 gfx::Vector2dF layerOffset; | 453 gfx::Vector2dF layerOffset; |
474 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint
Chunk, layerOffset); | 454 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint
Chunk, layerOffset); |
475 | 455 |
476 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr
operties.transform.get()); | 456 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr
operties.transform.get()); |
477 layer->set_offset_to_transform_parent(layerOffset); | 457 layer->set_offset_to_transform_parent(layerOffset); |
478 | 458 |
479 m_rootLayer->AddChild(layer); | 459 m_rootLayer->AddChild(layer); |
480 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 460 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
481 layer->SetTransformTreeIndex(transformId); | 461 layer->SetTransformTreeIndex(transformId); |
482 layer->SetClipTreeIndex(kSecondaryRootNodeId); | 462 layer->SetClipTreeIndex(kSecondaryRootNodeId); |
483 layer->SetEffectTreeIndex(kSecondaryRootNodeId); | 463 layer->SetEffectTreeIndex(kSecondaryRootNodeId); |
484 layer->SetScrollTreeIndex(kSecondaryRootNodeId); | 464 layer->SetScrollTreeIndex(kRealRootNodeId); |
485 | 465 |
486 if (m_extraDataForTestingEnabled) | 466 if (m_extraDataForTestingEnabled) |
487 m_extraDataForTesting->contentLayers.append(layer); | 467 m_extraDataForTesting->contentLayers.append(layer); |
488 } | 468 } |
489 | 469 |
490 // Mark the property trees as having been rebuilt. | 470 // Mark the property trees as having been rebuilt. |
491 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; | 471 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; |
492 host->property_trees()->needs_rebuild = false; | 472 host->property_trees()->needs_rebuild = false; |
493 } | 473 } |
494 | 474 |
495 } // namespace blink | 475 } // namespace blink |
OLD | NEW |