Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(927)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp

Issue 2380683006: SPv2: Add support for tracking raster paint invalidations in testing. (Closed)
Patch Set: none Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "cc/playback/display_item_list_settings.h" 11 #include "cc/playback/display_item_list_settings.h"
12 #include "cc/playback/drawing_display_item.h" 12 #include "cc/playback/drawing_display_item.h"
13 #include "cc/playback/transform_display_item.h" 13 #include "cc/playback/transform_display_item.h"
14 #include "cc/trees/clip_node.h" 14 #include "cc/trees/clip_node.h"
15 #include "cc/trees/effect_node.h" 15 #include "cc/trees/effect_node.h"
16 #include "cc/trees/layer_tree_host.h" 16 #include "cc/trees/layer_tree_host.h"
17 #include "cc/trees/property_tree.h" 17 #include "cc/trees/property_tree.h"
18 #include "cc/trees/scroll_node.h" 18 #include "cc/trees/scroll_node.h"
19 #include "cc/trees/transform_node.h" 19 #include "cc/trees/transform_node.h"
20 #include "platform/RuntimeEnabledFeatures.h" 20 #include "platform/RuntimeEnabledFeatures.h"
21 #include "platform/graphics/paint/ClipPaintPropertyNode.h" 21 #include "platform/graphics/paint/ClipPaintPropertyNode.h"
22 #include "platform/graphics/paint/DisplayItem.h" 22 #include "platform/graphics/paint/DisplayItem.h"
23 #include "platform/graphics/paint/DrawingDisplayItem.h" 23 #include "platform/graphics/paint/DrawingDisplayItem.h"
24 #include "platform/graphics/paint/ForeignLayerDisplayItem.h" 24 #include "platform/graphics/paint/ForeignLayerDisplayItem.h"
25 #include "platform/graphics/paint/GeometryPropertyTreeState.h" 25 #include "platform/graphics/paint/GeometryPropertyTreeState.h"
26 #include "platform/graphics/paint/PaintArtifact.h" 26 #include "platform/graphics/paint/PaintArtifact.h"
27 #include "platform/graphics/paint/RasterInvalidationTracking.h"
27 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" 28 #include "platform/graphics/paint/ScrollPaintPropertyNode.h"
28 #include "platform/graphics/paint/TransformPaintPropertyNode.h" 29 #include "platform/graphics/paint/TransformPaintPropertyNode.h"
29 #include "public/platform/Platform.h" 30 #include "public/platform/Platform.h"
30 #include "public/platform/WebCompositorSupport.h" 31 #include "public/platform/WebCompositorSupport.h"
31 #include "public/platform/WebLayer.h" 32 #include "public/platform/WebLayer.h"
32 #include "ui/gfx/geometry/point.h" 33 #include "ui/gfx/geometry/point.h"
33 #include "ui/gfx/geometry/point_f.h" 34 #include "ui/gfx/geometry/point_f.h"
34 #include "ui/gfx/geometry/rect.h" 35 #include "ui/gfx/geometry/rect.h"
35 #include "ui/gfx/geometry/rect_f.h" 36 #include "ui/gfx/geometry/rect_f.h"
36 #include "ui/gfx/geometry/size.h" 37 #include "ui/gfx/geometry/size.h"
37 #include "ui/gfx/geometry/size_conversions.h" 38 #include "ui/gfx/geometry/size_conversions.h"
38 #include "ui/gfx/geometry/size_f.h" 39 #include "ui/gfx/geometry/size_f.h"
39 #include "ui/gfx/skia_util.h" 40 #include "ui/gfx/skia_util.h"
40 #include "wtf/Allocator.h" 41 #include "wtf/Allocator.h"
41 #include "wtf/Noncopyable.h" 42 #include "wtf/Noncopyable.h"
42 #include "wtf/PtrUtil.h" 43 #include "wtf/PtrUtil.h"
43 #include <algorithm> 44 #include <algorithm>
44 #include <memory> 45 #include <memory>
45 #include <utility> 46 #include <utility>
46 47
47 namespace blink { 48 namespace blink {
48 49
50 template class RasterInvalidationTrackingMap<const cc::Layer>;
51 static RasterInvalidationTrackingMap<const cc::Layer>&
52 ccLayersRasterInvalidationTrackingMap() {
53 DEFINE_STATIC_LOCAL(RasterInvalidationTrackingMap<const cc::Layer>, map, ());
54 return map;
55 }
56
57 template <typename T>
58 static std::unique_ptr<JSONArray> sizeAsJSONArray(const T& size) {
59 std::unique_ptr<JSONArray> array = JSONArray::create();
60 array->pushDouble(size.width());
61 array->pushDouble(size.height());
62 return array;
63 }
64
49 class PaintArtifactCompositor::ContentLayerClientImpl 65 class PaintArtifactCompositor::ContentLayerClientImpl
50 : public cc::ContentLayerClient { 66 : public cc::ContentLayerClient {
51 WTF_MAKE_NONCOPYABLE(ContentLayerClientImpl); 67 WTF_MAKE_NONCOPYABLE(ContentLayerClientImpl);
52 USING_FAST_MALLOC(ContentLayerClientImpl); 68 USING_FAST_MALLOC(ContentLayerClientImpl);
53 69
54 public: 70 public:
55 ContentLayerClientImpl(Optional<DisplayItem::Id> paintChunkId) 71 ContentLayerClientImpl(DisplayItem::Id paintChunkId)
56 : m_id(paintChunkId), m_ccPictureLayer(cc::PictureLayer::Create(this)) {} 72 : m_id(paintChunkId),
73 m_debugName(paintChunkId.client.debugName()),
74 m_ccPictureLayer(cc::PictureLayer::Create(this)) {}
57 75
58 void SetDisplayList(scoped_refptr<cc::DisplayItemList> ccDisplayItemList) { 76 void SetDisplayList(scoped_refptr<cc::DisplayItemList> ccDisplayItemList) {
59 m_ccDisplayItemList = std::move(ccDisplayItemList); 77 m_ccDisplayItemList = std::move(ccDisplayItemList);
60 } 78 }
61 void SetPaintableRegion(gfx::Rect region) { m_paintableRegion = region; } 79 void SetPaintableRegion(gfx::Rect region) { m_paintableRegion = region; }
62 80
63 // cc::ContentLayerClient 81 // cc::ContentLayerClient
64 gfx::Rect PaintableRegion() override { return m_paintableRegion; } 82 gfx::Rect PaintableRegion() override { return m_paintableRegion; }
65 scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList( 83 scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList(
66 PaintingControlSetting) override { 84 PaintingControlSetting) override {
67 return m_ccDisplayItemList; 85 return m_ccDisplayItemList;
68 } 86 }
69 bool FillsBoundsCompletely() const override { return false; } 87 bool FillsBoundsCompletely() const override { return false; }
70 size_t GetApproximateUnsharedMemoryUsage() const override { 88 size_t GetApproximateUnsharedMemoryUsage() const override {
71 // TODO(jbroman): Actually calculate memory usage. 89 // TODO(jbroman): Actually calculate memory usage.
72 return 0; 90 return 0;
73 } 91 }
74 92
93 void resetTrackedRasterInvalidations() {
94 RasterInvalidationTracking* tracking =
95 ccLayersRasterInvalidationTrackingMap().find(m_ccPictureLayer.get());
96 if (!tracking)
97 return;
98
99 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled())
100 tracking->trackedRasterInvalidations.clear();
101 else
102 ccLayersRasterInvalidationTrackingMap().remove(m_ccPictureLayer.get());
103 }
104
105 bool hasTrackedRasterInvalidations() const {
106 RasterInvalidationTracking* tracking =
107 ccLayersRasterInvalidationTrackingMap().find(m_ccPictureLayer.get());
108 if (tracking)
109 return !tracking->trackedRasterInvalidations.isEmpty();
110 return false;
111 }
112
113 void setNeedsDisplayRect(const gfx::Rect& rect,
114 RasterInvalidationInfo* rasterInvalidationInfo) {
115 m_ccPictureLayer->SetNeedsDisplayRect(rect);
116
117 if (!rasterInvalidationInfo || rect.IsEmpty())
118 return;
119
120 RasterInvalidationTracking& tracking =
121 ccLayersRasterInvalidationTrackingMap().add(m_ccPictureLayer.get());
122
123 tracking.trackedRasterInvalidations.append(*rasterInvalidationInfo);
124
125 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) {
126 // TODO(crbug.com/496260): Some antialiasing effects overflows the paint i nvalidation rect.
127 IntRect r = rasterInvalidationInfo->rect;
128 r.inflate(1);
129 tracking.rasterInvalidationRegionSinceLastPaint.unite(r);
130 }
131 }
132
133 std::unique_ptr<JSONObject> layerAsJSON() {
134 std::unique_ptr<JSONObject> json = JSONObject::create();
135 json->setString("name", m_debugName);
136 IntSize bounds(m_ccPictureLayer->bounds().width(),
137 m_ccPictureLayer->bounds().height());
138 if (!bounds.isEmpty())
139 json->setArray("bounds", sizeAsJSONArray(bounds));
140 json->setBoolean("contentsOpaque", m_ccPictureLayer->contents_opaque());
141 json->setBoolean("drawsContent", m_ccPictureLayer->DrawsContent());
142
143 ccLayersRasterInvalidationTrackingMap().asJSON(m_ccPictureLayer.get(),
144 json.get());
145 return json;
146 }
147
75 scoped_refptr<cc::PictureLayer> ccPictureLayer() { return m_ccPictureLayer; } 148 scoped_refptr<cc::PictureLayer> ccPictureLayer() { return m_ccPictureLayer; }
76 149
77 bool matches(const PaintChunk& paintChunk) { 150 bool matches(const PaintChunk& paintChunk) {
78 return m_id && paintChunk.id && *m_id == *paintChunk.id; 151 return paintChunk.id && m_id == *paintChunk.id;
79 } 152 }
80 153
81 private: 154 private:
82 Optional<PaintChunk::Id> m_id; 155 PaintChunk::Id m_id;
156 String m_debugName;
83 scoped_refptr<cc::PictureLayer> m_ccPictureLayer; 157 scoped_refptr<cc::PictureLayer> m_ccPictureLayer;
84 scoped_refptr<cc::DisplayItemList> m_ccDisplayItemList; 158 scoped_refptr<cc::DisplayItemList> m_ccDisplayItemList;
85 gfx::Rect m_paintableRegion; 159 gfx::Rect m_paintableRegion;
86 }; 160 };
87 161
88 PaintArtifactCompositor::PaintArtifactCompositor() { 162 PaintArtifactCompositor::PaintArtifactCompositor() {
89 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 163 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled())
90 return; 164 return;
91 m_rootLayer = cc::Layer::Create(); 165 m_rootLayer = cc::Layer::Create();
92 m_webLayer = wrapUnique( 166 m_webLayer = wrapUnique(
93 Platform::current()->compositorSupport()->createLayerFromCCLayer( 167 Platform::current()->compositorSupport()->createLayerFromCCLayer(
94 m_rootLayer.get())); 168 m_rootLayer.get()));
169 m_isTrackingRasterInvalidations = false;
95 } 170 }
96 171
97 PaintArtifactCompositor::~PaintArtifactCompositor() {} 172 PaintArtifactCompositor::~PaintArtifactCompositor() {}
98 173
174 void PaintArtifactCompositor::setTracksRasterInvalidations(
175 bool tracksPaintInvalidations) {
176 resetTrackedRasterInvalidations();
177 m_isTrackingRasterInvalidations = tracksPaintInvalidations;
178 }
179
180 void PaintArtifactCompositor::resetTrackedRasterInvalidations() {
181 for (auto& client : m_contentLayerClients)
182 client->resetTrackedRasterInvalidations();
183 }
184
185 bool PaintArtifactCompositor::hasTrackedRasterInvalidations() const {
186 for (auto& client : m_contentLayerClients) {
187 if (client->hasTrackedRasterInvalidations())
188 return true;
189 }
190 return false;
191 }
192
193 std::unique_ptr<JSONObject> PaintArtifactCompositor::layersAsJSON(
194 LayerTreeFlags flags) const {
195 std::unique_ptr<JSONArray> layersJSON = JSONArray::create();
196 for (const auto& client : m_contentLayerClients) {
197 layersJSON->pushObject(client->layerAsJSON());
198 }
199 std::unique_ptr<JSONObject> json = JSONObject::create();
200 json->setArray("layers", std::move(layersJSON));
201 return json;
202 }
203
99 namespace { 204 namespace {
100 205
101 static gfx::Rect largeRect(-200000, -200000, 400000, 400000); 206 static gfx::Rect largeRect(-200000, -200000, 400000, 400000);
102 207
103 static void appendDisplayItemToCcDisplayItemList(const DisplayItem& displayItem, 208 static void appendDisplayItemToCcDisplayItemList(const DisplayItem& displayItem,
104 cc::DisplayItemList* list) { 209 cc::DisplayItemList* list) {
105 if (DisplayItem::isDrawingType(displayItem.getType())) { 210 if (DisplayItem::isDrawingType(displayItem.getType())) {
106 const SkPicture* picture = 211 const SkPicture* picture =
107 static_cast<const DrawingDisplayItem&>(displayItem).picture(); 212 static_cast<const DrawingDisplayItem&>(displayItem).picture();
108 if (!picture) 213 if (!picture)
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 cc::ScrollNode& scrollNode = 311 cc::ScrollNode& scrollNode =
207 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId)); 312 *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId));
208 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); 313 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId);
209 scrollNode.owner_id = ownerId; 314 scrollNode.owner_id = ownerId;
210 scrollNode.transform_id = kRealRootNodeId; 315 scrollNode.transform_id = kRealRootNodeId;
211 } 316 }
212 317
213 } // namespace 318 } // namespace
214 319
215 std::unique_ptr<PaintArtifactCompositor::ContentLayerClientImpl> 320 std::unique_ptr<PaintArtifactCompositor::ContentLayerClientImpl>
216 PaintArtifactCompositor::clientForPaintChunk(const PaintChunk& paintChunk) { 321 PaintArtifactCompositor::clientForPaintChunk(
322 const PaintChunk& paintChunk,
323 const PaintArtifact& paintArtifact) {
217 // TODO(chrishtr): for now, just using a linear walk. In the future we can opt imize this by using the same techniques used in 324 // TODO(chrishtr): for now, just using a linear walk. In the future we can opt imize this by using the same techniques used in
218 // PaintController for display lists. 325 // PaintController for display lists.
219 for (auto& client : m_contentLayerClients) { 326 for (auto& client : m_contentLayerClients) {
220 if (client && client->matches(paintChunk)) 327 if (client && client->matches(paintChunk))
221 return std::move(client); 328 return std::move(client);
222 } 329 }
223 return wrapUnique(new ContentLayerClientImpl(paintChunk.id)); 330
331 return wrapUnique(new ContentLayerClientImpl(
332 paintChunk.id
333 ? *paintChunk.id
334 : paintArtifact.getDisplayItemList()[paintChunk.beginIndex].getId()));
224 } 335 }
225 336
226 scoped_refptr<cc::Layer> PaintArtifactCompositor::layerForPaintChunk( 337 scoped_refptr<cc::Layer> PaintArtifactCompositor::layerForPaintChunk(
227 const PaintArtifact& paintArtifact, 338 const PaintArtifact& paintArtifact,
228 const PaintChunk& paintChunk, 339 const PaintChunk& paintChunk,
229 gfx::Vector2dF& layerOffset, 340 gfx::Vector2dF& layerOffset,
230 Vector<std::unique_ptr<ContentLayerClientImpl>>& newContentLayerClients) { 341 Vector<std::unique_ptr<ContentLayerClientImpl>>& newContentLayerClients,
342 RasterInvalidationTracking* tracking) {
231 DCHECK(paintChunk.size()); 343 DCHECK(paintChunk.size());
232 344
233 // If the paint chunk is a foreign layer, just return that layer. 345 // If the paint chunk is a foreign layer, just return that layer.
234 if (scoped_refptr<cc::Layer> foreignLayer = 346 if (scoped_refptr<cc::Layer> foreignLayer =
235 foreignLayerForPaintChunk(paintArtifact, paintChunk, layerOffset)) 347 foreignLayerForPaintChunk(paintArtifact, paintChunk, layerOffset))
236 return foreignLayer; 348 return foreignLayer;
237 349
238 // The common case: create or reuse a PictureLayer for painted content. 350 // The common case: create or reuse a PictureLayer for painted content.
239 std::unique_ptr<ContentLayerClientImpl> contentLayerClient = 351 std::unique_ptr<ContentLayerClientImpl> contentLayerClient =
240 clientForPaintChunk(paintChunk); 352 clientForPaintChunk(paintChunk, paintArtifact);
241 353
242 gfx::Rect combinedBounds = enclosingIntRect(paintChunk.bounds); 354 gfx::Rect combinedBounds = enclosingIntRect(paintChunk.bounds);
243 scoped_refptr<cc::DisplayItemList> displayList = 355 scoped_refptr<cc::DisplayItemList> displayList =
244 recordPaintChunk(paintArtifact, paintChunk, combinedBounds); 356 recordPaintChunk(paintArtifact, paintChunk, combinedBounds);
245 contentLayerClient->SetDisplayList(std::move(displayList)); 357 contentLayerClient->SetDisplayList(std::move(displayList));
246 contentLayerClient->SetPaintableRegion(gfx::Rect(combinedBounds.size())); 358 contentLayerClient->SetPaintableRegion(gfx::Rect(combinedBounds.size()));
247 359
248 layerOffset = combinedBounds.OffsetFromOrigin(); 360 layerOffset = combinedBounds.OffsetFromOrigin();
249 scoped_refptr<cc::PictureLayer> ccPictureLayer = 361 scoped_refptr<cc::PictureLayer> ccPictureLayer =
250 contentLayerClient->ccPictureLayer(); 362 contentLayerClient->ccPictureLayer();
251 ccPictureLayer->SetBounds(combinedBounds.size()); 363 ccPictureLayer->SetBounds(combinedBounds.size());
252 ccPictureLayer->SetIsDrawable(true); 364 ccPictureLayer->SetIsDrawable(true);
253 if (paintChunk.knownToBeOpaque) 365 if (paintChunk.knownToBeOpaque)
254 ccPictureLayer->SetContentsOpaque(true); 366 ccPictureLayer->SetContentsOpaque(true);
255 for (auto& invalidation : paintChunk.rasterInvalidationRects) { 367 DCHECK(!tracking ||
256 IntRect rect(enclosingIntRect(invalidation)); 368 tracking->trackedRasterInvalidations.size() ==
369 paintChunk.rasterInvalidationRects.size());
370 for (unsigned index = 0; index < paintChunk.rasterInvalidationRects.size();
371 ++index) {
372 IntRect rect(enclosingIntRect(paintChunk.rasterInvalidationRects[index]));
257 gfx::Rect ccInvalidationRect(rect.x(), rect.y(), std::max(0, rect.width()), 373 gfx::Rect ccInvalidationRect(rect.x(), rect.y(), std::max(0, rect.width()),
258 std::max(0, rect.height())); 374 std::max(0, rect.height()));
375 ccInvalidationRect.Offset(-combinedBounds.OffsetFromOrigin());
259 // Raster paintChunk.rasterInvalidationRects is in the space of the containi ng transform node, so need to subtract off the layer offset. 376 // Raster paintChunk.rasterInvalidationRects is in the space of the containi ng transform node, so need to subtract off the layer offset.
260 ccInvalidationRect.Offset(-combinedBounds.OffsetFromOrigin()); 377 contentLayerClient->setNeedsDisplayRect(
261 ccPictureLayer->SetNeedsDisplayRect(ccInvalidationRect); 378 ccInvalidationRect,
379 tracking ? &tracking->trackedRasterInvalidations[index] : nullptr);
262 } 380 }
263 381
264 newContentLayerClients.append(std::move(contentLayerClient)); 382 newContentLayerClients.append(std::move(contentLayerClient));
265 return ccPictureLayer; 383 return ccPictureLayer;
266 } 384 }
267 385
268 namespace { 386 namespace {
269 387
270 class PropertyTreeManager { 388 class PropertyTreeManager {
271 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); 389 WTF_MAKE_NONCOPYABLE(PropertyTreeManager);
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 679
562 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 680 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
563 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId); 681 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
564 dummyLayer->SetClipTreeIndex(dummyClip.id); 682 dummyLayer->SetClipTreeIndex(dummyClip.id);
565 dummyLayer->SetEffectTreeIndex(effectNode.id); 683 dummyLayer->SetEffectTreeIndex(effectNode.id);
566 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); 684 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
567 } 685 }
568 686
569 } // namespace 687 } // namespace
570 688
571 void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact) { 689 void PaintArtifactCompositor::update(
690 const PaintArtifact& paintArtifact,
691 RasterInvalidationTrackingMap<const PaintChunk>* rasterChunkInvalidations) {
572 DCHECK(m_rootLayer); 692 DCHECK(m_rootLayer);
573 693
574 cc::LayerTree* layerTree = m_rootLayer->GetLayerTree(); 694 cc::LayerTree* layerTree = m_rootLayer->GetLayerTree();
575 695
576 // The tree will be null after detaching and this update can be ignored. 696 // The tree will be null after detaching and this update can be ignored.
577 // See: WebViewImpl::detachPaintArtifactCompositor(). 697 // See: WebViewImpl::detachPaintArtifactCompositor().
578 if (!layerTree) 698 if (!layerTree)
579 return; 699 return;
580 700
581 if (m_extraDataForTestingEnabled) 701 if (m_extraDataForTestingEnabled)
(...skipping 10 matching lines...) Expand all
592 712
593 PropertyTreeManager propertyTreeManager(*layerTree->property_trees(), 713 PropertyTreeManager propertyTreeManager(*layerTree->property_trees(),
594 m_rootLayer.get()); 714 m_rootLayer.get());
595 propertyTreeManager.setDeviceScaleFactor(layerTree->device_scale_factor()); 715 propertyTreeManager.setDeviceScaleFactor(layerTree->device_scale_factor());
596 716
597 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients; 717 Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients;
598 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); 718 newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
599 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { 719 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) {
600 gfx::Vector2dF layerOffset; 720 gfx::Vector2dF layerOffset;
601 scoped_refptr<cc::Layer> layer = layerForPaintChunk( 721 scoped_refptr<cc::Layer> layer = layerForPaintChunk(
602 paintArtifact, paintChunk, layerOffset, newContentLayerClients); 722 paintArtifact, paintChunk, layerOffset, newContentLayerClients,
723 rasterChunkInvalidations ? rasterChunkInvalidations->find(&paintChunk)
724 : nullptr);
603 725
604 int transformId = propertyTreeManager.compositorIdForTransformNode( 726 int transformId = propertyTreeManager.compositorIdForTransformNode(
605 paintChunk.properties.transform.get()); 727 paintChunk.properties.transform.get());
606 int scrollId = propertyTreeManager.compositorIdForScrollNode( 728 int scrollId = propertyTreeManager.compositorIdForScrollNode(
607 paintChunk.properties.scroll.get()); 729 paintChunk.properties.scroll.get());
608 int clipId = propertyTreeManager.compositorIdForClipNode( 730 int clipId = propertyTreeManager.compositorIdForClipNode(
609 paintChunk.properties.clip.get()); 731 paintChunk.properties.clip.get());
610 int effectId = propertyTreeManager.switchToEffectNode( 732 int effectId = propertyTreeManager.switchToEffectNode(
611 *paintChunk.properties.effect.get()); 733 *paintChunk.properties.effect.get());
612 734
(...skipping 22 matching lines...) Expand all
635 } 757 }
636 m_contentLayerClients.clear(); 758 m_contentLayerClients.clear();
637 m_contentLayerClients.swap(newContentLayerClients); 759 m_contentLayerClients.swap(newContentLayerClients);
638 760
639 // Mark the property trees as having been rebuilt. 761 // Mark the property trees as having been rebuilt.
640 layerTree->property_trees()->sequence_number = kPropertyTreeSequenceNumber; 762 layerTree->property_trees()->sequence_number = kPropertyTreeSequenceNumber;
641 layerTree->property_trees()->needs_rebuild = false; 763 layerTree->property_trees()->needs_rebuild = false;
642 } 764 }
643 765
644 } // namespace blink 766 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698