Chromium Code Reviews| 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 21 matching lines...) Expand all Loading... | |
| 32 str << "paint_image_id[" << paint_image_id << "] sk_image_id[" << sk_image_id | 32 str << "paint_image_id[" << paint_image_id << "] sk_image_id[" << sk_image_id |
| 33 << "] complete[" << complete << "] static[" << static_image | 33 << "] complete[" << complete << "] static[" << static_image |
| 34 << "], fits_size_constraints[" << fits_size_constraints << "], size[" | 34 << "], fits_size_constraints[" << fits_size_constraints << "], size[" |
| 35 << size << "]" | 35 << size << "]" |
| 36 << " is_multipart[" << is_multipart << "]"; | 36 << " is_multipart[" << is_multipart << "]"; |
| 37 return str.str(); | 37 return str.str(); |
| 38 } | 38 } |
| 39 | 39 |
| 40 } // namespace | 40 } // namespace |
| 41 | 41 |
| 42 CheckerImageTracker::ImageDecodeRequest::ImageDecodeRequest( | |
| 43 PaintImage paint_image, | |
| 44 DecodeType type) | |
| 45 : paint_image(std::move(paint_image)), type(type) {} | |
| 46 | |
| 42 CheckerImageTracker::CheckerImageTracker(ImageController* image_controller, | 47 CheckerImageTracker::CheckerImageTracker(ImageController* image_controller, |
| 43 CheckerImageTrackerClient* client, | 48 CheckerImageTrackerClient* client, |
| 44 bool enable_checker_imaging) | 49 bool enable_checker_imaging) |
| 45 : image_controller_(image_controller), | 50 : image_controller_(image_controller), |
| 46 client_(client), | 51 client_(client), |
| 47 enable_checker_imaging_(enable_checker_imaging), | 52 enable_checker_imaging_(enable_checker_imaging), |
| 48 weak_factory_(this) {} | 53 weak_factory_(this) {} |
| 49 | 54 |
| 50 CheckerImageTracker::~CheckerImageTracker() = default; | 55 CheckerImageTracker::~CheckerImageTracker() = default; |
| 51 | 56 |
| 57 void CheckerImageTracker::SetNoDecodesAllowed() { | |
| 58 decode_priority_allowed_ = kNoDecodeAllowedPriority; | |
| 59 } | |
| 60 | |
| 61 void CheckerImageTracker::SetMaxDecodePriorityAllowed(DecodeType decode_type) { | |
| 62 DCHECK_GT(decode_type, kNoDecodeAllowedPriority); | |
| 63 DCHECK_GE(decode_type, decode_priority_allowed_); | |
| 64 DCHECK_LE(decode_type, DecodeType::kLast); | |
|
vmpstr
2017/06/22 16:57:57
I'm a bit hesitant for adding kLast just for this
Khushal
2017/06/22 20:11:51
Acknowledged.
| |
| 65 | |
| 66 if (decode_priority_allowed_ == decode_type) | |
| 67 return; | |
| 68 decode_priority_allowed_ = decode_type; | |
| 69 | |
| 70 // This will start the next decode if applicable. | |
| 71 ScheduleNextImageDecode(); | |
| 72 } | |
| 73 | |
| 52 void CheckerImageTracker::ScheduleImageDecodeQueue( | 74 void CheckerImageTracker::ScheduleImageDecodeQueue( |
| 53 ImageDecodeQueue image_decode_queue) { | 75 ImageDecodeQueue image_decode_queue) { |
| 54 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 76 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 55 "CheckerImageTracker::ScheduleImageDecodeQueue"); | 77 "CheckerImageTracker::ScheduleImageDecodeQueue"); |
| 56 // Only checker-imaged (async updated) images are decoded using the image | 78 // Only checker-imaged (async updated) images are decoded using the image |
| 57 // decode service. If |enable_checker_imaging_| is false, no image should | 79 // decode service. If |enable_checker_imaging_| is false, no image should |
| 58 // be checkered. | 80 // be checkered. |
| 59 DCHECK(image_decode_queue.empty() || enable_checker_imaging_); | 81 DCHECK(image_decode_queue.empty() || enable_checker_imaging_); |
| 60 | 82 |
| 83 #if DCHECK_IS_ON() | |
| 84 // The decodes in the queue should be prioritized correctly. | |
| 85 DecodeType type = DecodeType::kRaster; | |
| 86 for (const auto& image_request : image_decode_queue) { | |
| 87 DCHECK_GE(image_request.type, type); | |
| 88 type = image_request.type; | |
| 89 } | |
| 90 #endif | |
| 91 | |
| 61 image_decode_queue_ = std::move(image_decode_queue); | 92 image_decode_queue_ = std::move(image_decode_queue); |
| 62 ScheduleNextImageDecode(); | 93 ScheduleNextImageDecode(); |
| 63 } | 94 } |
| 64 | 95 |
| 65 const PaintImageIdFlatSet& | 96 const PaintImageIdFlatSet& |
| 66 CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { | 97 CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { |
| 67 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 98 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 68 "CheckerImageTracker::TakeImagesToInvalidateOnSyncTree"); | 99 "CheckerImageTracker::TakeImagesToInvalidateOnSyncTree"); |
| 69 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) | 100 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) |
| 70 << "Sync tree can not be invalidated more than once"; | 101 << "Sync tree can not be invalidated more than once"; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 } | 274 } |
| 244 | 275 |
| 245 void CheckerImageTracker::ScheduleNextImageDecode() { | 276 void CheckerImageTracker::ScheduleNextImageDecode() { |
| 246 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 277 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 247 "CheckerImageTracker::ScheduleNextImageDecode"); | 278 "CheckerImageTracker::ScheduleNextImageDecode"); |
| 248 // We can have only one outstanding decode pending completion with the decode | 279 // We can have only one outstanding decode pending completion with the decode |
| 249 // service. We'll come back here when it is completed. | 280 // service. We'll come back here when it is completed. |
| 250 if (outstanding_image_decode_.has_value()) | 281 if (outstanding_image_decode_.has_value()) |
| 251 return; | 282 return; |
| 252 | 283 |
| 284 if (image_decode_queue_.empty()) | |
| 285 return; | |
| 286 | |
| 287 // If scheduling decodes for this priority is not allowed right now, don't | |
| 288 // schedule them. We will come back here when the allowed priority changes. | |
| 289 if (image_decode_queue_.front().type > decode_priority_allowed_) | |
| 290 return; | |
| 291 | |
| 253 DrawImage draw_image; | 292 DrawImage draw_image; |
| 254 while (!image_decode_queue_.empty()) { | 293 while (!image_decode_queue_.empty()) { |
| 255 auto candidate = std::move(image_decode_queue_.front()); | 294 auto candidate = std::move(image_decode_queue_.front().paint_image); |
| 256 image_decode_queue_.erase(image_decode_queue_.begin()); | 295 image_decode_queue_.erase(image_decode_queue_.begin()); |
| 257 | 296 |
| 258 // Once an image has been decoded, it can still be present in the decode | 297 // Once an image has been decoded, it can still be present in the decode |
| 259 // queue (duplicate entries), or while an image is still being skipped on | 298 // queue (duplicate entries), or while an image is still being skipped on |
| 260 // the active tree. Check if the image is still ASYNC to see if a decode is | 299 // the active tree. Check if the image is still ASYNC to see if a decode is |
| 261 // needed. | 300 // needed. |
| 262 PaintImage::Id image_id = candidate.stable_id(); | 301 PaintImage::Id image_id = candidate.stable_id(); |
| 263 auto it = image_async_decode_state_.find(image_id); | 302 auto it = image_async_decode_state_.find(image_id); |
| 264 DCHECK(it != image_async_decode_state_.end()); | 303 DCHECK(it != image_async_decode_state_.end()); |
| 265 if (it->second.policy != DecodePolicy::ASYNC) | 304 if (it->second.policy != DecodePolicy::ASYNC) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 288 ImageController::ImageDecodeRequestId request_id = | 327 ImageController::ImageDecodeRequestId request_id = |
| 289 image_controller_->QueueImageDecode( | 328 image_controller_->QueueImageDecode( |
| 290 draw_image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, | 329 draw_image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, |
| 291 weak_factory_.GetWeakPtr(), image_id)); | 330 weak_factory_.GetWeakPtr(), image_id)); |
| 292 | 331 |
| 293 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>( | 332 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>( |
| 294 image_controller_, request_id)); | 333 image_controller_, request_id)); |
| 295 } | 334 } |
| 296 | 335 |
| 297 } // namespace cc | 336 } // namespace cc |
| OLD | NEW |