| 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 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 transformTree.set_needs_update(true); | 439 transformTree.set_needs_update(true); |
| 440 | 440 |
| 441 m_transformNodeMap.set(TransformPaintPropertyNode::root(), transformNode.id); | 441 m_transformNodeMap.set(TransformPaintPropertyNode::root(), transformNode.id); |
| 442 m_rootLayer->SetTransformTreeIndex(transformNode.id); | 442 m_rootLayer->SetTransformTreeIndex(transformNode.id); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void PropertyTreeManager::setupRootClipNode() { | 445 void PropertyTreeManager::setupRootClipNode() { |
| 446 // cc is hardcoded to use clip node index 1 for viewport clip. | 446 // cc is hardcoded to use clip node index 1 for viewport clip. |
| 447 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; | 447 cc::ClipTree& clipTree = m_propertyTrees.clip_tree; |
| 448 clipTree.clear(); | 448 clipTree.clear(); |
| 449 m_propertyTrees.clip_id_to_index_map.clear(); |
| 449 cc::ClipNode& clipNode = | 450 cc::ClipNode& clipNode = |
| 450 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); | 451 *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId)); |
| 451 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); | 452 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId); |
| 452 | 453 |
| 453 clipNode.resets_clip = true; | 454 clipNode.resets_clip = true; |
| 454 clipNode.owner_id = m_rootLayer->id(); | 455 clipNode.owner_id = m_rootLayer->id(); |
| 455 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 456 clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 456 clipNode.clip = gfx::RectF( | 457 clipNode.clip = gfx::RectF( |
| 457 gfx::SizeF(m_rootLayer->GetLayerTree()->device_viewport_size())); | 458 gfx::SizeF(m_rootLayer->GetLayerTree()->device_viewport_size())); |
| 458 clipNode.transform_id = kRealRootNodeId; | 459 clipNode.transform_id = kRealRootNodeId; |
| 459 clipNode.target_transform_id = kRealRootNodeId; | 460 clipNode.target_transform_id = kRealRootNodeId; |
| 460 clipNode.target_effect_id = kSecondaryRootNodeId; | 461 clipNode.target_effect_id = kSecondaryRootNodeId; |
| 462 m_propertyTrees.clip_id_to_index_map[clipNode.owner_id] = clipNode.id; |
| 461 | 463 |
| 462 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); | 464 m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id); |
| 463 m_rootLayer->SetClipTreeIndex(clipNode.id); | 465 m_rootLayer->SetClipTreeIndex(clipNode.id); |
| 464 } | 466 } |
| 465 | 467 |
| 466 void PropertyTreeManager::setupRootEffectNode() { | 468 void PropertyTreeManager::setupRootEffectNode() { |
| 467 // cc is hardcoded to use effect node index 1 for root render surface. | 469 // cc is hardcoded to use effect node index 1 for root render surface. |
| 468 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; | 470 cc::EffectTree& effectTree = m_propertyTrees.effect_tree; |
| 469 effectTree.clear(); | 471 effectTree.clear(); |
| 472 m_propertyTrees.effect_id_to_index_map.clear(); |
| 470 cc::EffectNode& effectNode = | 473 cc::EffectNode& effectNode = |
| 471 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); | 474 *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId)); |
| 472 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); | 475 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); |
| 473 effectNode.owner_id = m_rootLayer->id(); | 476 effectNode.owner_id = m_rootLayer->id(); |
| 474 effectNode.transform_id = kRealRootNodeId; | 477 effectNode.transform_id = kRealRootNodeId; |
| 475 effectNode.clip_id = kSecondaryRootNodeId; | 478 effectNode.clip_id = kSecondaryRootNodeId; |
| 476 effectNode.has_render_surface = true; | 479 effectNode.has_render_surface = true; |
| 480 m_propertyTrees.effect_id_to_index_map[effectNode.owner_id] = effectNode.id; |
| 477 | 481 |
| 478 m_effectStack.append( | 482 m_effectStack.append( |
| 479 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); | 483 BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id}); |
| 480 m_rootLayer->SetEffectTreeIndex(effectNode.id); | 484 m_rootLayer->SetEffectTreeIndex(effectNode.id); |
| 481 } | 485 } |
| 482 | 486 |
| 483 void PropertyTreeManager::setupRootScrollNode() { | 487 void PropertyTreeManager::setupRootScrollNode() { |
| 484 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; | 488 cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree; |
| 485 scrollTree.clear(); | 489 scrollTree.clear(); |
| 490 m_propertyTrees.scroll_id_to_index_map.clear(); |
| 486 cc::ScrollNode& scrollNode = | 491 cc::ScrollNode& scrollNode = |
| 487 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); | 492 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); |
| 488 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); | 493 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); |
| 489 scrollNode.owner_id = m_rootLayer->id(); | 494 scrollNode.owner_id = m_rootLayer->id(); |
| 490 scrollNode.transform_id = kSecondaryRootNodeId; | 495 scrollNode.transform_id = kSecondaryRootNodeId; |
| 496 m_propertyTrees.scroll_id_to_index_map[scrollNode.owner_id] = scrollNode.id; |
| 491 | 497 |
| 492 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); | 498 m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id); |
| 493 m_rootLayer->SetScrollTreeIndex(scrollNode.id); | 499 m_rootLayer->SetScrollTreeIndex(scrollNode.id); |
| 494 } | 500 } |
| 495 | 501 |
| 496 int PropertyTreeManager::compositorIdForTransformNode( | 502 int PropertyTreeManager::compositorIdForTransformNode( |
| 497 const TransformPaintPropertyNode* transformNode) { | 503 const TransformPaintPropertyNode* transformNode) { |
| 498 DCHECK(transformNode); | 504 DCHECK(transformNode); |
| 499 // TODO(crbug.com/645615): Remove the failsafe here. | 505 // TODO(crbug.com/645615): Remove the failsafe here. |
| 500 if (!transformNode) | 506 if (!transformNode) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 auto it = m_clipNodeMap.find(clipNode); | 554 auto it = m_clipNodeMap.find(clipNode); |
| 549 if (it != m_clipNodeMap.end()) | 555 if (it != m_clipNodeMap.end()) |
| 550 return it->value; | 556 return it->value; |
| 551 | 557 |
| 552 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); | 558 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); |
| 553 int parentId = compositorIdForClipNode(clipNode->parent()); | 559 int parentId = compositorIdForClipNode(clipNode->parent()); |
| 554 int id = clipTree().Insert(cc::ClipNode(), parentId); | 560 int id = clipTree().Insert(cc::ClipNode(), parentId); |
| 555 | 561 |
| 556 cc::ClipNode& compositorNode = *clipTree().Node(id); | 562 cc::ClipNode& compositorNode = *clipTree().Node(id); |
| 557 compositorNode.owner_id = dummyLayer->id(); | 563 compositorNode.owner_id = dummyLayer->id(); |
| 564 m_propertyTrees.clip_id_to_index_map[compositorNode.owner_id] = id; |
| 558 | 565 |
| 559 // TODO(jbroman): Don't discard rounded corners. | 566 // TODO(jbroman): Don't discard rounded corners. |
| 560 compositorNode.clip = clipNode->clipRect().rect(); | 567 compositorNode.clip = clipNode->clipRect().rect(); |
| 561 compositorNode.transform_id = | 568 compositorNode.transform_id = |
| 562 compositorIdForTransformNode(clipNode->localTransformSpace()); | 569 compositorIdForTransformNode(clipNode->localTransformSpace()); |
| 563 compositorNode.target_transform_id = kRealRootNodeId; | 570 compositorNode.target_transform_id = kRealRootNodeId; |
| 564 compositorNode.target_effect_id = kSecondaryRootNodeId; | 571 compositorNode.target_effect_id = kSecondaryRootNodeId; |
| 565 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; | 572 compositorNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP; |
| 566 compositorNode.layers_are_clipped = true; | 573 compositorNode.layers_are_clipped = true; |
| 567 compositorNode.layers_are_clipped_when_surfaces_disabled = true; | 574 compositorNode.layers_are_clipped_when_surfaces_disabled = true; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 588 | 595 |
| 589 auto it = m_scrollNodeMap.find(scrollNode); | 596 auto it = m_scrollNodeMap.find(scrollNode); |
| 590 if (it != m_scrollNodeMap.end()) | 597 if (it != m_scrollNodeMap.end()) |
| 591 return it->value; | 598 return it->value; |
| 592 | 599 |
| 593 int parentId = compositorIdForScrollNode(scrollNode->parent()); | 600 int parentId = compositorIdForScrollNode(scrollNode->parent()); |
| 594 int id = scrollTree().Insert(cc::ScrollNode(), parentId); | 601 int id = scrollTree().Insert(cc::ScrollNode(), parentId); |
| 595 | 602 |
| 596 cc::ScrollNode& compositorNode = *scrollTree().Node(id); | 603 cc::ScrollNode& compositorNode = *scrollTree().Node(id); |
| 597 compositorNode.owner_id = parentId; | 604 compositorNode.owner_id = parentId; |
| 605 m_propertyTrees.scroll_id_to_index_map[compositorNode.owner_id] = id; |
| 598 | 606 |
| 599 compositorNode.scrollable = true; | 607 compositorNode.scrollable = true; |
| 600 | 608 |
| 601 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), | 609 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), |
| 602 scrollNode->clip().height()); | 610 scrollNode->clip().height()); |
| 603 compositorNode.bounds.SetSize(scrollNode->bounds().width(), | 611 compositorNode.bounds.SetSize(scrollNode->bounds().width(), |
| 604 scrollNode->bounds().height()); | 612 scrollNode->bounds().height()); |
| 605 compositorNode.user_scrollable_horizontal = | 613 compositorNode.user_scrollable_horizontal = |
| 606 scrollNode->userScrollableHorizontal(); | 614 scrollNode->userScrollableHorizontal(); |
| 607 compositorNode.user_scrollable_vertical = | 615 compositorNode.user_scrollable_vertical = |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 m_rootLayer->AddChild(dummyLayer); | 725 m_rootLayer->AddChild(dummyLayer); |
| 718 | 726 |
| 719 // Also cc assumes a clip node is always created by a layer that creates | 727 // Also cc assumes a clip node is always created by a layer that creates |
| 720 // render surface. | 728 // render surface. |
| 721 cc::ClipNode& dummyClip = | 729 cc::ClipNode& dummyClip = |
| 722 *clipTree().Node(clipTree().Insert(cc::ClipNode(), kSecondaryRootNodeId)); | 730 *clipTree().Node(clipTree().Insert(cc::ClipNode(), kSecondaryRootNodeId)); |
| 723 dummyClip.owner_id = dummyLayer->id(); | 731 dummyClip.owner_id = dummyLayer->id(); |
| 724 dummyClip.transform_id = kRealRootNodeId; | 732 dummyClip.transform_id = kRealRootNodeId; |
| 725 dummyClip.target_transform_id = kRealRootNodeId; | 733 dummyClip.target_transform_id = kRealRootNodeId; |
| 726 dummyClip.target_effect_id = kSecondaryRootNodeId; | 734 dummyClip.target_effect_id = kSecondaryRootNodeId; |
| 735 m_propertyTrees.clip_id_to_index_map[dummyClip.owner_id] = dummyClip.id; |
| 727 | 736 |
| 728 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( | 737 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert( |
| 729 cc::EffectNode(), compositorIdForCurrentEffectNode())); | 738 cc::EffectNode(), compositorIdForCurrentEffectNode())); |
| 730 effectNode.owner_id = dummyLayer->id(); | 739 effectNode.owner_id = dummyLayer->id(); |
| 731 effectNode.clip_id = dummyClip.id; | 740 effectNode.clip_id = dummyClip.id; |
| 732 // Every effect is supposed to have render surface enabled for grouping, | 741 // Every effect is supposed to have render surface enabled for grouping, |
| 733 // but we can get away without one if the effect is opacity-only and has only | 742 // but we can get away without one if the effect is opacity-only and has only |
| 734 // one compositing child. This is both for optimization and not introducing | 743 // one compositing child. This is both for optimization and not introducing |
| 735 // sub-pixel differences in layout tests. | 744 // sub-pixel differences in layout tests. |
| 736 // See PropertyTreeManager::switchToEffectNode() where we retrospectively | 745 // See PropertyTreeManager::switchToEffectNode() where we retrospectively |
| 737 // enable render surface when more than one compositing child is detected. | 746 // enable render surface when more than one compositing child is detected. |
| 738 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface | 747 // TODO(crbug.com/504464): There is ongoing work in cc to delay render surface |
| 739 // decision until later phase of the pipeline. Remove premature optimization | 748 // decision until later phase of the pipeline. Remove premature optimization |
| 740 // here once the work is ready. | 749 // here once the work is ready. |
| 741 effectNode.opacity = nextEffect->opacity(); | 750 effectNode.opacity = nextEffect->opacity(); |
| 751 m_propertyTrees.effect_id_to_index_map[effectNode.owner_id] = effectNode.id; |
| 742 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); | 752 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id}); |
| 743 | 753 |
| 744 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 754 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
| 745 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); | 755 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); |
| 746 dummyLayer->SetClipTreeIndex(dummyClip.id); | 756 dummyLayer->SetClipTreeIndex(dummyClip.id); |
| 747 dummyLayer->SetEffectTreeIndex(effectNode.id); | 757 dummyLayer->SetEffectTreeIndex(effectNode.id); |
| 748 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 758 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
| 749 } | 759 } |
| 750 | 760 |
| 751 } // namespace | 761 } // namespace |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 m_contentLayerClients.clear(); | 825 m_contentLayerClients.clear(); |
| 816 m_contentLayerClients.swap(newContentLayerClients); | 826 m_contentLayerClients.swap(newContentLayerClients); |
| 817 | 827 |
| 818 // Mark the property trees as having been rebuilt. | 828 // Mark the property trees as having been rebuilt. |
| 819 layerTree->property_trees()->sequence_number = kPropertyTreeSequenceNumber; | 829 layerTree->property_trees()->sequence_number = kPropertyTreeSequenceNumber; |
| 820 layerTree->property_trees()->needs_rebuild = false; | 830 layerTree->property_trees()->needs_rebuild = false; |
| 821 layerTree->property_trees()->ResetCachedData(); | 831 layerTree->property_trees()->ResetCachedData(); |
| 822 } | 832 } |
| 823 | 833 |
| 824 } // namespace blink | 834 } // namespace blink |
| OLD | NEW |