Chromium Code Reviews| Index: cc/tiles/checker_image_tracker.cc |
| diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc |
| index c8113d4d56052edb486948d64999a2680ce952d8..84d495677771f022f0cb1615181124d290ea4cb2 100644 |
| --- a/cc/tiles/checker_image_tracker.cc |
| +++ b/cc/tiles/checker_image_tracker.cc |
| @@ -35,25 +35,11 @@ CheckerImageTracker::~CheckerImageTracker() { |
| image_controller_->UnlockImageDecode(it.second); |
| } |
| -void CheckerImageTracker::FilterImagesForCheckeringForTile( |
| - std::vector<DrawImage>* images, |
| - ImageIdFlatSet* checkered_images, |
| - WhichTree tree) { |
| - DCHECK(checkered_images->empty()); |
| - |
| - auto images_to_checker = std::remove_if( |
| - images->begin(), images->end(), |
| - [this, tree, &checkered_images](const DrawImage& draw_image) { |
| - const sk_sp<const SkImage>& image = draw_image.image(); |
| - DCHECK(image->isLazyGenerated()); |
| - if (ShouldCheckerImage(image, tree)) { |
| - ScheduleImageDecodeIfNecessary(image); |
| - checkered_images->insert(image->uniqueID()); |
| - return true; |
| - } |
| - return false; |
| - }); |
| - images->erase(images_to_checker, images->end()); |
| +void CheckerImageTracker::SetImageDecodeQueue( |
| + ImageDecodeQueue image_decode_queue) { |
| + image_decode_queue_ = std::move(image_decode_queue); |
| + next_image_to_decode_ = 0; |
| + ScheduleNextImageDecode(); |
| } |
| const ImageIdFlatSet& CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { |
| @@ -82,12 +68,13 @@ void CheckerImageTracker::DidFinishImageDecode( |
| TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", |
| image_id); |
| - DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED); |
| - DCHECK_NE(pending_image_decodes_.count(image_id), 0u); |
| - pending_image_decodes_.erase(image_id); |
| - |
| + DCHECK_NE(ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED, result); |
| + DCHECK_EQ(outstanding_image_decode_->uniqueID(), image_id); |
| + outstanding_image_decode_ = nullptr; |
| images_decoded_once_.insert(image_id); |
| images_pending_invalidation_.insert(image_id); |
| + |
| + ScheduleNextImageDecode(); |
| client_->NeedsInvalidationForCheckerImagedTiles(); |
| } |
| @@ -107,12 +94,6 @@ bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image, |
| return true; |
| } |
| - // If a decode request is pending for this image, continue checkering it. |
| - if (pending_image_decodes_.find(image->uniqueID()) != |
| - pending_image_decodes_.end()) { |
| - return true; |
| - } |
| - |
| // If the image is pending invalidation, continue checkering it. All tiles |
| // for these images will be invalidated on the next pending tree. |
| if (images_pending_invalidation_.find(image->uniqueID()) != |
| @@ -129,26 +110,44 @@ bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image, |
| return SafeSizeOfImage(image.get()) >= kMinImageSizeToCheckerBytes; |
| } |
| -void CheckerImageTracker::ScheduleImageDecodeIfNecessary( |
| - const sk_sp<const SkImage>& image) { |
| - ImageId image_id = image->uniqueID(); |
| +void CheckerImageTracker::ScheduleNextImageDecode() { |
| + if (image_decode_queue_.empty()) |
| + return; |
| - // If the image has already been decoded, or a decode request is pending, we |
| - // don't need to schedule another decode. |
| - if (images_decoded_once_.count(image_id) != 0 || |
| - pending_image_decodes_.count(image_id) != 0) { |
| + if (outstanding_image_decode_) |
|
vmpstr
2017/03/17 18:32:13
Leave a comment here explaining that if we have so
Khushal
2017/03/27 13:57:32
Done.
|
| return; |
| + |
| + DCHECK_GE(next_image_to_decode_, 0u); |
| + DCHECK_LT(next_image_to_decode_, image_decode_queue_.size()); |
| + while (next_image_to_decode_ != image_decode_queue_.size()) { |
| + outstanding_image_decode_ = |
| + std::move(image_decode_queue_[next_image_to_decode_++]); |
| + |
| + // The image may have already been decoded. Proceed to the next image in the |
|
vmpstr
2017/03/17 18:32:13
Can you rephrase this comment to match the code? T
Khushal
2017/03/27 13:57:32
Done.
|
| + // queue in that case. |
| + ImageId image_id = outstanding_image_decode_->uniqueID(); |
| + if (images_decoded_once_.count(image_id) == 0) |
| + break; |
| + outstanding_image_decode_ = nullptr; |
| + } |
| + |
| + if (next_image_to_decode_ == image_decode_queue_.size()) { |
|
vmpstr
2017/03/17 18:32:13
Comment here
Khushal
2017/03/27 13:57:32
Done.
|
| + next_image_to_decode_ = 0; |
| + image_decode_queue_.clear(); |
| } |
| + if (!outstanding_image_decode_) |
| + return; |
| + |
| + ImageId image_id = outstanding_image_decode_->uniqueID(); |
| + DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0u); |
| TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode", |
| image_id); |
| - DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U); |
| - |
| image_id_to_decode_request_id_[image_id] = |
| image_controller_->QueueImageDecode( |
| - image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, |
| - weak_factory_.GetWeakPtr(), image_id)); |
| - pending_image_decodes_.insert(image_id); |
| + outstanding_image_decode_, |
| + base::Bind(&CheckerImageTracker::DidFinishImageDecode, |
| + weak_factory_.GetWeakPtr(), image_id)); |
| } |
| } // namespace cc |