| Index: cc/tiles/checker_image_tracker.cc
|
| diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc
|
| index e076983ad7e9f3452a042accf35c69efd2895b57..4916814469b4edf6647ec9ad5fcc1d810e91a8d9 100644
|
| --- a/cc/tiles/checker_image_tracker.cc
|
| +++ b/cc/tiles/checker_image_tracker.cc
|
| @@ -37,16 +37,31 @@ std::string ToString(PaintImage::Id paint_image_id,
|
|
|
| } // namespace
|
|
|
| +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)
|
| : image_controller_(image_controller),
|
| client_(client),
|
| enable_checker_imaging_(enable_checker_imaging),
|
| + decode_type_allowed_(DecodeType::kNone),
|
| weak_factory_(this) {}
|
|
|
| CheckerImageTracker::~CheckerImageTracker() = default;
|
|
|
| +void CheckerImageTracker::SetCanScheduleDecodeType(DecodeType decode_type) {
|
| + if (decode_type_allowed_ == decode_type)
|
| + return;
|
| + decode_type_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"),
|
| @@ -56,6 +71,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();
|
| }
|
| @@ -235,9 +259,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_type_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
|
|
|