Commit 5ec5545b authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

Invalidate raster of paint chunks by drawable bounds

PaintChunk::bounds includes bounds non-drawable display items.
Add PaintChunk::drawable_bounds to include drawable display items only,
and use it in paint chunk raster invalidation.

This is a preparation for crbug.com/937573 which will create more
non-drawable display items, to avoid unnecessary raster invalidation.

Bug: 937573
Change-Id: Ib54ff89fff091fae1701e636808043b8cbfffe69
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2052254Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741247}
parent bf5d1ae9
......@@ -48,6 +48,8 @@ void ComputeChunkDerivedData(const DisplayItemList& display_items,
auto items = display_items.ItemsInPaintChunk(chunk);
for (const DisplayItem& item : items) {
chunk.bounds.Unite(item.VisualRect());
if (item.DrawsContent())
chunk.drawable_bounds.Unite(item.VisualRect());
chunk.outset_for_raster_effects = std::max(chunk.outset_for_raster_effects,
item.OutsetForRasterEffects());
......
......@@ -15,6 +15,7 @@ struct SameSizeAsPaintChunk {
PaintChunk::Id id;
PropertyTreeState properties;
IntRect bounds;
IntRect drawable_bounds;
float outset_for_raster_effects;
SkColor safe_opaque_background_color;
unsigned bools; // known_to_be_opaque, is_cacheable, client_is_just_created
......
......@@ -90,10 +90,16 @@ struct PLATFORM_EXPORT PaintChunk {
std::unique_ptr<HitTestData> hit_test_data;
// The total bounds of this paint chunk's contents, in the coordinate space of
// the containing transform node.
// The total bounds of visual rects of all display items in this paint chunk,
// in the coordinate space of the containing transform node. This can be
// larger than |drawble_bounds|, because of non-drawable display items e.g.
// for hit testing.
IntRect bounds;
// The total bounds of visual rects of drawable display items in this paint
// chunk.
IntRect drawable_bounds;
// Some raster effects can exceed |bounds| in the rasterization space. This
// is the maximum DisplayItemClient::VisualRectOutsetForRasterEffects() of
// all clients of items in this chunk.
......
......@@ -77,7 +77,7 @@ class PLATFORM_EXPORT RasterInvalidator {
id(chunk_it->id),
#endif
bounds_in_layer(invalidator.ClipByLayerBounds(
mapper.MapVisualRect(chunk_it->bounds))),
mapper.MapVisualRect(chunk_it->drawable_bounds))),
chunk_to_layer_clip(mapper.ClipRect()),
chunk_to_layer_transform(mapper.Transform()) {
}
......
......@@ -77,12 +77,12 @@ static bool CheckChunkInvalidation(
}
MATCHER_P4(ChunkInvalidation, chunk, reason, layer_offset, mapper, "") {
return CheckChunkInvalidation(arg, *chunk, chunk->bounds, reason,
return CheckChunkInvalidation(arg, *chunk, chunk->drawable_bounds, reason,
layer_offset, mapper);
}
MATCHER_P2(ChunkInvalidation, chunk, reason, "") {
return CheckChunkInvalidation(arg, *chunk, chunk->bounds, reason,
return CheckChunkInvalidation(arg, *chunk, chunk->drawable_bounds, reason,
-kDefaultLayerBounds.Location());
}
......@@ -222,6 +222,40 @@ TEST_P(RasterInvalidatorTest, ChunkAppearAndDisappear) {
FinishCycle(*new_artifact);
}
TEST_P(RasterInvalidatorTest, InvalidateDrawableBounds) {
IntRect drawable_bounds(11, 22, 33, 44);
IntRect bounds(0, 0, 100, 100);
auto artifact = TestPaintArtifact()
.Chunk(0)
.Chunk(1)
.Bounds(bounds)
.DrawableBounds(drawable_bounds)
.Build();
invalidator_.Generate(artifact, kDefaultLayerBounds,
DefaultPropertyTreeState());
FinishCycle(*artifact);
invalidator_.SetTracksRasterInvalidations(true);
auto new_artifact = TestPaintArtifact()
.Chunk(0)
.Chunk(2)
.Bounds(bounds)
.DrawableBounds(drawable_bounds)
.Build();
invalidator_.Generate(new_artifact, kDefaultLayerBounds,
DefaultPropertyTreeState());
// ChunkInvalidation uses the drawable_bounds. We expect raster invalidations
// based on drawable_bounds instead of bounds.
EXPECT_THAT(
TrackedRasterInvalidations(),
ElementsAre(
ChunkInvalidation(&new_artifact->PaintChunks()[1],
PaintInvalidationReason::kChunkAppeared),
ChunkInvalidation(&artifact->PaintChunks()[1],
PaintInvalidationReason::kChunkDisappeared)));
FinishCycle(*new_artifact);
}
TEST_P(RasterInvalidatorTest, ChunkAppearAtEnd) {
auto artifact = TestPaintArtifact().Chunk(0).Build();
invalidator_.Generate(artifact, kDefaultLayerBounds,
......
......@@ -123,6 +123,14 @@ TestPaintArtifact& TestPaintArtifact::KnownToBeOpaque() {
TestPaintArtifact& TestPaintArtifact::Bounds(const IntRect& bounds) {
paint_chunks_.back().bounds = bounds;
paint_chunks_.back().drawable_bounds = bounds;
return *this;
}
TestPaintArtifact& TestPaintArtifact::DrawableBounds(
const IntRect& drawable_bounds) {
paint_chunks_.back().drawable_bounds = drawable_bounds;
DCHECK(paint_chunks_.back().bounds.Contains(drawable_bounds));
return *this;
}
......
......@@ -121,8 +121,10 @@ class TestPaintArtifact {
// Sets fake bounds for the last paint chunk. Note that the bounds will be
// overwritten when the PaintArtifact is constructed if the chunk has any
// display items.
// display items. Bounds() sets both bounds and drawable_bounds, while
// DrawableBounds() sets drawable_bounds only.
TestPaintArtifact& Bounds(const IntRect&);
TestPaintArtifact& DrawableBounds(const IntRect&);
TestPaintArtifact& OutsetForRasterEffects(float);
TestPaintArtifact& KnownToBeOpaque();
......
......@@ -81,11 +81,6 @@
"rect": [782, 94, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 115, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [615, 99, 12, 11],
......@@ -96,44 +91,34 @@
"rect": [571, 145, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 184, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtoncolourPickerWindow'",
"rect": [235, 197, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 123, 12, 3],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 345, 11, 12],
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 192, 12, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
......@@ -141,11 +126,6 @@
"rect": [558, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonsmallWindow'",
"rect": [454, 379, 11, 11],
......@@ -156,11 +136,6 @@
"rect": [441, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonnestedWindow'",
"rect": [376, 184, 11, 11],
......@@ -176,9 +151,34 @@
"rect": [222, 197, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 153, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 354, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 388, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtoncolourPickerWindow'",
"rect": [209, 197, 11, 11],
"rect": [209, 206, 11, 2],
"reason": "chunk appeared"
}
]
......
......@@ -81,11 +81,6 @@
"rect": [782, 94, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 115, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [615, 99, 12, 11],
......@@ -96,44 +91,34 @@
"rect": [571, 145, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 184, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtoncolourPickerWindow'",
"rect": [235, 197, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 123, 12, 3],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 345, 11, 12],
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 192, 12, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
......@@ -141,11 +126,6 @@
"rect": [558, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonsmallWindow'",
"rect": [454, 379, 11, 11],
......@@ -156,11 +136,6 @@
"rect": [441, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonnestedWindow'",
"rect": [376, 184, 11, 11],
......@@ -176,9 +151,34 @@
"rect": [222, 197, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 153, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 354, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 388, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtoncolourPickerWindow'",
"rect": [209, 197, 11, 11],
"rect": [209, 206, 11, 2],
"reason": "chunk appeared"
}
]
......
......@@ -81,11 +81,6 @@
"rect": [782, 94, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 115, 12, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [615, 99, 12, 11],
......@@ -96,44 +91,34 @@
"rect": [571, 145, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 184, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtoncolourPickerWindow'",
"rect": [235, 197, 12, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [615, 123, 12, 3],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 345, 11, 12],
"object": "LayoutSVGContainer use id='minimizeButtonnestedWindow'",
"rect": [349, 192, 12, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonstatusWindow'",
"rect": [376, 345, 11, 12],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 94, 11, 11],
"object": "LayoutSVGContainer use id='maximizeButtonnavWindow'",
"rect": [769, 94, 11, 11],
"reason": "paint property change"
},
{
......@@ -141,11 +126,6 @@
"rect": [558, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 145, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonsmallWindow'",
"rect": [454, 379, 11, 11],
......@@ -156,11 +136,6 @@
"rect": [441, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 379, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='closeButtonnestedWindow'",
"rect": [376, 184, 11, 11],
......@@ -176,9 +151,34 @@
"rect": [222, 197, 11, 11],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonbigWindow'",
"rect": [545, 153, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonstatusWindow'",
"rect": [363, 354, 11, 3],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonnavWindow'",
"rect": [756, 103, 11, 2],
"reason": "paint property change"
},
{
"object": "LayoutSVGContainer use id='minimizeButtonsmallWindow'",
"rect": [428, 388, 11, 2],
"reason": "chunk appeared"
},
{
"object": "LayoutSVGContainer use id='minimizeButtoncolourPickerWindow'",
"rect": [209, 197, 11, 11],
"rect": [209, 206, 11, 2],
"reason": "chunk appeared"
}
]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment