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 <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 #include "cc/layers/content_layer_client.h" | 10 #include "cc/layers/content_layer_client.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 } | 55 } |
56 | 56 |
57 template <typename T> | 57 template <typename T> |
58 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) { | 58 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) { |
59 std::unique_ptr<JSONArray> array = JSONArray::create(); | 59 std::unique_ptr<JSONArray> array = JSONArray::create(); |
60 array->pushDouble(size.width()); | 60 array->pushDouble(size.width()); |
61 array->pushDouble(size.height()); | 61 array->pushDouble(size.height()); |
62 return array; | 62 return array; |
63 } | 63 } |
64 | 64 |
| 65 // cc property trees make use of a sequence number to identify when tree |
| 66 // topology changes. For now we naively increment the sequence number each time |
| 67 // we update the property trees. We should explore optimizing our management of |
| 68 // the sequence number through the use of a dirty bit or similar. See |
| 69 // http://crbug.com/692842#c4. |
| 70 static int sPropertyTreeSequenceNumber = 1; |
| 71 |
65 class PaintArtifactCompositor::ContentLayerClientImpl | 72 class PaintArtifactCompositor::ContentLayerClientImpl |
66 : public cc::ContentLayerClient { | 73 : public cc::ContentLayerClient { |
67 WTF_MAKE_NONCOPYABLE(ContentLayerClientImpl); | 74 WTF_MAKE_NONCOPYABLE(ContentLayerClientImpl); |
68 USING_FAST_MALLOC(ContentLayerClientImpl); | 75 USING_FAST_MALLOC(ContentLayerClientImpl); |
69 | 76 |
70 public: | 77 public: |
71 ContentLayerClientImpl(DisplayItem::Id paintChunkId) | 78 ContentLayerClientImpl(DisplayItem::Id paintChunkId) |
72 : m_id(paintChunkId), | 79 : m_id(paintChunkId), |
73 m_debugName(paintChunkId.client.debugName()), | 80 m_debugName(paintChunkId.client.debugName()), |
74 m_ccPictureLayer(cc::PictureLayer::Create(this)) {} | 81 m_ccPictureLayer(cc::PictureLayer::Create(this)) {} |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 | 696 |
690 // The tree will be null after detaching and this update can be ignored. | 697 // The tree will be null after detaching and this update can be ignored. |
691 // See: WebViewImpl::detachPaintArtifactCompositor(). | 698 // See: WebViewImpl::detachPaintArtifactCompositor(). |
692 if (!layerTreeHost) | 699 if (!layerTreeHost) |
693 return; | 700 return; |
694 | 701 |
695 if (m_extraDataForTestingEnabled) | 702 if (m_extraDataForTestingEnabled) |
696 m_extraDataForTesting = WTF::wrapUnique(new ExtraDataForTesting); | 703 m_extraDataForTesting = WTF::wrapUnique(new ExtraDataForTesting); |
697 | 704 |
698 m_rootLayer->RemoveAllChildren(); | 705 m_rootLayer->RemoveAllChildren(); |
699 m_rootLayer->set_property_tree_sequence_number( | 706 |
700 PropertyTreeManager::kPropertyTreeSequenceNumber); | 707 m_rootLayer->set_property_tree_sequence_number(sPropertyTreeSequenceNumber); |
701 | 708 |
702 PropertyTreeManager propertyTreeManager(*layerTreeHost->property_trees(), | 709 PropertyTreeManager propertyTreeManager(*layerTreeHost->property_trees(), |
703 m_rootLayer.get()); | 710 m_rootLayer.get(), |
| 711 sPropertyTreeSequenceNumber); |
704 | 712 |
705 Vector<PendingLayer, 0> pendingLayers; | 713 Vector<PendingLayer, 0> pendingLayers; |
706 collectPendingLayers(paintArtifact, pendingLayers, geometryMapper); | 714 collectPendingLayers(paintArtifact, pendingLayers, geometryMapper); |
707 | 715 |
708 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients; | 716 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients; |
709 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 717 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
710 for (const PendingLayer& pendingLayer : pendingLayers) { | 718 for (const PendingLayer& pendingLayer : pendingLayers) { |
711 gfx::Vector2dF layerOffset; | 719 gfx::Vector2dF layerOffset; |
712 scoped_refptr<cc::Layer> layer = compositedLayerForPendingLayer( | 720 scoped_refptr<cc::Layer> layer = compositedLayerForPendingLayer( |
713 paintArtifact, pendingLayer, layerOffset, newContentLayerClients, | 721 paintArtifact, pendingLayer, layerOffset, newContentLayerClients, |
714 rasterChunkInvalidations, storeDebugInfo, geometryMapper); | 722 rasterChunkInvalidations, storeDebugInfo, geometryMapper); |
715 | 723 |
716 const auto* transform = pendingLayer.propertyTreeState.transform(); | 724 const auto* transform = pendingLayer.propertyTreeState.transform(); |
717 int transformId = | 725 int transformId = |
718 propertyTreeManager.ensureCompositorTransformNode(transform); | 726 propertyTreeManager.ensureCompositorTransformNode(transform); |
719 int clipId = propertyTreeManager.ensureCompositorClipNode( | 727 int clipId = propertyTreeManager.ensureCompositorClipNode( |
720 pendingLayer.propertyTreeState.clip()); | 728 pendingLayer.propertyTreeState.clip()); |
721 int effectId = propertyTreeManager.switchToEffectNode( | 729 int effectId = propertyTreeManager.switchToEffectNode( |
722 *pendingLayer.propertyTreeState.effect()); | 730 *pendingLayer.propertyTreeState.effect()); |
723 | 731 |
724 layer->set_offset_to_transform_parent(layerOffset); | 732 layer->set_offset_to_transform_parent(layerOffset); |
725 layer->SetElementId(pendingLayer.propertyTreeState.compositorElementId()); | 733 layer->SetElementId(pendingLayer.propertyTreeState.compositorElementId()); |
726 | 734 |
727 m_rootLayer->AddChild(layer); | 735 m_rootLayer->AddChild(layer); |
728 layer->set_property_tree_sequence_number( | 736 layer->set_property_tree_sequence_number(sPropertyTreeSequenceNumber); |
729 PropertyTreeManager::kPropertyTreeSequenceNumber); | |
730 layer->SetTransformTreeIndex(transformId); | 737 layer->SetTransformTreeIndex(transformId); |
731 layer->SetClipTreeIndex(clipId); | 738 layer->SetClipTreeIndex(clipId); |
732 layer->SetEffectTreeIndex(effectId); | 739 layer->SetEffectTreeIndex(effectId); |
733 propertyTreeManager.updateLayerScrollMapping(layer.get(), transform); | 740 propertyTreeManager.updateLayerScrollMapping(layer.get(), transform); |
734 | 741 |
735 layer->SetShouldCheckBackfaceVisibility(pendingLayer.backfaceHidden); | 742 layer->SetShouldCheckBackfaceVisibility(pendingLayer.backfaceHidden); |
736 | 743 |
737 if (m_extraDataForTestingEnabled) | 744 if (m_extraDataForTestingEnabled) |
738 m_extraDataForTesting->contentLayers.push_back(layer); | 745 m_extraDataForTesting->contentLayers.push_back(layer); |
739 } | 746 } |
740 m_contentLayerClients.clear(); | 747 m_contentLayerClients.clear(); |
741 m_contentLayerClients.swap(newContentLayerClients); | 748 m_contentLayerClients.swap(newContentLayerClients); |
742 | 749 |
743 // Mark the property trees as having been rebuilt. | 750 // Mark the property trees as having been rebuilt. |
744 layerTreeHost->property_trees()->sequence_number = | 751 layerTreeHost->property_trees()->sequence_number = |
745 PropertyTreeManager::kPropertyTreeSequenceNumber; | 752 sPropertyTreeSequenceNumber; |
746 layerTreeHost->property_trees()->needs_rebuild = false; | 753 layerTreeHost->property_trees()->needs_rebuild = false; |
747 layerTreeHost->property_trees()->ResetCachedData(); | 754 layerTreeHost->property_trees()->ResetCachedData(); |
| 755 |
| 756 sPropertyTreeSequenceNumber++; |
748 } | 757 } |
749 | 758 |
750 #ifndef NDEBUG | 759 #ifndef NDEBUG |
751 void PaintArtifactCompositor::showDebugData() { | 760 void PaintArtifactCompositor::showDebugData() { |
752 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) | 761 LOG(ERROR) << layersAsJSON(LayerTreeIncludesDebugInfo) |
753 ->toPrettyJSONString() | 762 ->toPrettyJSONString() |
754 .utf8() | 763 .utf8() |
755 .data(); | 764 .data(); |
756 } | 765 } |
757 #endif | 766 #endif |
758 | 767 |
759 } // namespace blink | 768 } // namespace blink |
OLD | NEW |