Chromium Code Reviews| 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 |