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/paint/display_item_list.h" | 10 #include "cc/paint/display_item_list.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
84 return 0; | 84 return 0; |
85 } | 85 } |
86 | 86 |
87 void ResetTrackedRasterInvalidations() { | 87 void ResetTrackedRasterInvalidations() { |
88 RasterInvalidationTracking* tracking = | 88 RasterInvalidationTracking* tracking = |
89 CcLayersRasterInvalidationTrackingMap().Find(cc_picture_layer_.get()); | 89 CcLayersRasterInvalidationTrackingMap().Find(cc_picture_layer_.get()); |
90 if (!tracking) | 90 if (!tracking) |
91 return; | 91 return; |
92 | 92 |
93 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) | 93 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) |
94 tracking->tracked_raster_invalidations.clear(); | 94 tracking->tracked_invalidations.clear(); |
95 else | 95 else |
96 CcLayersRasterInvalidationTrackingMap().Remove(cc_picture_layer_.get()); | 96 CcLayersRasterInvalidationTrackingMap().Remove(cc_picture_layer_.get()); |
97 } | 97 } |
98 | 98 |
99 bool HasTrackedRasterInvalidations() const { | 99 bool HasTrackedRasterInvalidations() const { |
100 RasterInvalidationTracking* tracking = | 100 RasterInvalidationTracking* tracking = |
101 CcLayersRasterInvalidationTrackingMap().Find(cc_picture_layer_.get()); | 101 CcLayersRasterInvalidationTrackingMap().Find(cc_picture_layer_.get()); |
102 if (tracking) | 102 if (tracking) |
103 return !tracking->tracked_raster_invalidations.IsEmpty(); | 103 return !tracking->tracked_invalidations.IsEmpty(); |
104 return false; | 104 return false; |
105 } | 105 } |
106 | 106 |
107 void SetNeedsDisplayRect(const gfx::Rect& rect, | 107 void SetNeedsDisplayRect(const gfx::Rect& rect) { |
108 RasterInvalidationInfo* raster_invalidation_info) { | |
109 cc_picture_layer_->SetNeedsDisplayRect(rect); | 108 cc_picture_layer_->SetNeedsDisplayRect(rect); |
109 } | |
110 | 110 |
111 if (!raster_invalidation_info || rect.IsEmpty()) | 111 void AddTrackedRasterInvalidations( |
112 return; | 112 const RasterInvalidationTracking& tracking) { |
113 | 113 auto& cc_tracking = |
114 RasterInvalidationTracking& tracking = | |
115 CcLayersRasterInvalidationTrackingMap().Add(cc_picture_layer_.get()); | 114 CcLayersRasterInvalidationTrackingMap().Add(cc_picture_layer_.get()); |
chrishtr
2017/05/10 17:25:33
cc_picture_layer_ is persisted across frames, and
Xianzhu
2017/05/10 18:27:02
I see. That's not necessary. We can just keep incr
| |
116 | 115 cc_tracking.tracked_invalidations.AppendVector( |
117 tracking.tracked_raster_invalidations.push_back(*raster_invalidation_info); | 116 tracking.tracked_invalidations); |
118 | 117 |
119 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { | 118 if (RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { |
120 // TODO(crbug.com/496260): Some antialiasing effects overflow the paint | 119 cc_tracking.invalidation_region_since_last_paint.Unite( |
121 // invalidation rect. | 120 tracking.invalidation_region_since_last_paint); |
122 IntRect r = raster_invalidation_info->rect; | |
123 r.Inflate(1); | |
124 tracking.raster_invalidation_region_since_last_paint.Unite(r); | |
125 } | 121 } |
126 } | 122 } |
127 | 123 |
128 std::unique_ptr<JSONObject> LayerAsJSON(LayerTreeFlags flags) { | 124 std::unique_ptr<JSONObject> LayerAsJSON(LayerTreeFlags flags) { |
129 std::unique_ptr<JSONObject> json = JSONObject::Create(); | 125 std::unique_ptr<JSONObject> json = JSONObject::Create(); |
130 json->SetString("name", debug_name_); | 126 json->SetString("name", debug_name_); |
131 IntSize bounds(cc_picture_layer_->bounds().width(), | 127 IntSize bounds(cc_picture_layer_->bounds().width(), |
132 cc_picture_layer_->bounds().height()); | 128 cc_picture_layer_->bounds().height()); |
133 if (!bounds.IsEmpty()) | 129 if (!bounds.IsEmpty()) |
134 json->SetArray("bounds", SizeAsJSONArray(bounds)); | 130 json->SetArray("bounds", SizeAsJSONArray(bounds)); |
(...skipping 29 matching lines...) Expand all Loading... | |
164 gfx::Rect paintable_region_; | 160 gfx::Rect paintable_region_; |
165 Vector<std::unique_ptr<JSONArray>> paint_chunk_debug_data_; | 161 Vector<std::unique_ptr<JSONArray>> paint_chunk_debug_data_; |
166 }; | 162 }; |
167 | 163 |
168 PaintArtifactCompositor::PaintArtifactCompositor() { | 164 PaintArtifactCompositor::PaintArtifactCompositor() { |
169 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 165 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
170 return; | 166 return; |
171 root_layer_ = cc::Layer::Create(); | 167 root_layer_ = cc::Layer::Create(); |
172 web_layer_ = Platform::Current()->CompositorSupport()->CreateLayerFromCCLayer( | 168 web_layer_ = Platform::Current()->CompositorSupport()->CreateLayerFromCCLayer( |
173 root_layer_.get()); | 169 root_layer_.get()); |
174 is_tracking_raster_invalidations_ = false; | |
175 } | 170 } |
176 | 171 |
177 PaintArtifactCompositor::~PaintArtifactCompositor() {} | 172 PaintArtifactCompositor::~PaintArtifactCompositor() {} |
178 | 173 |
179 void PaintArtifactCompositor::SetTracksRasterInvalidations( | |
180 bool tracks_paint_invalidations) { | |
181 ResetTrackedRasterInvalidations(); | |
182 is_tracking_raster_invalidations_ = tracks_paint_invalidations; | |
183 } | |
184 | |
185 void PaintArtifactCompositor::ResetTrackedRasterInvalidations() { | 174 void PaintArtifactCompositor::ResetTrackedRasterInvalidations() { |
186 for (auto& client : content_layer_clients_) | 175 for (auto& client : content_layer_clients_) |
187 client->ResetTrackedRasterInvalidations(); | 176 client->ResetTrackedRasterInvalidations(); |
188 } | 177 } |
189 | 178 |
190 bool PaintArtifactCompositor::HasTrackedRasterInvalidations() const { | 179 bool PaintArtifactCompositor::HasTrackedRasterInvalidations() const { |
191 for (auto& client : content_layer_clients_) { | 180 for (auto& client : content_layer_clients_) { |
192 if (client->HasTrackedRasterInvalidations()) | 181 if (client->HasTrackedRasterInvalidations()) |
193 return true; | 182 return true; |
194 } | 183 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 content_layer_client->SetPaintableRegion( | 270 content_layer_client->SetPaintableRegion( |
282 gfx::Rect(cc_combined_bounds.size())); | 271 gfx::Rect(cc_combined_bounds.size())); |
283 | 272 |
284 scoped_refptr<cc::PictureLayer> cc_picture_layer = | 273 scoped_refptr<cc::PictureLayer> cc_picture_layer = |
285 content_layer_client->CcPictureLayer(); | 274 content_layer_client->CcPictureLayer(); |
286 cc_picture_layer->SetBounds(cc_combined_bounds.size()); | 275 cc_picture_layer->SetBounds(cc_combined_bounds.size()); |
287 cc_picture_layer->SetIsDrawable(true); | 276 cc_picture_layer->SetIsDrawable(true); |
288 cc_picture_layer->SetContentsOpaque(pending_layer.known_to_be_opaque); | 277 cc_picture_layer->SetContentsOpaque(pending_layer.known_to_be_opaque); |
289 content_layer_client->ClearPaintChunkDebugData(); | 278 content_layer_client->ClearPaintChunkDebugData(); |
290 | 279 |
280 // We always copy all tracked invalidations from paint_chunk to | |
281 // content_layer_client from scratch. | |
282 if (tracking_map) | |
283 content_layer_client->ResetTrackedRasterInvalidations(); | |
284 | |
291 for (const auto& paint_chunk : pending_layer.paint_chunks) { | 285 for (const auto& paint_chunk : pending_layer.paint_chunks) { |
292 RasterInvalidationTracking* raster_tracking = | |
293 tracking_map ? tracking_map->Find(paint_chunk) : nullptr; | |
294 DCHECK(!raster_tracking || | |
295 raster_tracking->tracked_raster_invalidations.size() == | |
296 paint_chunk->raster_invalidation_rects.size()); | |
297 | |
298 if (store_debug_info) { | 286 if (store_debug_info) { |
299 content_layer_client->AddPaintChunkDebugData( | 287 content_layer_client->AddPaintChunkDebugData( |
300 paint_artifact.GetDisplayItemList().SubsequenceAsJSON( | 288 paint_artifact.GetDisplayItemList().SubsequenceAsJSON( |
301 paint_chunk->begin_index, paint_chunk->end_index, | 289 paint_chunk->begin_index, paint_chunk->end_index, |
302 DisplayItemList::kSkipNonDrawings | | 290 DisplayItemList::kSkipNonDrawings | |
303 DisplayItemList::kShownOnlyDisplayItemTypes)); | 291 DisplayItemList::kShownOnlyDisplayItemTypes)); |
304 } | 292 } |
305 | 293 |
306 for (unsigned index = 0; | 294 for (const auto& r : paint_chunk->raster_invalidation_rects) { |
307 index < paint_chunk->raster_invalidation_rects.size(); ++index) { | 295 IntRect rect(EnclosingIntRect(r)); |
308 IntRect rect( | |
309 EnclosingIntRect(paint_chunk->raster_invalidation_rects[index])); | |
310 gfx::Rect cc_invalidation_rect(rect.X(), rect.Y(), | 296 gfx::Rect cc_invalidation_rect(rect.X(), rect.Y(), |
311 std::max(0, rect.Width()), | 297 std::max(0, rect.Width()), |
312 std::max(0, rect.Height())); | 298 std::max(0, rect.Height())); |
313 if (cc_invalidation_rect.IsEmpty()) | 299 if (cc_invalidation_rect.IsEmpty()) |
314 continue; | 300 continue; |
315 // Raster paintChunk.rasterInvalidationRects is in the space of the | 301 // Raster paintChunk.rasterInvalidationRects is in the space of the |
316 // containing transform node, so need to subtract off the layer offset. | 302 // containing transform node, so need to subtract off the layer offset. |
317 cc_invalidation_rect.Offset(-cc_combined_bounds.OffsetFromOrigin()); | 303 cc_invalidation_rect.Offset(-cc_combined_bounds.OffsetFromOrigin()); |
318 content_layer_client->SetNeedsDisplayRect( | 304 content_layer_client->SetNeedsDisplayRect(cc_invalidation_rect); |
319 cc_invalidation_rect, | |
320 raster_tracking | |
321 ? &raster_tracking->tracked_raster_invalidations[index] | |
322 : nullptr); | |
323 } | 305 } |
306 | |
307 if (auto* raster_tracking = | |
308 tracking_map ? tracking_map->Find(paint_chunk) : nullptr) | |
309 content_layer_client->AddTrackedRasterInvalidations(*raster_tracking); | |
324 } | 310 } |
325 | 311 |
326 new_content_layer_clients.push_back(std::move(content_layer_client)); | 312 new_content_layer_clients.push_back(std::move(content_layer_client)); |
327 return cc_picture_layer; | 313 return cc_picture_layer; |
328 } | 314 } |
329 | 315 |
330 PaintArtifactCompositor::PendingLayer::PendingLayer( | 316 PaintArtifactCompositor::PendingLayer::PendingLayer( |
331 const PaintChunk& first_paint_chunk, | 317 const PaintChunk& first_paint_chunk, |
332 bool chunk_is_foreign) | 318 bool chunk_is_foreign) |
333 : bounds(first_paint_chunk.bounds), | 319 : bounds(first_paint_chunk.bounds), |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
697 #ifndef NDEBUG | 683 #ifndef NDEBUG |
698 void PaintArtifactCompositor::ShowDebugData() { | 684 void PaintArtifactCompositor::ShowDebugData() { |
699 LOG(ERROR) << LayersAsJSON(kLayerTreeIncludesDebugInfo) | 685 LOG(ERROR) << LayersAsJSON(kLayerTreeIncludesDebugInfo) |
700 ->ToPrettyJSONString() | 686 ->ToPrettyJSONString() |
701 .Utf8() | 687 .Utf8() |
702 .data(); | 688 .data(); |
703 } | 689 } |
704 #endif | 690 #endif |
705 | 691 |
706 } // namespace blink | 692 } // namespace blink |
OLD | NEW |