Index: third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp |
index c5ee0d2dcc69c2d3d5ab7f4d6cfc8b4a27faec58..a33275a9caf094a446007ed0d8ecb3e7b1ac1dae 100644 |
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp |
@@ -21,12 +21,13 @@ static constexpr int kMaxNumberOfSlowPathsBeforeVeto = 5; |
namespace blink { |
void PaintController::SetTracksRasterInvalidations(bool value) { |
- if (value) { |
- paint_chunks_raster_invalidation_tracking_map_ = |
+ if (value || |
+ RuntimeEnabledFeatures::paintUnderInvalidationCheckingEnabled()) { |
+ raster_invalidation_tracking_map_ = |
WTF::WrapUnique(new RasterInvalidationTrackingMap<const PaintChunk>); |
- } else { |
- paint_chunks_raster_invalidation_tracking_map_ = nullptr; |
+ return; |
} |
+ raster_invalidation_tracking_map_ = nullptr; |
} |
const PaintArtifact& PaintController::GetPaintArtifact() const { |
@@ -597,9 +598,15 @@ void PaintController::CommitNewDisplayItems( |
// The new list will not be appended to again so we can release unused memory. |
new_display_item_list_.ShrinkToFit(); |
+ |
+ if (raster_invalidation_tracking_map_) { |
+ for (const auto& chunk : current_paint_artifact_.PaintChunks()) |
+ raster_invalidation_tracking_map_->Remove(&chunk); |
+ } |
current_paint_artifact_ = PaintArtifact( |
std::move(new_display_item_list_), new_paint_chunks_.ReleasePaintChunks(), |
num_slow_paths <= kMaxNumberOfSlowPathsBeforeVeto); |
+ |
ResetCurrentListIndices(); |
out_of_order_item_indices_.clear(); |
out_of_order_chunk_indices_.clear(); |
@@ -676,7 +683,7 @@ void PaintController::GenerateChunkRasterInvalidationRects( |
static FloatRect infinite_float_rect(LayoutRect::InfiniteIntRect()); |
if (!new_chunk.id) { |
- AddRasterInvalidationInfo(nullptr, new_chunk, infinite_float_rect); |
+ AddRasterInvalidation(nullptr, new_chunk, infinite_float_rect); |
return; |
} |
@@ -718,14 +725,14 @@ void PaintController::GenerateChunkRasterInvalidationRects( |
} |
// We reach here because the chunk is new. |
- AddRasterInvalidationInfo(nullptr, new_chunk, infinite_float_rect); |
+ AddRasterInvalidation(nullptr, new_chunk, infinite_float_rect); |
} |
-void PaintController::AddRasterInvalidationInfo(const DisplayItemClient* client, |
- PaintChunk& chunk, |
- const FloatRect& rect) { |
+void PaintController::AddRasterInvalidation(const DisplayItemClient* client, |
+ PaintChunk& chunk, |
+ const FloatRect& rect) { |
chunk.raster_invalidation_rects.push_back(rect); |
- if (!paint_chunks_raster_invalidation_tracking_map_) |
+ if (!raster_invalidation_tracking_map_) |
return; |
RasterInvalidationInfo info; |
info.rect = EnclosingIntRect(rect); |
@@ -734,9 +741,7 @@ void PaintController::AddRasterInvalidationInfo(const DisplayItemClient* client, |
info.client_debug_name = client->DebugName(); |
info.reason = client->GetPaintInvalidationReason(); |
} |
- RasterInvalidationTracking& tracking = |
- paint_chunks_raster_invalidation_tracking_map_->Add(&chunk); |
- tracking.tracked_raster_invalidations.push_back(info); |
+ raster_invalidation_tracking_map_->AddInvalidation(&chunk, info); |
} |
void PaintController::GenerateChunkRasterInvalidationRectsComparingOldChunk( |
@@ -747,6 +752,19 @@ void PaintController::GenerateChunkRasterInvalidationRectsComparingOldChunk( |
// TODO(wangxianzhu): Handle PaintInvalidationIncremental. |
// TODO(wangxianzhu): Optimize paint offset change. |
+ // We may track raster invalidations across multiple paints. The new chunk |
+ // should contain all previously tracked invalidations. |
+ if (raster_invalidation_tracking_map_) { |
+ // Add() must be before Find() otherwise Add() might invalidate the pointer |
+ // returned from Find(). |
+ auto& new_tracking = raster_invalidation_tracking_map_->Add(&new_chunk); |
+ if (auto* old_tracking = |
+ raster_invalidation_tracking_map_->Find(&old_chunk)) { |
+ new_tracking.tracked_invalidations.AppendVector( |
+ old_tracking->tracked_invalidations); |
+ } |
+ } |
+ |
HashSet<const DisplayItemClient*> invalidated_clients_in_old_chunk; |
size_t highest_moved_to_index = 0; |
for (size_t old_index = old_chunk.begin_index; |
@@ -767,9 +785,8 @@ void PaintController::GenerateChunkRasterInvalidationRectsComparingOldChunk( |
// And invalidate in the new chunk into which the item was moved. |
PaintChunk& moved_to_chunk = |
new_paint_chunks_.FindChunkByDisplayItemIndex(moved_to_index); |
- AddRasterInvalidationInfo( |
- client_to_invalidate, moved_to_chunk, |
- FloatRect(client_to_invalidate->VisualRect())); |
+ AddRasterInvalidation(client_to_invalidate, moved_to_chunk, |
+ FloatRect(client_to_invalidate->VisualRect())); |
} else if (moved_to_index < highest_moved_to_index) { |
// The item has been moved behind other cached items, so need to |
// invalidate the area that is probably exposed by the item moved |
@@ -787,7 +804,7 @@ void PaintController::GenerateChunkRasterInvalidationRectsComparingOldChunk( |
if (client_to_invalidate && |
invalidated_clients_in_old_chunk.insert(client_to_invalidate) |
.is_new_entry) { |
- AddRasterInvalidationInfo( |
+ AddRasterInvalidation( |
is_potentially_invalid_client ? nullptr : client_to_invalidate, |
new_chunk, |
FloatRect(current_paint_artifact_.GetDisplayItemList().VisualRect( |
@@ -802,8 +819,8 @@ void PaintController::GenerateChunkRasterInvalidationRectsComparingOldChunk( |
if (new_item.DrawsContent() && !ClientCacheIsValid(new_item.Client()) && |
invalidated_clients_in_new_chunk.insert(&new_item.Client()) |
.is_new_entry) { |
- AddRasterInvalidationInfo(&new_item.Client(), new_chunk, |
- FloatRect(new_item.Client().VisualRect())); |
+ AddRasterInvalidation(&new_item.Client(), new_chunk, |
+ FloatRect(new_item.Client().VisualRect())); |
} |
} |
} |