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/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 std::ostringstream str; | 30 std::ostringstream str; |
31 str << "paint_image_id[" << paint_image_id << "] sk_image_id[" << sk_image_id | 31 str << "paint_image_id[" << paint_image_id << "] sk_image_id[" << sk_image_id |
32 << "] complete[" << complete << "] static[" << static_image | 32 << "] complete[" << complete << "] static[" << static_image |
33 << "], fits_size_constraints[" << fits_size_constraints << "], size[" | 33 << "], fits_size_constraints[" << fits_size_constraints << "], size[" |
34 << size << "]"; | 34 << size << "]"; |
35 return str.str(); | 35 return str.str(); |
36 } | 36 } |
37 | 37 |
38 } // namespace | 38 } // namespace |
39 | 39 |
| 40 CheckerImageTracker::ImageDecodeRequest::ImageDecodeRequest( |
| 41 PaintImage paint_image, |
| 42 DecodeType type) |
| 43 : paint_image(std::move(paint_image)), type(type) {} |
| 44 |
40 CheckerImageTracker::CheckerImageTracker(ImageController* image_controller, | 45 CheckerImageTracker::CheckerImageTracker(ImageController* image_controller, |
41 CheckerImageTrackerClient* client, | 46 CheckerImageTrackerClient* client, |
42 bool enable_checker_imaging) | 47 bool enable_checker_imaging) |
43 : image_controller_(image_controller), | 48 : image_controller_(image_controller), |
44 client_(client), | 49 client_(client), |
45 enable_checker_imaging_(enable_checker_imaging), | 50 enable_checker_imaging_(enable_checker_imaging), |
| 51 decode_type_allowed_(DecodeType::kNone), |
46 weak_factory_(this) {} | 52 weak_factory_(this) {} |
47 | 53 |
48 CheckerImageTracker::~CheckerImageTracker() = default; | 54 CheckerImageTracker::~CheckerImageTracker() = default; |
49 | 55 |
| 56 void CheckerImageTracker::SetCanScheduleDecodeType(DecodeType decode_type) { |
| 57 if (decode_type_allowed_ == decode_type) |
| 58 return; |
| 59 decode_type_allowed_ = decode_type; |
| 60 |
| 61 // This will start the next decode if applicable. |
| 62 ScheduleNextImageDecode(); |
| 63 } |
| 64 |
50 void CheckerImageTracker::ScheduleImageDecodeQueue( | 65 void CheckerImageTracker::ScheduleImageDecodeQueue( |
51 ImageDecodeQueue image_decode_queue) { | 66 ImageDecodeQueue image_decode_queue) { |
52 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 67 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
53 "CheckerImageTracker::ScheduleImageDecodeQueue"); | 68 "CheckerImageTracker::ScheduleImageDecodeQueue"); |
54 // Only checker-imaged (async updated) images are decoded using the image | 69 // Only checker-imaged (async updated) images are decoded using the image |
55 // decode service. If |enable_checker_imaging_| is false, no image should | 70 // decode service. If |enable_checker_imaging_| is false, no image should |
56 // be checkered. | 71 // be checkered. |
57 DCHECK(image_decode_queue.empty() || enable_checker_imaging_); | 72 DCHECK(image_decode_queue.empty() || enable_checker_imaging_); |
58 | 73 |
| 74 #if DCHECK_IS_ON() |
| 75 // The decodes in the queue should be prioritized correctly. |
| 76 DecodeType type = DecodeType::kRaster; |
| 77 for (const auto& image_request : image_decode_queue) { |
| 78 DCHECK_GE(image_request.type, type); |
| 79 type = image_request.type; |
| 80 } |
| 81 #endif |
| 82 |
59 image_decode_queue_ = std::move(image_decode_queue); | 83 image_decode_queue_ = std::move(image_decode_queue); |
60 ScheduleNextImageDecode(); | 84 ScheduleNextImageDecode(); |
61 } | 85 } |
62 | 86 |
63 const PaintImageIdFlatSet& | 87 const PaintImageIdFlatSet& |
64 CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { | 88 CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { |
65 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 89 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
66 "CheckerImageTracker::TakeImagesToInvalidateOnSyncTree"); | 90 "CheckerImageTracker::TakeImagesToInvalidateOnSyncTree"); |
67 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) | 91 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) |
68 << "Sync tree can not be invalidated more than once"; | 92 << "Sync tree can not be invalidated more than once"; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 } | 252 } |
229 | 253 |
230 void CheckerImageTracker::ScheduleNextImageDecode() { | 254 void CheckerImageTracker::ScheduleNextImageDecode() { |
231 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 255 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
232 "CheckerImageTracker::ScheduleNextImageDecode"); | 256 "CheckerImageTracker::ScheduleNextImageDecode"); |
233 // We can have only one outstanding decode pending completion with the decode | 257 // We can have only one outstanding decode pending completion with the decode |
234 // service. We'll come back here when it is completed. | 258 // service. We'll come back here when it is completed. |
235 if (outstanding_image_decode_.has_value()) | 259 if (outstanding_image_decode_.has_value()) |
236 return; | 260 return; |
237 | 261 |
| 262 if (image_decode_queue_.empty()) |
| 263 return; |
| 264 |
| 265 // If scheduling decodes for this priority is not allowed right now, don't |
| 266 // schedule them. We will come back here when the allowed priority changes. |
| 267 if (image_decode_queue_.front().type > decode_type_allowed_) |
| 268 return; |
| 269 |
238 DrawImage draw_image; | 270 DrawImage draw_image; |
239 while (!image_decode_queue_.empty()) { | 271 while (!image_decode_queue_.empty()) { |
240 auto candidate = std::move(image_decode_queue_.front()); | 272 auto candidate = std::move(image_decode_queue_.front().paint_image); |
241 image_decode_queue_.erase(image_decode_queue_.begin()); | 273 image_decode_queue_.erase(image_decode_queue_.begin()); |
242 | 274 |
243 // Once an image has been decoded, it can still be present in the decode | 275 // Once an image has been decoded, it can still be present in the decode |
244 // queue (duplicate entries), or while an image is still being skipped on | 276 // queue (duplicate entries), or while an image is still being skipped on |
245 // the active tree. Check if the image is still ASYNC to see if a decode is | 277 // the active tree. Check if the image is still ASYNC to see if a decode is |
246 // needed. | 278 // needed. |
247 PaintImage::Id image_id = candidate.stable_id(); | 279 PaintImage::Id image_id = candidate.stable_id(); |
248 auto it = image_async_decode_state_.find(image_id); | 280 auto it = image_async_decode_state_.find(image_id); |
249 DCHECK(it != image_async_decode_state_.end()); | 281 DCHECK(it != image_async_decode_state_.end()); |
250 if (it->second.policy != DecodePolicy::ASYNC) | 282 if (it->second.policy != DecodePolicy::ASYNC) |
(...skipping 22 matching lines...) Expand all Loading... |
273 ImageController::ImageDecodeRequestId request_id = | 305 ImageController::ImageDecodeRequestId request_id = |
274 image_controller_->QueueImageDecode( | 306 image_controller_->QueueImageDecode( |
275 draw_image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, | 307 draw_image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, |
276 weak_factory_.GetWeakPtr(), image_id)); | 308 weak_factory_.GetWeakPtr(), image_id)); |
277 | 309 |
278 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>( | 310 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>( |
279 image_controller_, request_id)); | 311 image_controller_, request_id)); |
280 } | 312 } |
281 | 313 |
282 } // namespace cc | 314 } // namespace cc |
OLD | NEW |