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

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

Issue 2726343004: cc: Optimize decode scheduling for checker-images. (Closed)
Patch Set: .. 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() {
vmpstr 2017/03/06 20:45:25 What is this function doing? Can you comment/expla
Khushal 2017/03/07 00:31:08 Done. I added a comment on the header.
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 std::queue<sk_sp<const SkImage>> empty_queue;
76 image_decode_request_queue_.swap(empty_queue);
77 pending_image_decodes_.clear();
78
79 pending_image_decodes_.insert(pending_image_decode->uniqueID());
80 image_decode_request_queue_.push(std::move(pending_image_decode));
81 }
82
68 void CheckerImageTracker::DidActivateSyncTree() { 83 void CheckerImageTracker::DidActivateSyncTree() {
69 for (auto image_id : invalidated_images_on_current_sync_tree_) { 84 for (auto image_id : invalidated_images_on_current_sync_tree_) {
70 auto it = image_id_to_decode_request_id_.find(image_id); 85 auto it = image_id_to_decode_request_id_.find(image_id);
71 image_controller_->UnlockImageDecode(it->second); 86 image_controller_->UnlockImageDecode(it->second);
72 image_id_to_decode_request_id_.erase(it); 87 image_id_to_decode_request_id_.erase(it);
73 } 88 }
74 89
75 invalidated_images_on_current_sync_tree_.clear(); 90 invalidated_images_on_current_sync_tree_.clear();
76 } 91 }
77 92
78 void CheckerImageTracker::DidFinishImageDecode( 93 void CheckerImageTracker::DidFinishImageDecode(
79 ImageId image_id, 94 ImageId image_id,
80 ImageController::ImageDecodeRequestId request_id, 95 ImageController::ImageDecodeRequestId request_id,
81 ImageController::ImageDecodeResult result) { 96 ImageController::ImageDecodeResult result) {
82 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", 97 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode",
83 image_id); 98 image_id);
84 99
85 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED); 100 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED);
86 DCHECK_NE(pending_image_decodes_.count(image_id), 0u); 101 DCHECK_NE(pending_image_decodes_.count(image_id), 0u);
102 DCHECK_EQ(image_id, image_decode_request_queue_.front()->uniqueID());
103
87 pending_image_decodes_.erase(image_id); 104 pending_image_decodes_.erase(image_id);
105 image_decode_request_queue_.pop();
106 RequestNextImageDecode();
88 107
89 images_decoded_once_.insert(image_id); 108 images_decoded_once_.insert(image_id);
90 images_pending_invalidation_.insert(image_id); 109 images_pending_invalidation_.insert(image_id);
91 client_->NeedsInvalidationForCheckerImagedTiles(); 110 client_->NeedsInvalidationForCheckerImagedTiles();
92 } 111 }
93 112
94 bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image, 113 bool CheckerImageTracker::ShouldCheckerImage(const sk_sp<const SkImage>& image,
95 WhichTree tree) const { 114 WhichTree tree) const {
96 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id", 115 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id",
97 image->uniqueID()); 116 image->uniqueID());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // don't need to schedule another decode. 156 // don't need to schedule another decode.
138 if (images_decoded_once_.count(image_id) != 0 || 157 if (images_decoded_once_.count(image_id) != 0 ||
139 pending_image_decodes_.count(image_id) != 0) { 158 pending_image_decodes_.count(image_id) != 0) {
140 return; 159 return;
141 } 160 }
142 161
143 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode", 162 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode",
144 image_id); 163 image_id);
145 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U); 164 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U);
146 165
166 pending_image_decodes_.insert(image_id);
167 image_decode_request_queue_.push(image);
168 if (image_decode_request_queue_.size() == 1)
vmpstr 2017/03/06 20:45:25 1u
Khushal 2017/03/07 00:31:08 Done.
169 RequestNextImageDecode();
170 }
171
172 void CheckerImageTracker::RequestNextImageDecode() {
173 if (image_decode_request_queue_.empty())
174 return;
175
176 sk_sp<const SkImage>& image = image_decode_request_queue_.front();
177 ImageId image_id = image->uniqueID();
178 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0u);
179
147 image_id_to_decode_request_id_[image_id] = 180 image_id_to_decode_request_id_[image_id] =
148 image_controller_->QueueImageDecode( 181 image_controller_->QueueImageDecode(
149 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, 182 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode,
150 weak_factory_.GetWeakPtr(), image_id)); 183 weak_factory_.GetWeakPtr(), image_id));
151 pending_image_decodes_.insert(image_id);
152 } 184 }
153 185
154 } // namespace cc 186 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698