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 |