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

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

Issue 2924233002: cc: Move pre-decodes to background worker. (Closed)
Patch Set: addressed comments 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
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_->SetCanScheduleDecodeType(
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 int dimension = 0; 99 int dimension = 0;
(...skipping 16 matching lines...) Expand all
114 SkIRect::MakeWH(dimension, dimension), kNone_SkFilterQuality, 116 SkIRect::MakeWH(dimension, dimension), kNone_SkFilterQuality,
115 SkMatrix::I(), gfx::ColorSpace()); 117 SkMatrix::I(), gfx::ColorSpace());
116 } 118 }
117 119
118 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue( 120 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue(
119 std::vector<DrawImage> images, 121 std::vector<DrawImage> images,
120 WhichTree tree) { 122 WhichTree tree) {
121 CheckerImageTracker::ImageDecodeQueue decode_queue; 123 CheckerImageTracker::ImageDecodeQueue decode_queue;
122 for (const auto& image : images) { 124 for (const auto& image : images) {
123 if (checker_image_tracker_->ShouldCheckerImage(image, tree)) 125 if (checker_image_tracker_->ShouldCheckerImage(image, tree))
124 decode_queue.push_back(image.paint_image()); 126 decode_queue.push_back(CheckerImageTracker::ImageDecodeRequest(
127 image.paint_image(), CheckerImageTracker::DecodeType::kRaster));
125 } 128 }
126 return decode_queue; 129 return decode_queue;
127 } 130 }
128 131
129 // CheckerImageTrackerClient implementation. 132 // CheckerImageTrackerClient implementation.
130 void NeedsInvalidationForCheckerImagedTiles() override { 133 void NeedsInvalidationForCheckerImagedTiles() override {
131 invalidation_request_pending_ = true; 134 invalidation_request_pending_ = true;
132 } 135 }
133 136
134 protected: 137 protected:
(...skipping 27 matching lines...) Expand all
162 CheckerImageTracker::ImageDecodeQueue image_decode_queue; 165 CheckerImageTracker::ImageDecodeQueue image_decode_queue;
163 166
164 // First request to filter images. 167 // First request to filter images.
165 std::vector<DrawImage> draw_images = { 168 std::vector<DrawImage> draw_images = {
166 checkerable_image, small_non_checkerable_image, 169 checkerable_image, small_non_checkerable_image,
167 large_non_checkerable_image, checkerable_image}; 170 large_non_checkerable_image, checkerable_image};
168 image_decode_queue = 171 image_decode_queue =
169 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); 172 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE);
170 173
171 ASSERT_EQ(2u, image_decode_queue.size()); 174 ASSERT_EQ(2u, image_decode_queue.size());
172 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[0]); 175 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[0].paint_image);
173 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[1]); 176 EXPECT_EQ(checkerable_image.paint_image(), image_decode_queue[1].paint_image);
174 177
175 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); 178 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue);
176 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); 179 EXPECT_EQ(image_controller_.num_of_locked_images(), 1);
177 180
178 // Run pending task to indicate completion of decode request to the tracker. 181 // Run pending task to indicate completion of decode request to the tracker.
179 // This should send an impl-side invalidation request to the client. The 182 // This should send an impl-side invalidation request to the client. The
180 // images must remain locked until the sync tree to which the invalidations 183 // images must remain locked until the sync tree to which the invalidations
181 // are added is activated. 184 // are added is activated.
182 base::RunLoop().RunUntilIdle(); 185 base::RunLoop().RunUntilIdle();
183 EXPECT_TRUE(invalidation_request_pending_); 186 EXPECT_TRUE(invalidation_request_pending_);
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC, 411 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC,
409 PaintImage::CompletionState::PARTIALLY_DONE); 412 PaintImage::CompletionState::PARTIALLY_DONE);
410 DrawImage video_image = 413 DrawImage video_image =
411 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::VIDEO); 414 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::VIDEO);
412 std::vector<DrawImage> draw_images = {static_image, animated_image, 415 std::vector<DrawImage> draw_images = {static_image, animated_image,
413 partial_image, video_image}; 416 partial_image, video_image};
414 417
415 CheckerImageTracker::ImageDecodeQueue image_decode_queue = 418 CheckerImageTracker::ImageDecodeQueue image_decode_queue =
416 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); 419 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE);
417 EXPECT_EQ(image_decode_queue.size(), 1U); 420 EXPECT_EQ(image_decode_queue.size(), 1U);
418 EXPECT_EQ(image_decode_queue[0], static_image.paint_image()); 421 EXPECT_EQ(image_decode_queue[0].paint_image, static_image.paint_image());
419 422
420 // Change the partial image to complete and try again. It should sstill not 423 // Change the partial image to complete and try again. It should sstill not
421 // be checkered. 424 // be checkered.
422 gfx::Size image_size = gfx::Size(partial_image.image()->width(), 425 gfx::Size image_size = gfx::Size(partial_image.image()->width(),
423 partial_image.image()->height()); 426 partial_image.image()->height());
424 DrawImage completed_paint_image = 427 DrawImage completed_paint_image =
425 DrawImage(PaintImage(partial_image.paint_image().stable_id(), 428 DrawImage(PaintImage(partial_image.paint_image().stable_id(),
426 CreateDiscardableImage(image_size)), 429 CreateDiscardableImage(image_size)),
427 SkIRect::MakeWH(image_size.width(), image_size.height()), 430 SkIRect::MakeWH(image_size.width(), image_size.height()),
428 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace()); 431 kNone_SkFilterQuality, SkMatrix::I(), gfx::ColorSpace());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 CheckerImageTracker::ImageDecodeQueue image_decode_queue = 467 CheckerImageTracker::ImageDecodeQueue image_decode_queue =
465 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); 468 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE);
466 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); 469 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue);
467 EXPECT_EQ(image_controller_.decoded_images().size(), 1u); 470 EXPECT_EQ(image_controller_.decoded_images().size(), 1u);
468 EXPECT_EQ(image_controller_.decoded_images()[0].scale(), 471 EXPECT_EQ(image_controller_.decoded_images()[0].scale(),
469 SkSize::Make(1.8f, 1.8f)); 472 SkSize::Make(1.8f, 1.8f));
470 EXPECT_EQ(image_controller_.decoded_images()[0].filter_quality(), 473 EXPECT_EQ(image_controller_.decoded_images()[0].filter_quality(),
471 kHigh_SkFilterQuality); 474 kHigh_SkFilterQuality);
472 } 475 }
473 476
477 TEST_F(CheckerImageTrackerTest, RespectsDecodePriority) {
478 SetUpTracker(true);
479
480 DrawImage image1 = CreateImage(ImageType::CHECKERABLE);
481 DrawImage image2 = CreateImage(ImageType::CHECKERABLE);
482 DrawImage image3 = CreateImage(ImageType::CHECKERABLE);
483 DrawImage image4 = CreateImage(ImageType::CHECKERABLE);
484 CheckerImageTracker::ImageDecodeQueue image_decode_queue =
485 BuildImageDecodeQueue({image1, image2, image3, image4},
486 WhichTree::PENDING_TREE);
487
488 // Mark the last 2 images as pre-decode.
489 EXPECT_EQ(image_decode_queue.size(), 4u);
490 image_decode_queue[2].type = CheckerImageTracker::DecodeType::kPreDecode;
491 image_decode_queue[3].type = CheckerImageTracker::DecodeType::kPreDecode;
492
493 // No decodes allowed. Nothing should be scheduled.
494 EXPECT_EQ(image_controller_.decoded_images().size(), 0u);
495 checker_image_tracker_->SetCanScheduleDecodeType(
496 CheckerImageTracker::DecodeType::kNone);
497 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue);
498 EXPECT_EQ(image_controller_.decoded_images().size(), 0u);
499
500 // Raster decodes allowed. Only those should be scheduled.
501 checker_image_tracker_->SetCanScheduleDecodeType(
502 CheckerImageTracker::DecodeType::kRaster);
503 base::RunLoop().RunUntilIdle();
504 EXPECT_EQ(image_controller_.decoded_images().size(), 2u);
505 EXPECT_EQ(image_controller_.decoded_images()[0], image1);
506 EXPECT_EQ(image_controller_.decoded_images()[1], image2);
507
508 // All decodes allowed. The complete queue should be flushed.
509 checker_image_tracker_->SetCanScheduleDecodeType(
510 CheckerImageTracker::DecodeType::kPreDecode);
511 base::RunLoop().RunUntilIdle();
512 EXPECT_EQ(image_controller_.decoded_images()[0], image1);
513 EXPECT_EQ(image_controller_.decoded_images()[1], image2);
514 EXPECT_EQ(image_controller_.decoded_images()[2], image3);
515 EXPECT_EQ(image_controller_.decoded_images()[3], image4);
516 }
517
474 } // namespace 518 } // namespace
475 } // namespace cc 519 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698