OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |