| 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 LARGE_NON_CHECKERABLE | 78 LARGE_NON_CHECKERABLE |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 void SetUpTracker(bool checker_images_enabled) { | 81 void SetUpTracker(bool checker_images_enabled) { |
| 82 checker_image_tracker_ = base::MakeUnique<CheckerImageTracker>( | 82 checker_image_tracker_ = base::MakeUnique<CheckerImageTracker>( |
| 83 &image_controller_, this, checker_images_enabled); | 83 &image_controller_, this, checker_images_enabled); |
| 84 } | 84 } |
| 85 | 85 |
| 86 void TearDown() override { checker_image_tracker_.reset(); } | 86 void TearDown() override { checker_image_tracker_.reset(); } |
| 87 | 87 |
| 88 DrawImage CreateImage(ImageType image_type) { | 88 PaintImage CreateImage( |
| 89 ImageType image_type, |
| 90 PaintImage::AnimationType animation = PaintImage::AnimationType::STATIC, |
| 91 PaintImage::CompletionState completion = |
| 92 PaintImage::CompletionState::DONE) { |
| 89 int dimension = 0; | 93 int dimension = 0; |
| 90 switch (image_type) { | 94 switch (image_type) { |
| 91 case ImageType::CHECKERABLE: | 95 case ImageType::CHECKERABLE: |
| 92 dimension = kCheckerableImageDimension; | 96 dimension = kCheckerableImageDimension; |
| 93 break; | 97 break; |
| 94 case ImageType::SMALL_NON_CHECKERABLE: | 98 case ImageType::SMALL_NON_CHECKERABLE: |
| 95 dimension = kSmallNonCheckerableImageDimension; | 99 dimension = kSmallNonCheckerableImageDimension; |
| 96 break; | 100 break; |
| 97 case ImageType::LARGE_NON_CHECKERABLE: | 101 case ImageType::LARGE_NON_CHECKERABLE: |
| 98 dimension = kLargeNonCheckerableImageDimension; | 102 dimension = kLargeNonCheckerableImageDimension; |
| 99 break; | 103 break; |
| 100 } | 104 } |
| 101 | 105 |
| 102 sk_sp<SkImage> image = | 106 sk_sp<SkImage> image = |
| 103 CreateDiscardableImage(gfx::Size(dimension, dimension)); | 107 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 104 gfx::ColorSpace target_color_space = gfx::ColorSpace::CreateSRGB(); | 108 return PaintImage(PaintImage::GetNextId(), image, animation, completion); |
| 105 return DrawImage(image, SkIRect::MakeWH(image->width(), image->height()), | |
| 106 kNone_SkFilterQuality, SkMatrix::I(), target_color_space); | |
| 107 } | 109 } |
| 108 | 110 |
| 109 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue( | 111 CheckerImageTracker::ImageDecodeQueue BuildImageDecodeQueue( |
| 110 std::vector<DrawImage> draw_images, | 112 std::vector<PaintImage> images, |
| 111 WhichTree tree) { | 113 WhichTree tree) { |
| 112 CheckerImageTracker::ImageDecodeQueue decode_queue; | 114 CheckerImageTracker::ImageDecodeQueue decode_queue; |
| 113 for (auto draw_image : draw_images) { | 115 for (const auto& image : images) { |
| 114 sk_sp<const SkImage> image = draw_image.image(); | |
| 115 if (checker_image_tracker_->ShouldCheckerImage(image, tree)) | 116 if (checker_image_tracker_->ShouldCheckerImage(image, tree)) |
| 116 decode_queue.push_back(image); | 117 decode_queue.push_back(image); |
| 117 } | 118 } |
| 118 return decode_queue; | 119 return decode_queue; |
| 119 } | 120 } |
| 120 | 121 |
| 121 // CheckerImageTrackerClient implementation. | 122 // CheckerImageTrackerClient implementation. |
| 122 void NeedsInvalidationForCheckerImagedTiles() override { | 123 void NeedsInvalidationForCheckerImagedTiles() override { |
| 123 invalidation_request_pending_ = true; | 124 invalidation_request_pending_ = true; |
| 124 } | 125 } |
| 125 | 126 |
| 126 protected: | 127 protected: |
| 127 TestImageController image_controller_; | 128 TestImageController image_controller_; |
| 128 std::unique_ptr<CheckerImageTracker> checker_image_tracker_; | 129 std::unique_ptr<CheckerImageTracker> checker_image_tracker_; |
| 129 | 130 |
| 130 bool invalidation_request_pending_ = false; | 131 bool invalidation_request_pending_ = false; |
| 131 }; | 132 }; |
| 132 | 133 |
| 133 TEST_F(CheckerImageTrackerTest, CheckerImagesDisabled) { | 134 TEST_F(CheckerImageTrackerTest, CheckerImagesDisabled) { |
| 134 // Ensures that the tracker doesn't filter any images for checkering if it is | 135 // Ensures that the tracker doesn't filter any images for checkering if it is |
| 135 // disabled. | 136 // disabled. |
| 136 SetUpTracker(false); | 137 SetUpTracker(false); |
| 137 | 138 |
| 138 ImageIdFlatSet checkered_images; | 139 ImageIdFlatSet checkered_images; |
| 139 DrawImage draw_image = CreateImage(ImageType::CHECKERABLE); | 140 PaintImage paint_image = CreateImage(ImageType::CHECKERABLE); |
| 140 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 141 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 141 draw_image.image(), WhichTree::PENDING_TREE)); | 142 paint_image, WhichTree::PENDING_TREE)); |
| 142 EXPECT_EQ(image_controller_.num_of_locked_images(), 0); | 143 EXPECT_EQ(image_controller_.num_of_locked_images(), 0); |
| 143 } | 144 } |
| 144 | 145 |
| 145 TEST_F(CheckerImageTrackerTest, UpdatesImagesAtomically) { | 146 TEST_F(CheckerImageTrackerTest, UpdatesImagesAtomically) { |
| 146 // Ensures that the tracker updates images atomically for each frame. | 147 // Ensures that the tracker updates images atomically for each frame. |
| 147 SetUpTracker(true); | 148 SetUpTracker(true); |
| 148 | 149 |
| 149 DrawImage checkerable_image = CreateImage(ImageType::CHECKERABLE); | 150 PaintImage checkerable_image = CreateImage(ImageType::CHECKERABLE); |
| 150 DrawImage small_non_checkerable_image = | 151 PaintImage small_non_checkerable_image = |
| 151 CreateImage(ImageType::SMALL_NON_CHECKERABLE); | 152 CreateImage(ImageType::SMALL_NON_CHECKERABLE); |
| 152 DrawImage large_non_checkerable_image = | 153 PaintImage large_non_checkerable_image = |
| 153 CreateImage(ImageType::LARGE_NON_CHECKERABLE); | 154 CreateImage(ImageType::LARGE_NON_CHECKERABLE); |
| 154 CheckerImageTracker::ImageDecodeQueue image_decode_queue; | 155 CheckerImageTracker::ImageDecodeQueue image_decode_queue; |
| 155 | 156 |
| 156 // First request to filter images. | 157 // First request to filter images. |
| 157 std::vector<DrawImage> draw_images = { | 158 std::vector<PaintImage> paint_images = { |
| 158 checkerable_image, small_non_checkerable_image, | 159 checkerable_image, small_non_checkerable_image, |
| 159 large_non_checkerable_image, checkerable_image}; | 160 large_non_checkerable_image, checkerable_image}; |
| 160 image_decode_queue = | 161 image_decode_queue = |
| 161 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); | 162 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 162 | 163 |
| 163 ASSERT_EQ(2u, image_decode_queue.size()); | 164 ASSERT_EQ(2u, image_decode_queue.size()); |
| 164 EXPECT_EQ(checkerable_image.image(), image_decode_queue[0]); | 165 EXPECT_EQ(checkerable_image, image_decode_queue[0]); |
| 165 EXPECT_EQ(checkerable_image.image(), image_decode_queue[1]); | 166 EXPECT_EQ(checkerable_image, image_decode_queue[1]); |
| 166 | 167 |
| 167 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); | 168 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); |
| 168 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); | 169 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); |
| 169 | 170 |
| 170 // Run pending task to indicate completion of decode request to the tracker. | 171 // Run pending task to indicate completion of decode request to the tracker. |
| 171 // This should send an impl-side invalidation request to the client. The | 172 // This should send an impl-side invalidation request to the client. The |
| 172 // images must remain locked until the sync tree to which the invalidations | 173 // images must remain locked until the sync tree to which the invalidations |
| 173 // are added is activated. | 174 // are added is activated. |
| 174 base::RunLoop().RunUntilIdle(); | 175 base::RunLoop().RunUntilIdle(); |
| 175 EXPECT_TRUE(invalidation_request_pending_); | 176 EXPECT_TRUE(invalidation_request_pending_); |
| 176 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); | 177 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); |
| 177 | 178 |
| 178 // Continue checkering the image until the set of images to invalidate is | 179 // Continue checkering the image until the set of images to invalidate is |
| 179 // pulled. | 180 // pulled. |
| 180 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( | 181 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( |
| 181 checkerable_image.image(), WhichTree::PENDING_TREE)); | 182 checkerable_image, WhichTree::PENDING_TREE)); |
| 182 | 183 |
| 183 ImageIdFlatSet invalidated_images = | 184 ImageIdFlatSet invalidated_images = |
| 184 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); | 185 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); |
| 185 EXPECT_EQ(invalidated_images.size(), 1U); | 186 EXPECT_EQ(invalidated_images.size(), 1U); |
| 186 EXPECT_EQ(invalidated_images.count(checkerable_image.image()->uniqueID()), | 187 EXPECT_EQ(invalidated_images.count(checkerable_image.stable_id()), 1U); |
| 187 1U); | |
| 188 | 188 |
| 189 // Use the same set of draw images to ensure that they are not checkered on | 189 // Use the same set of draw images to ensure that they are not checkered on |
| 190 // the pending tree now. | 190 // the pending tree now. |
| 191 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 191 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 192 checkerable_image.image(), WhichTree::PENDING_TREE)); | 192 checkerable_image, WhichTree::PENDING_TREE)); |
| 193 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 193 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 194 small_non_checkerable_image.image(), WhichTree::PENDING_TREE)); | 194 small_non_checkerable_image, WhichTree::PENDING_TREE)); |
| 195 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 195 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 196 large_non_checkerable_image.image(), WhichTree::PENDING_TREE)); | 196 large_non_checkerable_image, WhichTree::PENDING_TREE)); |
| 197 | 197 |
| 198 // Use this set to make the same request from the active tree, we should | 198 // Use this set to make the same request from the active tree, we should |
| 199 // continue checkering this image on the active tree until activation. | 199 // continue checkering this image on the active tree until activation. |
| 200 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( | 200 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( |
| 201 checkerable_image.image(), WhichTree::ACTIVE_TREE)); | 201 checkerable_image, WhichTree::ACTIVE_TREE)); |
| 202 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 202 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 203 small_non_checkerable_image.image(), WhichTree::ACTIVE_TREE)); | 203 small_non_checkerable_image, WhichTree::ACTIVE_TREE)); |
| 204 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 204 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 205 large_non_checkerable_image.image(), WhichTree::ACTIVE_TREE)); | 205 large_non_checkerable_image, WhichTree::ACTIVE_TREE)); |
| 206 | 206 |
| 207 // Activate the sync tree. The images should be unlocked upon activation. | 207 // Activate the sync tree. The images should be unlocked upon activation. |
| 208 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); | 208 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); |
| 209 checker_image_tracker_->DidActivateSyncTree(); | 209 checker_image_tracker_->DidActivateSyncTree(); |
| 210 } | 210 } |
| 211 | 211 |
| 212 TEST_F(CheckerImageTrackerTest, NoConsecutiveCheckeringForImage) { | 212 TEST_F(CheckerImageTrackerTest, NoConsecutiveCheckeringForImage) { |
| 213 // Ensures that if an image is decoded and invalidated once, it is not | 213 // Ensures that if an image is decoded and invalidated once, it is not |
| 214 // checkered again in subsequent frames. | 214 // checkered again in subsequent frames. |
| 215 SetUpTracker(true); | 215 SetUpTracker(true); |
| 216 | 216 |
| 217 DrawImage checkerable_image = CreateImage(ImageType::CHECKERABLE); | 217 PaintImage checkerable_image = CreateImage(ImageType::CHECKERABLE); |
| 218 std::vector<DrawImage> draw_images = {checkerable_image}; | 218 std::vector<PaintImage> paint_images = {checkerable_image}; |
| 219 | 219 |
| 220 CheckerImageTracker::ImageDecodeQueue image_decode_queue = | 220 CheckerImageTracker::ImageDecodeQueue image_decode_queue = |
| 221 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); | 221 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 222 EXPECT_EQ(image_decode_queue.size(), 1U); | 222 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 223 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); | 223 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); |
| 224 | 224 |
| 225 // Trigger decode completion, take images to invalidate and activate the sync | 225 // Trigger decode completion, take images to invalidate and activate the sync |
| 226 // tree. | 226 // tree. |
| 227 base::RunLoop().RunUntilIdle(); | 227 base::RunLoop().RunUntilIdle(); |
| 228 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); | 228 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); |
| 229 checker_image_tracker_->DidActivateSyncTree(); | 229 checker_image_tracker_->DidActivateSyncTree(); |
| 230 | 230 |
| 231 // Subsequent requests for this image should not be checkered. | 231 // Subsequent requests for this image should not be checkered. |
| 232 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 232 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 233 checkerable_image.image(), WhichTree::PENDING_TREE)); | 233 checkerable_image, WhichTree::PENDING_TREE)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 TEST_F(CheckerImageTrackerTest, | 236 TEST_F(CheckerImageTrackerTest, |
| 237 TracksCheckeredImagesSeperatelyInConsecutiveFrames) { | 237 TracksCheckeredImagesSeperatelyInConsecutiveFrames) { |
| 238 // Ensures that the set of images being checkered on the pending tree, and the | 238 // Ensures that the set of images being checkered on the pending tree, and the |
| 239 // active tree are tracked correctly. | 239 // active tree are tracked correctly. |
| 240 SetUpTracker(true); | 240 SetUpTracker(true); |
| 241 | 241 |
| 242 DrawImage checkerable_image1 = CreateImage(ImageType::CHECKERABLE); | 242 PaintImage checkerable_image1 = CreateImage(ImageType::CHECKERABLE); |
| 243 std::vector<DrawImage> draw_images; | 243 std::vector<PaintImage> paint_images; |
| 244 CheckerImageTracker::ImageDecodeQueue image_decode_queue; | 244 CheckerImageTracker::ImageDecodeQueue image_decode_queue; |
| 245 | 245 |
| 246 // First request to filter images on the pending and active tree. | 246 // First request to filter images on the pending and active tree. |
| 247 draw_images.push_back(checkerable_image1); | 247 paint_images.push_back(checkerable_image1); |
| 248 image_decode_queue = | 248 image_decode_queue = |
| 249 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); | 249 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 250 EXPECT_EQ(image_decode_queue.size(), 1U); | 250 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 251 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); | 251 checker_image_tracker_->ScheduleImageDecodeQueue(image_decode_queue); |
| 252 | 252 |
| 253 // The image is also checkered on the active tree while a decode request is | 253 // The image is also checkered on the active tree while a decode request is |
| 254 // pending. | 254 // pending. |
| 255 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( | 255 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( |
| 256 checkerable_image1.image(), WhichTree::ACTIVE_TREE)); | 256 checkerable_image1, WhichTree::ACTIVE_TREE)); |
| 257 | 257 |
| 258 // Trigger decode completion and take images to invalidate on the sync tree. | 258 // Trigger decode completion and take images to invalidate on the sync tree. |
| 259 base::RunLoop().RunUntilIdle(); | 259 base::RunLoop().RunUntilIdle(); |
| 260 EXPECT_TRUE(invalidation_request_pending_); | 260 EXPECT_TRUE(invalidation_request_pending_); |
| 261 ImageIdFlatSet invalidated_images = | 261 ImageIdFlatSet invalidated_images = |
| 262 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); | 262 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); |
| 263 EXPECT_EQ(invalidated_images.size(), 1U); | 263 EXPECT_EQ(invalidated_images.size(), 1U); |
| 264 EXPECT_EQ(invalidated_images.count(checkerable_image1.image()->uniqueID()), | 264 EXPECT_EQ(invalidated_images.count(checkerable_image1.stable_id()), 1U); |
| 265 1U); | |
| 266 | 265 |
| 267 // Second request to filter the same image on the pending and active tree. It | 266 // Second request to filter the same image on the pending and active tree. It |
| 268 // should be checkered on the active tree, but not the pending tree. | 267 // should be checkered on the active tree, but not the pending tree. |
| 269 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( | 268 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( |
| 270 checkerable_image1.image(), WhichTree::ACTIVE_TREE)); | 269 checkerable_image1, WhichTree::ACTIVE_TREE)); |
| 271 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 270 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 272 checkerable_image1.image(), WhichTree::PENDING_TREE)); | 271 checkerable_image1, WhichTree::PENDING_TREE)); |
| 273 | 272 |
| 274 // New checkerable image on the pending tree. | 273 // New checkerable image on the pending tree. |
| 275 DrawImage checkerable_image2 = CreateImage(ImageType::CHECKERABLE); | 274 PaintImage checkerable_image2 = CreateImage(ImageType::CHECKERABLE); |
| 276 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( | 275 EXPECT_TRUE(checker_image_tracker_->ShouldCheckerImage( |
| 277 checkerable_image2.image(), WhichTree::PENDING_TREE)); | 276 checkerable_image2, WhichTree::PENDING_TREE)); |
| 278 | 277 |
| 279 // Activate the sync tree. The initial image should no longer be checkered on | 278 // Activate the sync tree. The initial image should no longer be checkered on |
| 280 // the active tree. | 279 // the active tree. |
| 281 checker_image_tracker_->DidActivateSyncTree(); | 280 checker_image_tracker_->DidActivateSyncTree(); |
| 282 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( | 281 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 283 checkerable_image1.image(), WhichTree::ACTIVE_TREE)); | 282 checkerable_image1, WhichTree::ACTIVE_TREE)); |
| 284 } | 283 } |
| 285 | 284 |
| 286 TEST_F(CheckerImageTrackerTest, CancelsScheduledDecodes) { | 285 TEST_F(CheckerImageTrackerTest, CancelsScheduledDecodes) { |
| 287 SetUpTracker(true); | 286 SetUpTracker(true); |
| 288 | 287 |
| 289 DrawImage checkerable_image1 = CreateImage(ImageType::CHECKERABLE); | 288 PaintImage checkerable_image1 = CreateImage(ImageType::CHECKERABLE); |
| 290 DrawImage checkerable_image2 = CreateImage(ImageType::CHECKERABLE); | 289 PaintImage checkerable_image2 = CreateImage(ImageType::CHECKERABLE); |
| 291 std::vector<DrawImage> draw_images = {checkerable_image1, checkerable_image2}; | 290 std::vector<PaintImage> paint_images = {checkerable_image1, |
| 291 checkerable_image2}; |
| 292 | 292 |
| 293 CheckerImageTracker::ImageDecodeQueue image_decode_queue; | 293 CheckerImageTracker::ImageDecodeQueue image_decode_queue; |
| 294 image_decode_queue = | 294 image_decode_queue = |
| 295 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); | 295 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 296 EXPECT_EQ(image_decode_queue.size(), 2U); | 296 EXPECT_EQ(image_decode_queue.size(), 2U); |
| 297 checker_image_tracker_->ScheduleImageDecodeQueue( | 297 checker_image_tracker_->ScheduleImageDecodeQueue( |
| 298 std::move(image_decode_queue)); | 298 std::move(image_decode_queue)); |
| 299 | 299 |
| 300 // Only the first image in the queue should have been decoded. | 300 // Only the first image in the queue should have been decoded. |
| 301 EXPECT_EQ(image_controller_.decodes_requested().size(), 1U); | 301 EXPECT_EQ(image_controller_.decodes_requested().size(), 1U); |
| 302 EXPECT_EQ(image_controller_.decodes_requested().count( | 302 EXPECT_EQ(image_controller_.decodes_requested().count( |
| 303 checkerable_image1.image()->uniqueID()), | 303 checkerable_image1.sk_image()->uniqueID()), |
| 304 1U); | 304 1U); |
| 305 | 305 |
| 306 // Rebuild the queue before the tracker is notified of decode completion, | 306 // Rebuild the queue before the tracker is notified of decode completion, |
| 307 // removing the second image and adding a new one. | 307 // removing the second image and adding a new one. |
| 308 DrawImage checkerable_image3 = CreateImage(ImageType::CHECKERABLE); | 308 PaintImage checkerable_image3 = CreateImage(ImageType::CHECKERABLE); |
| 309 draw_images = {checkerable_image1, checkerable_image3}; | 309 paint_images = {checkerable_image1, checkerable_image3}; |
| 310 image_decode_queue = | 310 image_decode_queue = |
| 311 BuildImageDecodeQueue(draw_images, WhichTree::PENDING_TREE); | 311 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 312 | 312 |
| 313 // The queue has 2 decodes because we are still checkering on the first one. | 313 // The queue has 2 decodes because we are still checkering on the first one. |
| 314 EXPECT_EQ(image_decode_queue.size(), 2U); | 314 EXPECT_EQ(image_decode_queue.size(), 2U); |
| 315 checker_image_tracker_->ScheduleImageDecodeQueue( | 315 checker_image_tracker_->ScheduleImageDecodeQueue( |
| 316 std::move(image_decode_queue)); | 316 std::move(image_decode_queue)); |
| 317 | 317 |
| 318 // We still have only one decode because the tracker keeps only one decode | 318 // We still have only one decode because the tracker keeps only one decode |
| 319 // pending at a time. | 319 // pending at a time. |
| 320 EXPECT_EQ(image_controller_.decodes_requested().size(), 1U); | 320 EXPECT_EQ(image_controller_.decodes_requested().size(), 1U); |
| 321 EXPECT_EQ(image_controller_.decodes_requested().count( | 321 EXPECT_EQ(image_controller_.decodes_requested().count( |
| 322 checkerable_image1.image()->uniqueID()), | 322 checkerable_image1.sk_image()->uniqueID()), |
| 323 1U); | 323 1U); |
| 324 | 324 |
| 325 // Trigger completion for all decodes. Only 2 images should have been decoded | 325 // Trigger completion for all decodes. Only 2 images should have been decoded |
| 326 // since the second image was cancelled. | 326 // since the second image was cancelled. |
| 327 base::RunLoop().RunUntilIdle(); | 327 base::RunLoop().RunUntilIdle(); |
| 328 EXPECT_EQ(image_controller_.decodes_requested().size(), 2U); | 328 EXPECT_EQ(image_controller_.decodes_requested().size(), 2U); |
| 329 EXPECT_EQ(image_controller_.decodes_requested().count( | 329 EXPECT_EQ(image_controller_.decodes_requested().count( |
| 330 checkerable_image3.image()->uniqueID()), | 330 checkerable_image3.sk_image()->uniqueID()), |
| 331 1U); | 331 1U); |
| 332 EXPECT_EQ(image_controller_.num_of_locked_images(), 2); | 332 EXPECT_EQ(image_controller_.num_of_locked_images(), 2); |
| 333 } | 333 } |
| 334 | 334 |
| 335 TEST_F(CheckerImageTrackerTest, CheckersOnlyStaticCompletedImages) { |
| 336 SetUpTracker(true); |
| 337 |
| 338 PaintImage static_image = CreateImage(ImageType::CHECKERABLE); |
| 339 PaintImage animated_image = |
| 340 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::ANIMATED); |
| 341 PaintImage partial_image = |
| 342 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::STATIC, |
| 343 PaintImage::CompletionState::PARTIALLY_DONE); |
| 344 PaintImage video_image = |
| 345 CreateImage(ImageType::CHECKERABLE, PaintImage::AnimationType::VIDEO); |
| 346 std::vector<PaintImage> paint_images = {static_image, animated_image, |
| 347 partial_image, video_image}; |
| 348 |
| 349 CheckerImageTracker::ImageDecodeQueue image_decode_queue = |
| 350 BuildImageDecodeQueue(paint_images, WhichTree::PENDING_TREE); |
| 351 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 352 EXPECT_EQ(image_decode_queue[0], static_image); |
| 353 |
| 354 // Change the partial image to complete and try again. It should still not |
| 355 // be checkered. |
| 356 gfx::Size image_size = gfx::Size(partial_image.sk_image()->width(), |
| 357 partial_image.sk_image()->height()); |
| 358 PaintImage completed_paint_image = |
| 359 PaintImage(partial_image.stable_id(), CreateDiscardableImage(image_size)); |
| 360 EXPECT_FALSE(checker_image_tracker_->ShouldCheckerImage( |
| 361 completed_paint_image, WhichTree::PENDING_TREE)); |
| 362 } |
| 363 |
| 335 } // namespace | 364 } // namespace |
| 336 } // namespace cc | 365 } // namespace cc |
| OLD | NEW |