| Index: cc/tiles/checker_image_tracker.cc
|
| diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc
|
| index 1e562cd8e9d8b3b700088cd45113b8980be7ae42..c9e4228ec467ceb47c7baebbe13653f9db3d9f08 100644
|
| --- a/cc/tiles/checker_image_tracker.cc
|
| +++ b/cc/tiles/checker_image_tracker.cc
|
| @@ -39,6 +39,14 @@ std::string ToString(PaintImage::Id paint_image_id,
|
|
|
| } // namespace
|
|
|
| +// static
|
| +const int CheckerImageTracker::kNoDecodeAllowedPriority = -1;
|
| +
|
| +CheckerImageTracker::ImageDecodeRequest::ImageDecodeRequest(
|
| + PaintImage paint_image,
|
| + DecodeType type)
|
| + : paint_image(std::move(paint_image)), type(type) {}
|
| +
|
| CheckerImageTracker::CheckerImageTracker(ImageController* image_controller,
|
| CheckerImageTrackerClient* client,
|
| bool enable_checker_imaging)
|
| @@ -49,6 +57,23 @@ CheckerImageTracker::CheckerImageTracker(ImageController* image_controller,
|
|
|
| CheckerImageTracker::~CheckerImageTracker() = default;
|
|
|
| +void CheckerImageTracker::SetNoDecodesAllowed() {
|
| + decode_priority_allowed_ = kNoDecodeAllowedPriority;
|
| +}
|
| +
|
| +void CheckerImageTracker::SetMaxDecodePriorityAllowed(DecodeType decode_type) {
|
| + DCHECK_GT(decode_type, kNoDecodeAllowedPriority);
|
| + DCHECK_GE(decode_type, decode_priority_allowed_);
|
| + DCHECK_LE(decode_type, DecodeType::kLast);
|
| +
|
| + if (decode_priority_allowed_ == decode_type)
|
| + return;
|
| + decode_priority_allowed_ = decode_type;
|
| +
|
| + // This will start the next decode if applicable.
|
| + ScheduleNextImageDecode();
|
| +}
|
| +
|
| void CheckerImageTracker::ScheduleImageDecodeQueue(
|
| ImageDecodeQueue image_decode_queue) {
|
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
|
| @@ -58,6 +83,15 @@ void CheckerImageTracker::ScheduleImageDecodeQueue(
|
| // be checkered.
|
| DCHECK(image_decode_queue.empty() || enable_checker_imaging_);
|
|
|
| +#if DCHECK_IS_ON()
|
| + // The decodes in the queue should be prioritized correctly.
|
| + DecodeType type = DecodeType::kRaster;
|
| + for (const auto& image_request : image_decode_queue) {
|
| + DCHECK_GE(image_request.type, type);
|
| + type = image_request.type;
|
| + }
|
| +#endif
|
| +
|
| image_decode_queue_ = std::move(image_decode_queue);
|
| ScheduleNextImageDecode();
|
| }
|
| @@ -250,9 +284,17 @@ void CheckerImageTracker::ScheduleNextImageDecode() {
|
| if (outstanding_image_decode_.has_value())
|
| return;
|
|
|
| + if (image_decode_queue_.empty())
|
| + return;
|
| +
|
| + // If scheduling decodes for this priority is not allowed right now, don't
|
| + // schedule them. We will come back here when the allowed priority changes.
|
| + if (image_decode_queue_.front().type > decode_priority_allowed_)
|
| + return;
|
| +
|
| DrawImage draw_image;
|
| while (!image_decode_queue_.empty()) {
|
| - auto candidate = std::move(image_decode_queue_.front());
|
| + auto candidate = std::move(image_decode_queue_.front().paint_image);
|
| image_decode_queue_.erase(image_decode_queue_.begin());
|
|
|
| // Once an image has been decoded, it can still be present in the decode
|
|
|