Chromium Code Reviews| 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 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 return layer; | 335 return layer; |
| 336 } | 336 } |
| 337 | 337 |
| 338 namespace { | 338 namespace { |
| 339 | 339 |
| 340 class PropertyTreeManager { | 340 class PropertyTreeManager { |
| 341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); | 341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); |
| 342 public: | 342 public: |
| 343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) | 343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) |
| 344 : m_propertyTrees(propertyTrees) | 344 : m_propertyTrees(propertyTrees) |
| 345 , m_rootLayer(rootLayer) {} | 345 , m_rootLayer(rootLayer) |
| 346 #if DCHECK_IS_ON() | |
| 347 , m_isFirstEffectEver(true) | |
| 348 #endif | |
| 349 { | |
| 350 m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeI d}); | |
| 351 } | |
| 346 | 352 |
| 347 int compositorIdForTransformNode(const TransformPaintPropertyNode*); | 353 int compositorIdForTransformNode(const TransformPaintPropertyNode*); |
| 348 int compositorIdForClipNode(const ClipPaintPropertyNode*); | 354 int compositorIdForClipNode(const ClipPaintPropertyNode*); |
| 355 void switchToEffectNode(const EffectPaintPropertyNode& nextEffect); | |
| 356 int compositorIdForCurrentEffectNode() const { return m_effectStack.last().i d; } | |
| 349 | 357 |
| 350 private: | 358 private: |
| 359 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect); | |
| 360 | |
| 351 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } | 361 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } |
| 352 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } | 362 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } |
| 363 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; } | |
| 364 | |
| 365 const EffectPaintPropertyNode* currentEffectNode() { return m_effectStack.la st().effect; } | |
|
jbroman
2016/07/08 18:32:34
super-nit: for consistency with compositorIdForCur
trchen
2016/07/09 01:09:24
Done.
| |
| 353 | 366 |
| 354 // Property trees which should be updated by the manager. | 367 // Property trees which should be updated by the manager. |
| 355 cc::PropertyTrees& m_propertyTrees; | 368 cc::PropertyTrees& m_propertyTrees; |
| 356 | 369 |
| 357 // Layer to which transform "owner" layers should be added. These will not | 370 // Layer to which transform "owner" layers should be added. These will not |
| 358 // have any actual children, but at present must exist in the tree. | 371 // have any actual children, but at present must exist in the tree. |
| 359 cc::Layer* m_rootLayer; | 372 cc::Layer* m_rootLayer; |
| 360 | 373 |
| 361 // Maps from Blink-side property tree nodes to cc property node indices. | 374 // Maps from Blink-side property tree nodes to cc property node indices. |
| 362 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; | 375 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; |
| 363 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; | 376 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; |
| 377 | |
| 378 struct BlinkEffectAndCcIdPair { | |
| 379 const EffectPaintPropertyNode* effect; | |
| 380 int id; | |
| 381 }; | |
| 382 Vector<BlinkEffectAndCcIdPair> m_effectStack; | |
| 383 | |
| 384 #if DCHECK_IS_ON() | |
| 385 HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted; | |
| 386 bool m_isFirstEffectEver; | |
| 387 #endif | |
| 364 }; | 388 }; |
| 365 | 389 |
| 366 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode) | 390 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode) |
| 367 { | 391 { |
| 368 if (!transformNode) | 392 if (!transformNode) |
| 369 return kSecondaryRootNodeId; | 393 return kSecondaryRootNodeId; |
| 370 | 394 |
| 371 auto it = m_transformNodeMap.find(transformNode); | 395 auto it = m_transformNodeMap.find(transformNode); |
| 372 if (it != m_transformNodeMap.end()) | 396 if (it != m_transformNodeMap.end()) |
| 373 return it->value; | 397 return it->value; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 432 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 456 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 433 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 457 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 434 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 458 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 435 | 459 |
| 436 auto result = m_clipNodeMap.set(clipNode, id); | 460 auto result = m_clipNodeMap.set(clipNode, id); |
| 437 DCHECK(result.isNewEntry); | 461 DCHECK(result.isNewEntry); |
| 438 clipTree().set_needs_update(true); | 462 clipTree().set_needs_update(true); |
| 439 return id; | 463 return id; |
| 440 } | 464 } |
| 441 | 465 |
| 466 unsigned depth(const EffectPaintPropertyNode* node) | |
| 467 { | |
| 468 unsigned result = 0; | |
| 469 for (; node; node = node->parent()) | |
| 470 result++; | |
| 471 return result; | |
| 472 } | |
| 473 const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod e* nodeA, const EffectPaintPropertyNode* nodeB) | |
|
jbroman
2016/07/08 18:32:34
super-nit: blank line above this function please
trchen
2016/07/09 01:09:25
Done.
| |
| 474 { | |
| 475 // Optimized common case. | |
| 476 if (nodeA == nodeB) | |
| 477 return nodeA; | |
| 478 | |
| 479 unsigned depthA = depth(nodeA), depthB = depth(nodeB); | |
| 480 while (depthA > depthB) { | |
| 481 nodeA = nodeA->parent(); | |
| 482 depthA--; | |
| 483 } | |
| 484 while (depthB > depthA) { | |
| 485 nodeB = nodeB->parent(); | |
| 486 depthB--; | |
| 487 } | |
| 488 DCHECK_EQ(depthA, depthB); | |
| 489 while (nodeA != nodeB) { | |
| 490 nodeA = nodeA->parent(); | |
| 491 nodeB = nodeB->parent(); | |
| 492 } | |
| 493 return nodeA; | |
| 494 } | |
| 495 | |
| 496 void PropertyTreeManager::switchToEffectNode(const EffectPaintPropertyNode& next Effect) | |
| 497 { | |
| 498 const EffectPaintPropertyNode* ancestor = lowestCommonAncestor(currentEffect Node(), &nextEffect); | |
| 499 while (currentEffectNode() != ancestor) | |
| 500 m_effectStack.removeLast(); | |
| 501 | |
| 502 #if DCHECK_IS_ON() | |
| 503 DCHECK(m_isFirstEffectEver || currentEffectNode()) << "Malformed effect tree . Nodes in the same property tree should have common root."; | |
| 504 m_isFirstEffectEver = false; | |
| 505 #endif | |
| 506 buildEffectNodesRecursively(&nextEffect); | |
| 507 } | |
| 508 | |
| 509 void PropertyTreeManager::buildEffectNodesRecursively(const EffectPaintPropertyN ode* nextEffect) | |
| 510 { | |
| 511 if (nextEffect == currentEffectNode()) | |
| 512 return; | |
| 513 DCHECK(nextEffect); | |
| 514 | |
| 515 buildEffectNodesRecursively(nextEffect->parent()); | |
| 516 DCHECK_EQ(nextEffect->parent(), currentEffectNode()); | |
| 517 | |
| 518 #if DCHECK_IS_ON() | |
| 519 DCHECK(!m_effectNodesConverted.contains(nextEffect)) << "Malformed paint art ifact. Paint chunks under the same effect should be contiguous."; | |
| 520 m_effectNodesConverted.add(nextEffect); | |
| 521 #endif | |
| 522 | |
| 523 // We currently create dummy layers to host effect nodes and corresponding r ender surface. | |
| 524 // This should be removed once cc implements better support for freestanding property trees. | |
| 525 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | |
| 526 m_rootLayer->AddChild(dummyLayer); | |
| 527 | |
| 528 // Also cc assumes a clip node is always created by a layer that creates ren der surface. | |
| 529 cc::ClipNode& dummyClip = *clipTree().Node(clipTree().Insert(cc::ClipNode(), kSecondaryRootNodeId)); | |
| 530 dummyClip.owner_id = dummyLayer->id(); | |
| 531 dummyClip.data.transform_id = kRealRootNodeId; | |
|
jbroman
2016/07/08 18:32:34
It looks like they don't yet exist on EffectPaintP
trchen
2016/07/09 01:09:25
I don't think the dummy clip should even exist. Mo
jbroman
2016/07/09 20:25:24
That's fair, but the effect will have an associate
| |
| 532 dummyClip.data.target_id = kRealRootNodeId; | |
| 533 | |
| 534 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert(cc::Effe ctNode(), compositorIdForCurrentEffectNode())); | |
| 535 effectNode.owner_id = dummyLayer->id(); | |
| 536 effectNode.data.clip_id = dummyClip.id; | |
| 537 effectNode.data.has_render_surface = true; | |
| 538 effectNode.data.opacity = nextEffect->opacity(); | |
| 539 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); | |
| 540 | |
| 541 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | |
| 542 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | |
| 543 dummyLayer->SetClipTreeIndex(dummyClip.id); | |
| 544 dummyLayer->SetEffectTreeIndex(effectNode.id); | |
| 545 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | |
| 546 } | |
| 547 | |
| 442 } // namespace | 548 } // namespace |
| 443 | 549 |
| 444 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) | 550 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) |
| 445 { | 551 { |
| 446 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); | 552 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); |
| 447 | 553 |
| 448 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); | 554 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); |
| 449 m_rootLayer->RemoveAllChildren(); | 555 m_rootLayer->RemoveAllChildren(); |
| 450 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 556 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 451 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 557 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
| 452 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); | 558 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); |
| 453 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 559 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
| 454 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); | 560 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 455 | 561 |
| 456 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get()); | 562 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get()); |
| 457 m_contentLayerClients.clear(); | 563 m_contentLayerClients.clear(); |
| 458 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 564 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
| 459 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { | 565 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { |
| 566 propertyTreeManager.switchToEffectNode(*paintChunk.properties.effect.get ()); | |
|
jbroman
2016/07/08 18:32:34
nit: is there a reason this has to happen above th
trchen
2016/07/09 01:09:25
Done.
| |
| 460 gfx::Vector2dF layerOffset; | 567 gfx::Vector2dF layerOffset; |
| 461 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); | 568 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); |
| 462 | 569 |
| 463 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); | 570 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); |
| 464 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); | 571 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); |
| 465 | 572 |
| 466 layer->set_offset_to_transform_parent(layerOffset); | 573 layer->set_offset_to_transform_parent(layerOffset); |
| 467 | 574 |
| 468 m_rootLayer->AddChild(layer); | 575 m_rootLayer->AddChild(layer); |
| 469 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 576 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 470 layer->SetTransformTreeIndex(transformId); | 577 layer->SetTransformTreeIndex(transformId); |
| 471 layer->SetClipTreeIndex(clipId); | 578 layer->SetClipTreeIndex(clipId); |
| 472 layer->SetEffectTreeIndex(kSecondaryRootNodeId); | 579 layer->SetEffectTreeIndex(propertyTreeManager.compositorIdForCurrentEffe ctNode()); |
| 473 layer->SetScrollTreeIndex(kRealRootNodeId); | 580 layer->SetScrollTreeIndex(kRealRootNodeId); |
| 474 | 581 |
| 475 if (m_extraDataForTestingEnabled) | 582 if (m_extraDataForTestingEnabled) |
| 476 m_extraDataForTesting->contentLayers.append(layer); | 583 m_extraDataForTesting->contentLayers.append(layer); |
| 477 } | 584 } |
| 478 | 585 |
| 479 // Mark the property trees as having been rebuilt. | 586 // Mark the property trees as having been rebuilt. |
| 480 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; | 587 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; |
| 481 host->property_trees()->needs_rebuild = false; | 588 host->property_trees()->needs_rebuild = false; |
| 482 } | 589 } |
| 483 | 590 |
| 484 } // namespace blink | 591 } // namespace blink |
| OLD | NEW |