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

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

Issue 2726343004: cc: Optimize decode scheduling for checker-images. (Closed)
Patch Set: addressed comments Created 3 years, 9 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/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
9 9
10 namespace cc { 10 namespace cc {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 58
59 const ImageIdFlatSet& CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { 59 const ImageIdFlatSet& CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() {
60 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) 60 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u)
61 << "Sync tree can not be invalidated more than once"; 61 << "Sync tree can not be invalidated more than once";
62 62
63 invalidated_images_on_current_sync_tree_.swap(images_pending_invalidation_); 63 invalidated_images_on_current_sync_tree_.swap(images_pending_invalidation_);
64 images_pending_invalidation_.clear(); 64 images_pending_invalidation_.clear();
65 return invalidated_images_on_current_sync_tree_; 65 return invalidated_images_on_current_sync_tree_;
66 } 66 }
67 67
68 void CheckerImageTracker::ResetImageDecodeQueue() {
69 if (image_decode_request_queue_.empty())
70 return;
71 DCHECK(enable_checker_imaging_);
72
73 sk_sp<const SkImage> pending_image_decode =
74 image_decode_request_queue_.front();
75 image_decode_request_queue_.clear();
76 pending_image_decodes_.clear();
77
78 pending_image_decodes_.insert(pending_image_decode->uniqueID());
vmpstr 2017/03/07 19:25:08 I guess my confusion comes from the implementation
Khushal 2017/03/13 20:35:08 Removed the function. I think instead of having a
79 image_decode_request_queue_.push_back(std::move(pending_image_decode));
80 }
81
68 void CheckerImageTracker::DidActivateSyncTree() { 82 void CheckerImageTracker::DidActivateSyncTree() {
69 for (auto image_id : invalidated_images_on_current_sync_tree_) { 83 for (auto image_id : invalidated_images_on_current_sync_tree_) {
70 auto it = image_id_to_decode_request_id_.find(image_id); 84 auto it = image_id_to_decode_request_id_.find(image_id);
71 image_controller_->UnlockImageDecode(it->second); 85 image_controller_->UnlockImageDecode(it->second);
72 image_id_to_decode_request_id_.erase(it); 86 image_id_to_decode_request_id_.erase(it);
73 } 87 }
74 88
75 invalidated_images_on_current_sync_tree_.clear(); 89 invalidated_images_on_current_sync_tree_.clear();
76 } 90 }
77 91
78 void CheckerImageTracker::DidFinishImageDecode( 92 void CheckerImageTracker::DidFinishImageDecode(
79 ImageId image_id, 93 ImageId image_id,
80 ImageController::ImageDecodeRequestId request_id, 94 ImageController::ImageDecodeRequestId request_id,
81 ImageController::ImageDecodeResult result) { 95 ImageController::ImageDecodeResult result) {
82 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", 96 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode",
83 image_id); 97 image_id);
84 98
85 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED); 99 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED);
86 DCHECK_NE(pending_image_decodes_.count(image_id), 0u); 100 DCHECK_NE(pending_image_decodes_.count(image_id), 0u);
101 DCHECK_EQ(image_id, image_decode_request_queue_.front()->uniqueID());
102
87 pending_image_decodes_.erase(image_id); 103 pending_image_decodes_.erase(image_id);
104 image_decode_request_queue_.erase(image_decode_request_queue_.begin());
vmpstr 2017/03/07 19:25:08 "pop_front"? Unless the type doesn't have it
Khushal 2017/03/13 20:35:08 Not needed anymore.
105 ScheduleNextImageDecode();
88 106
89 images_decoded_once_.insert(image_id); 107 images_decoded_once_.insert(image_id);
90 images_pending_invalidation_.insert(image_id); 108 images_pending_invalidation_.insert(image_id);
91 client_->NeedsInvalidationForCheckerImagedTiles(); 109 client_->NeedsInvalidationForCheckerImagedTiles();
92 } 110 }
93 111
94 bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image, 112 bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image,
95 WhichTree tree) const { 113 WhichTree tree) const {
96 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id", 114 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id",
97 image->uniqueID()); 115 image->uniqueID());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // don't need to schedule another decode. 155 // don't need to schedule another decode.
138 if (images_decoded_once_.count(image_id) != 0 || 156 if (images_decoded_once_.count(image_id) != 0 ||
139 pending_image_decodes_.count(image_id) != 0) { 157 pending_image_decodes_.count(image_id) != 0) {
140 return; 158 return;
141 } 159 }
142 160
143 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode", 161 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode",
144 image_id); 162 image_id);
145 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U); 163 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U);
146 164
165 pending_image_decodes_.insert(image_id);
166 image_decode_request_queue_.push_back(image);
167 if (image_decode_request_queue_.size() == 1u)
168 ScheduleNextImageDecode();
169 }
170
171 void CheckerImageTracker::ScheduleNextImageDecode() {
172 if (image_decode_request_queue_.empty())
173 return;
174
175 sk_sp<const SkImage>& image = image_decode_request_queue_.front();
176 ImageId image_id = image->uniqueID();
177 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0u);
178
147 image_id_to_decode_request_id_[image_id] = 179 image_id_to_decode_request_id_[image_id] =
148 image_controller_->QueueImageDecode( 180 image_controller_->QueueImageDecode(
149 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, 181 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode,
150 weak_factory_.GetWeakPtr(), image_id)); 182 weak_factory_.GetWeakPtr(), image_id));
151 pending_image_decodes_.insert(image_id);
152 } 183 }
153 184
154 } // namespace cc 185 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698