Skip to content

Commit 5efb654

Browse files
khushalsagarCommit Bot
authored and
Commit Bot
committed
cc: Use StackVector of gfx::Rect for discardable image positions.
With [1], we switched to use Region instead of gfx::Rect for tracking the position of images during discardable image analysis. This causes a regression in record time for the common case where a single instance of image exists. Use a StackVector<gfx::Rect, 1> instead to avoid a heap allocation in these cases. [1]: https://chromium-review.googlesource.com/c/720245/ R=enne@chromium.org Bug: 778170 Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel Change-Id: Ifc8646f768c5d04ea0ae32e5dd9a9466448a29d9 Reviewed-on: https://chromium-review.googlesource.com/738677 Reviewed-by: enne <enne@chromium.org> Commit-Queue: Khushal <khushalsagar@chromium.org> Cr-Commit-Position: refs/heads/master@{#511941}
1 parent 73a65cc commit 5efb654

9 files changed

+59
-43
lines changed

cc/base/invalidation_region.cc

-9
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,6 @@ void InvalidationRegion::Union(const gfx::Rect& rect) {
3535
pending_rects_.push_back(rect);
3636
}
3737

38-
void InvalidationRegion::Union(const Region& region) {
39-
if (region_.GetRegionComplexity() + region.GetRegionComplexity() >
40-
kMaxInvalidationRectCount) {
41-
region_ = gfx::UnionRects(region_.bounds(), region.bounds());
42-
} else {
43-
region_.Union(region);
44-
}
45-
}
46-
4738
void InvalidationRegion::FinalizePendingRects() {
4839
if (pending_rects_.empty())
4940
return;

cc/base/invalidation_region.h

-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class CC_BASE_EXPORT InvalidationRegion {
2424
void Swap(Region* region);
2525
void Clear();
2626
void Union(const gfx::Rect& rect);
27-
void Union(const Region& region);
2827
bool IsEmpty() const { return pending_rects_.empty() && region_.IsEmpty(); }
2928

3029
private:

cc/layers/picture_layer_impl.cc

+16-7
Original file line numberDiff line numberDiff line change
@@ -834,10 +834,17 @@ bool PictureLayerImpl::ShouldAnimate(PaintImage::Id paint_image_id) const {
834834
//
835835
// Additionally only animate images which are on-screen, animations are
836836
// paused once they are not visible.
837-
return HasValidTilePriorities() && raster_source_->GetDisplayItemList()
838-
->discardable_image_map()
839-
.GetRegionForImage(paint_image_id)
840-
.Intersects(visible_layer_rect());
837+
if (!HasValidTilePriorities())
838+
return false;
839+
840+
const auto& rects = raster_source_->GetDisplayItemList()
841+
->discardable_image_map()
842+
.GetRectsForImage(paint_image_id);
843+
for (const auto& r : rects.container()) {
844+
if (r.Intersects(visible_layer_rect()))
845+
return true;
846+
}
847+
return false;
841848
}
842849

843850
gfx::Size PictureLayerImpl::CalculateTileSize(
@@ -1578,9 +1585,11 @@ void PictureLayerImpl::InvalidateRegionForImages(
15781585

15791586
InvalidationRegion image_invalidation;
15801587
for (auto image_id : images_to_invalidate) {
1581-
image_invalidation.Union(raster_source_->GetDisplayItemList()
1582-
->discardable_image_map()
1583-
.GetRegionForImage(image_id));
1588+
const auto& rects = raster_source_->GetDisplayItemList()
1589+
->discardable_image_map()
1590+
.GetRectsForImage(image_id);
1591+
for (const auto& r : rects.container())
1592+
image_invalidation.Union(r);
15841593
}
15851594
Region invalidation;
15861595
image_invalidation.Swap(&invalidation);

cc/paint/discardable_image_map.cc

+17-15
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
namespace cc {
2222
namespace {
23-
const int kMaxRegionComplexity = 256;
23+
const int kMaxRectsSize = 256;
2424

2525
SkRect MapRect(const SkMatrix& matrix, const SkRect& src) {
2626
SkRect dst;
@@ -89,8 +89,9 @@ class DiscardableImageGenerator {
8989
std::vector<std::pair<DrawImage, gfx::Rect>> TakeImages() {
9090
return std::move(image_set_);
9191
}
92-
base::flat_map<PaintImage::Id, Region> TakeImageIdToRegionMap() {
93-
return std::move(image_id_to_region_);
92+
base::flat_map<PaintImage::Id, DiscardableImageMap::Rects>
93+
TakeImageIdToRectsMap() {
94+
return std::move(image_id_to_rects_);
9495
}
9596
base::flat_map<PaintImage::Id, PaintImage::DecodingMode>
9697
TakeDecodingModeMap() {
@@ -295,10 +296,11 @@ class DiscardableImageGenerator {
295296
color_stats_srgb_image_count_++;
296297
}
297298

298-
auto& region = image_id_to_region_[paint_image.stable_id()];
299-
region.Union(image_rect);
300-
if (region.GetRegionComplexity() >= kMaxRegionComplexity)
301-
region = region.bounds();
299+
auto& rects = image_id_to_rects_[paint_image.stable_id()];
300+
if (rects->size() >= kMaxRectsSize)
301+
rects->back().Union(image_rect);
302+
else
303+
rects->push_back(image_rect);
302304

303305
auto decoding_mode_it = decoding_mode_map_.find(paint_image.stable_id());
304306
// Use the decoding mode if we don't have one yet, otherwise use the more
@@ -323,7 +325,7 @@ class DiscardableImageGenerator {
323325
}
324326

325327
std::vector<std::pair<DrawImage, gfx::Rect>> image_set_;
326-
base::flat_map<PaintImage::Id, Region> image_id_to_region_;
328+
base::flat_map<PaintImage::Id, DiscardableImageMap::Rects> image_id_to_rects_;
327329
std::vector<DiscardableImageMap::AnimatedImageMetadata>
328330
animated_images_metadata_;
329331
base::flat_map<PaintImage::Id, PaintImage::DecodingMode> decoding_mode_map_;
@@ -351,7 +353,7 @@ void DiscardableImageMap::Generate(const PaintOpBuffer* paint_op_buffer,
351353
DiscardableImageGenerator generator(bounds.right(), bounds.bottom(),
352354
paint_op_buffer);
353355
generator.RecordColorHistograms();
354-
image_id_to_region_ = generator.TakeImageIdToRegionMap();
356+
image_id_to_rects_ = generator.TakeImageIdToRectsMap();
355357
animated_images_metadata_ = generator.TakeAnimatedImagesMetadata();
356358
decoding_mode_map_ = generator.TakeDecodingModeMap();
357359
all_images_are_srgb_ = generator.all_images_are_srgb();
@@ -375,16 +377,16 @@ void DiscardableImageMap::GetDiscardableImagesInRect(
375377
*images = images_rtree_.SearchRefs(rect);
376378
}
377379

378-
const Region& DiscardableImageMap::GetRegionForImage(
380+
const DiscardableImageMap::Rects& DiscardableImageMap::GetRectsForImage(
379381
PaintImage::Id image_id) const {
380-
static const Region kEmptyRegion;
381-
auto it = image_id_to_region_.find(image_id);
382-
return it == image_id_to_region_.end() ? kEmptyRegion : it->second;
382+
static const Rects kEmptyRects;
383+
auto it = image_id_to_rects_.find(image_id);
384+
return it == image_id_to_rects_.end() ? kEmptyRects : it->second;
383385
}
384386

385387
void DiscardableImageMap::Reset() {
386-
image_id_to_region_.clear();
387-
image_id_to_region_.shrink_to_fit();
388+
image_id_to_rects_.clear();
389+
image_id_to_rects_.shrink_to_fit();
388390
images_rtree_.Reset();
389391
}
390392

cc/paint/discardable_image_map.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <vector>
1010

1111
#include "base/containers/flat_map.h"
12-
#include "cc/base/region.h"
12+
#include "base/containers/stack_container.h"
1313
#include "cc/base/rtree.h"
1414
#include "cc/paint/draw_image.h"
1515
#include "cc/paint/image_animation_count.h"
@@ -31,6 +31,8 @@ class PaintOpBuffer;
3131
// rect and get back a list of DrawImages in that rect.
3232
class CC_PAINT_EXPORT DiscardableImageMap {
3333
public:
34+
using Rects = base::StackVector<gfx::Rect, 1>;
35+
3436
struct CC_PAINT_EXPORT AnimatedImageMetadata {
3537
AnimatedImageMetadata(
3638
PaintImage::Id paint_image_id,
@@ -51,10 +53,10 @@ class CC_PAINT_EXPORT DiscardableImageMap {
5153
DiscardableImageMap();
5254
~DiscardableImageMap();
5355

54-
bool empty() const { return image_id_to_region_.empty(); }
56+
bool empty() const { return image_id_to_rects_.empty(); }
5557
void GetDiscardableImagesInRect(const gfx::Rect& rect,
5658
std::vector<const DrawImage*>* images) const;
57-
const Region& GetRegionForImage(PaintImage::Id image_id) const;
59+
const Rects& GetRectsForImage(PaintImage::Id image_id) const;
5860
bool all_images_are_srgb() const { return all_images_are_srgb_; }
5961
const std::vector<AnimatedImageMetadata>& animated_images_metadata() const {
6062
return animated_images_metadata_;
@@ -77,7 +79,7 @@ class CC_PAINT_EXPORT DiscardableImageMap {
7779
std::vector<std::pair<DrawImage, gfx::Rect>> images,
7880
base::flat_map<PaintImage::Id, gfx::Rect> image_id_to_rect);
7981

80-
base::flat_map<PaintImage::Id, Region> image_id_to_region_;
82+
base::flat_map<PaintImage::Id, Rects> image_id_to_rects_;
8183
std::vector<AnimatedImageMetadata> animated_images_metadata_;
8284
base::flat_map<PaintImage::Id, PaintImage::DecodingMode> decoding_mode_map_;
8385
bool all_images_are_srgb_ = false;

cc/paint/discardable_image_map_unittest.cc

+5-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ class DiscardableImageMapTest : public testing::Test {
6868
for (DrawImage& image : image_map.images_rtree_.Search(rect)) {
6969
auto image_id = image.paint_image().stable_id();
7070
position_draw_images.push_back(PositionScaleDrawImage(
71-
image.paint_image(), image_map.GetRegionForImage(image_id).bounds(),
71+
image.paint_image(),
72+
ImageRectsToRegion(image_map.GetRectsForImage(image_id)).bounds(),
7273
image.scale()));
7374
}
7475

@@ -265,7 +266,7 @@ TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectNonZeroLayer) {
265266
// Image not present in the list.
266267
{
267268
PaintImage image = CreateDiscardablePaintImage(gfx::Size(500, 500));
268-
EXPECT_TRUE(image_map.GetRegionForImage(image.stable_id()).IsEmpty());
269+
EXPECT_EQ(image_map.GetRectsForImage(image.stable_id())->size(), 0u);
269270
}
270271
}
271272

@@ -915,7 +916,8 @@ TEST_F(DiscardableImageMapTest, TracksImageRegions) {
915916
expected_region.Union(rect);
916917
}
917918

918-
EXPECT_EQ(image_map.GetRegionForImage(image.stable_id()), expected_region);
919+
EXPECT_EQ(ImageRectsToRegion(image_map.GetRectsForImage(image.stable_id())),
920+
expected_region);
919921
}
920922

921923
class DiscardableImageMapColorSpaceTest

cc/test/skia_common.cc

+7
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ bool AreDisplayListDrawingResultsSame(const gfx::Rect& layer_rect,
4646
return !memcmp(pixels_a.get(), pixels_b.get(), pixel_size);
4747
}
4848

49+
Region ImageRectsToRegion(const DiscardableImageMap::Rects& rects) {
50+
Region region;
51+
for (const auto& r : rects.container())
52+
region.Union(r);
53+
return region;
54+
}
55+
4956
sk_sp<PaintImageGenerator> CreatePaintImageGenerator(const gfx::Size& size) {
5057
return sk_make_sp<FakePaintImageGenerator>(
5158
SkImageInfo::MakeN32Premul(size.width(), size.height()));

cc/test/skia_common.h

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <memory>
99

1010
#include "base/memory/ref_counted.h"
11+
#include "cc/base/region.h"
12+
#include "cc/paint/discardable_image_map.h"
1113
#include "cc/paint/draw_image.h"
1214
#include "cc/paint/image_animation_count.h"
1315
#include "cc/paint/paint_image.h"
@@ -31,6 +33,8 @@ bool AreDisplayListDrawingResultsSame(const gfx::Rect& layer_rect,
3133
const DisplayItemList* list_a,
3234
const DisplayItemList* list_b);
3335

36+
Region ImageRectsToRegion(const DiscardableImageMap::Rects& rects);
37+
3438
sk_sp<PaintImageGenerator> CreatePaintImageGenerator(const gfx::Size& size);
3539

3640
PaintImage CreateDiscardablePaintImage(

cc/trees/layer_tree_host_impl_unittest.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -12916,10 +12916,10 @@ TEST_F(LayerTreeHostImplTest, CheckerImagingTileInvalidation) {
1291612916
else
1291712917
EXPECT_FALSE(tile->HasRasterTask());
1291812918
}
12919-
const auto& expected_invalidation =
12920-
raster_source->GetDisplayItemList()
12921-
->discardable_image_map()
12922-
.GetRegionForImage(checkerable_image.stable_id());
12919+
const auto expected_invalidation =
12920+
ImageRectsToRegion(raster_source->GetDisplayItemList()
12921+
->discardable_image_map()
12922+
.GetRectsForImage(checkerable_image.stable_id()));
1292312923
EXPECT_EQ(expected_invalidation, *(root->GetPendingInvalidation()));
1292412924
}
1292512925

0 commit comments

Comments
 (0)