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