Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: cc/tiles/checker_image_tracker_unittest.cc

Issue 2924233002: cc: Move pre-decodes to background worker. (Closed)
Patch Set: flake is flaky. T_T Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/tiles/checker_image_tracker.cc ('k') | cc/tiles/tile_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "cc/tiles/checker_image_tracker.h" 5 #include "cc/tiles/checker_image_tracker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 public: 78 public:
79 enum class ImageType { 79 enum class ImageType {
80 CHECKERABLE, 80 CHECKERABLE,
81 SMALL_NON_CHECKERABLE, 81 SMALL_NON_CHECKERABLE,
82 LARGE_NON_CHECKERABLE 82 LARGE_NON_CHECKERABLE
83 }; 83 };
84 84
85 void SetUpTracker(bool checker_images_enabled) { 85 void SetUpTracker(bool checker_images_enabled) {
86 checker_image_tracker_ = base::MakeUnique<CheckerImageTracker>( 86 checker_image_tracker_ = base::MakeUnique<CheckerImageTracker>(
87 &image_controller_, this, checker_images_enabled); 87 &image_controller_, this, checker_images_enabled);
88 checker_image_tracker_->SetMaxDecodePriorityAllowed(
89 CheckerImageTracker::DecodeType::kPreDecode);
88 } 90 }
89 91
90 void TearDown() override { checker_image_tracker_.reset(); } 92 void TearDown() override { checker_image_tracker_.reset(); }
91 93
92 DrawImage CreateImage( 94 DrawImage CreateImage(
93 ImageType image_type, 95 ImageType image_type,
94 PaintImage::AnimationType animation = PaintImage::AnimationType::STATIC, 96 PaintImage::AnimationType animation = PaintImage::AnimationType::STATIC,
95 PaintImage::CompletionState completion = 97 PaintImage::CompletionState completion =
96 PaintImage::CompletionState::DONE, 98 PaintImage::CompletionState::DONE,
97 bool is_multipart = false) { 99 bool is_multipart = false) {
(...skipping 17 matching lines...) Expand all
115 SkIRect::MakeWH(dimension, dimension), 117 SkIRect::MakeWH(dimension, dimension),
116 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace()); 118 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace());
117 } 119 }
118 120
119 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue( 121 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue(
120 std::vector<DrawImage> images, 122 std::vector<DrawImage> images,
121 WhichTree tree) { 123 WhichTree tree) {
122 CheckerImageTracker::ImageDecodeQueue decode_queue; 124 CheckerImageTracker::ImageDecodeQueue decode_queue;
123 for (const auto& image : images) { 125 for (const auto& image : images) {
124 if (checker_image_tracker_->ShouldCheckerImage(image, tree)) 126 if (checker_image_tracker_->ShouldCheckerImage(image, tree))
125 decode_queue.push_back(image.paint_image()); 127 decode_queue.push_back(CheckerImageTracker::ImageDecodeRequest(
128 image.paint_image(), CheckerImageTracker::DecodeType::kRaster));
126 } 129 }
127 return decode_queue; 130 return decode_queue;
128 } 131 }
129 132
130 // CheckerImageTrackerClient implementation. 133 // CheckerImageTrackerClient implementation.
131 void NeedsInvalidationForCheckerImagedTiles() override { 134 void NeedsInvalidationForCheckerImagedTiles() override {
132 invalidation_request_pending_ = true; 135 invalidation_request_pending_ = true;
133 } 136 }
134 137
135 protected: 138 protected:
(...skipping 27 matching lines...) Expand all
163 CheckerImageTracker::ImageDecodeQueue image_decode_queue; 166 CheckerImageTracker::ImageDecodeQueue image_decode_queue;
164 167
165 // First request to filter images. 168 // First request to filter images.
166 std::vector<DrawImage> draw_images = { 169 std::vector<DrawImage> draw_images = {
167 checkerable_image, small_non_checkerable_image, 170 checkerable_image, small_non_checkerable_image,
168 large_non_checkerable_image, checkerable_image}; 171 large_non_checkerable_image, checkerable_image};
169 image_decode_queue = 172 image_decode_queue =
170 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); 173 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE);
171 174
172 ASSERT_EQ(2u, image_decode_queue.size()); 175 ASSERT_EQ(2u, image_decode_queue.size());
173 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[0]); 176 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[0].paint_image);
174 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[1]); 177 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[1].paint_image);
175 178
176 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); 179 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue);
177 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); 180 EXPECT_EQ(image_controller_.num_of_locked_images(), 1);
178 181
179 // Run pending task to indicate completion of decode request to the tracker. 182 // Run pending task to indicate completion of decode request to the tracker.
180 // This should send an impl-side invalidation request to the client. The 183 // This should send an impl-side invalidation request to the client. The
181 // images must remain locked until the sync tree to which the invalidations 184 // images must remain locked until the sync tree to which the invalidations
182 // are added is activated. 185 // are added is activated.
183 base::RunLoop().RunUntilIdle(); 186 base::RunLoop().RunUntilIdle();
184 EXPECT_TRUE(invalidation_request_pending_); 187 EXPECT_TRUE(invalidation_request_pending_);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC, 412 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC,
410 PaintImage::CompletionState::PARTIALLY_DONE); 413 PaintImage::CompletionState::PARTIALLY_DONE);
411 DrawImage video_image = 414 DrawImage video_image =
412 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::VIDEO); 415 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::VIDEO);
413 std::vector<DrawImage> draw_images = {static_image, animated_image, 416 std::vector<DrawImage> draw_images = {static_image, animated_image,
414 partial_image, video_image}; 417 partial_image, video_image};
415 418
416 CheckerImageTracker::ImageDecodeQueue image_decode_queue = 419 CheckerImageTracker::ImageDecodeQueue image_decode_queue =
417 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); 420 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE);
418 EXPECT_EQ(image_decode_queue.size(), 1U); 421 EXPECT_EQ(image_decode_queue.size(), 1U);
419 EXPECT_EQ(image_decode_queue[0], static_image.paint_image()); 422 EXPECT_EQ(image_decode_queue[0].paint_image, static_image.paint_image());
420 423
421 // Change the partial image to complete and try again. It should sstill not 424 // Change the partial image to complete and try again. It should sstill not
422 // be checkered. 425 // be checkered.
423 gfx::Size image_size = gfx::Size(partial_image.image()->width(), 426 gfx::Size image_size = gfx::Size(partial_image.image()->width(),
424 partial_image.image()->height()); 427 partial_image.image()->height());
425 DrawImage completed_paint_image = 428 DrawImage completed_paint_image =
426 DrawImage(PaintImage(partial_image.paint_image().stable_id(), 429 DrawImage(PaintImage(partial_image.paint_image().stable_id(),
427 CreateDiscardableImage(image_size)), 430 CreateDiscardableImage(image_size)),
428 SkIRect::MakeWH(image_size.width(), image_size.height()), 431 SkIRect::MakeWH(image_size.width(), image_size.height()),
429 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace()); 432 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC, 484 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC,
482 PaintImage::CompletionState::DONE, true); 485 PaintImage::CompletionState::DONE, true);
483 EXPECT_TRUE(multi_part_image.paint_image().is_multipart()); 486 EXPECT_TRUE(multi_part_image.paint_image().is_multipart());
484 487
485 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( 488 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage(
486 image, WhichTree::PENDING_TREE)); 489 image, WhichTree::PENDING_TREE));
487 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( 490 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage(
488 multi_part_image, WhichTree::PENDING_TREE)); 491 multi_part_image, WhichTree::PENDING_TREE));
489 } 492 }
490 493
494 TEST_F(CheckerImageTrackerTest, RespectsDecodePriority) {
495 SetUpTracker(true);
496
497 DrawImage image1 = CreateImage(ImageType::CHECKERABLE);
498 DrawImage image2 = CreateImage(ImageType::CHECKERABLE);
499 DrawImage image3 = CreateImage(ImageType::CHECKERABLE);
500 DrawImage image4 = CreateImage(ImageType::CHECKERABLE);
501 CheckerImageTracker::ImageDecodeQueue image_decode_queue =
502 BuildImageDecodeQueue({image1, image2, image3, image4},
503 WhichTree::PENDING_TREE);
504
505 // Mark the last 2 images as pre-decode.
506 EXPECT_EQ(image_decode_queue.size(), 4u);
507 image_decode_queue[2].type = CheckerImageTracker::DecodeType::kPreDecode;
508 image_decode_queue[3].type = CheckerImageTracker::DecodeType::kPreDecode;
509
510 // No decodes allowed. Nothing should be scheduled.
511 EXPECT_EQ(image_controller_.decoded_images().size(), 0u);
512 checker_image_tracker_->SetNoDecodesAllowed();
513 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue);
514 EXPECT_EQ(image_controller_.decoded_images().size(), 0u);
515
516 // Raster decodes allowed. Only those should be scheduled.
517 checker_image_tracker_->SetMaxDecodePriorityAllowed(
518 CheckerImageTracker::DecodeType::kRaster);
519 base::RunLoop().RunUntilIdle();
520 EXPECT_EQ(image_controller_.decoded_images().size(), 2u);
521 EXPECT_EQ(image_controller_.decoded_images()[0], image1);
522 EXPECT_EQ(image_controller_.decoded_images()[1], image2);
523
524 // All decodes allowed. The complete queue should be flushed.
525 checker_image_tracker_->SetMaxDecodePriorityAllowed(
526 CheckerImageTracker::DecodeType::kPreDecode);
527 base::RunLoop().RunUntilIdle();
528 EXPECT_EQ(image_controller_.decoded_images()[0], image1);
529 EXPECT_EQ(image_controller_.decoded_images()[1], image2);
530 EXPECT_EQ(image_controller_.decoded_images()[2], image3);
531 EXPECT_EQ(image_controller_.decoded_images()[3], image4);
532 }
533
491 } // namespace 534 } // namespace
492 } // namespace cc 535 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/checker_image_tracker.cc ('k') | cc/tiles/tile_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698