Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: cc/tiles/checker_image_tracker.cc

Issue 2924233002: cc: Move pre-decodes to background worker. (Closed)
Patch Set: addressed comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698