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

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

Issue 2927573003: cc: Disallow img.decode images from being checker imaged. (Closed)
Patch Set: 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
« no previous file with comments | « cc/tiles/checker_image_tracker.h ('k') | cc/tiles/checker_image_tracker_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 // they should be accompanied with an invalidation during paint. 81 // they should be accompanied with an invalidation during paint.
82 image_id_to_decode_.clear(); 82 image_id_to_decode_.clear();
83 83
84 if (can_clear_decode_policy_tracking) { 84 if (can_clear_decode_policy_tracking) {
85 image_async_decode_state_.clear(); 85 image_async_decode_state_.clear();
86 } else { 86 } else {
87 // If we can't clear the decode policy, we need to make sure we still 87 // If we can't clear the decode policy, we need to make sure we still
88 // re-decode and checker images that were pending invalidation. 88 // re-decode and checker images that were pending invalidation.
89 for (auto image_id : images_pending_invalidation_) { 89 for (auto image_id : images_pending_invalidation_) {
90 auto it = image_async_decode_state_.find(image_id); 90 auto it = image_async_decode_state_.find(image_id);
91 DCHECK(it != image_async_decode_state_.end());
91 92
92 DCHECK(it != image_async_decode_state_.end()); 93 // We might have disallowed checkering for this image while it was pending
94 // invalidation. Ensure that we keep this information.
95 if (it->second == DecodePolicy::SYNC_PERMANENT)
96 continue;
97
93 DCHECK_EQ(it->second, DecodePolicy::SYNC_DECODED_ONCE); 98 DCHECK_EQ(it->second, DecodePolicy::SYNC_DECODED_ONCE);
94
95 it->second = DecodePolicy::ASYNC; 99 it->second = DecodePolicy::ASYNC;
96 } 100 }
97 } 101 }
98 images_pending_invalidation_.clear(); 102 images_pending_invalidation_.clear();
99 } 103 }
100 104
105 void CheckerImageTracker::DisallowCheckeringForImage(const PaintImage& image) {
106 image_async_decode_state_[image.stable_id()] = DecodePolicy::SYNC_PERMANENT;
Khushal 2017/06/07 00:47:21 I think if the image was already seen by the track
vmpstr 2017/06/07 17:05:35 Makes sense. I've added a separate container for t
107 }
108
101 void CheckerImageTracker::DidFinishImageDecode( 109 void CheckerImageTracker::DidFinishImageDecode(
102 PaintImage::Id image_id, 110 PaintImage::Id image_id,
103 ImageController::ImageDecodeRequestId request_id, 111 ImageController::ImageDecodeRequestId request_id,
104 ImageController::ImageDecodeResult result) { 112 ImageController::ImageDecodeResult result) {
105 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 113 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
106 "CheckerImageTracker::DidFinishImageDecode"); 114 "CheckerImageTracker::DidFinishImageDecode");
107 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", 115 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode",
108 image_id); 116 image_id);
109 117
110 DCHECK_NE(ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED, result); 118 DCHECK_NE(ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED, result);
111 DCHECK_EQ(outstanding_image_decode_.value().stable_id(), image_id); 119 DCHECK_EQ(outstanding_image_decode_.value().stable_id(), image_id);
112 outstanding_image_decode_.reset(); 120 outstanding_image_decode_.reset();
113 121
114 // The async decode state may have been cleared if the tracker was cleared 122 // The async decode state may have been cleared if the tracker was cleared
115 // before this decode could be finished. 123 // before this decode could be finished.
116 auto it = image_async_decode_state_.find(image_id); 124 auto it = image_async_decode_state_.find(image_id);
117 if (it == image_async_decode_state_.end()) { 125 if (it == image_async_decode_state_.end()) {
118 DCHECK_EQ(image_id_to_decode_.count(image_id), 0u); 126 DCHECK_EQ(image_id_to_decode_.count(image_id), 0u);
119 return; 127 return;
120 } 128 }
121 129
122 it->second = DecodePolicy::SYNC_DECODED_ONCE; 130 // We might have disallowed checkering for this image while it was being
131 // processed. Ensure that the stronger condition is recorded.
132 if (it->second != DecodePolicy::SYNC_PERMANENT)
133 it->second = DecodePolicy::SYNC_DECODED_ONCE;
123 images_pending_invalidation_.insert(image_id); 134 images_pending_invalidation_.insert(image_id);
124 ScheduleNextImageDecode(); 135 ScheduleNextImageDecode();
125 client_->NeedsInvalidationForCheckerImagedTiles(); 136 client_->NeedsInvalidationForCheckerImagedTiles();
126 } 137 }
127 138
128 bool CheckerImageTracker::ShouldCheckerImage(const PaintImage& image, 139 bool CheckerImageTracker::ShouldCheckerImage(const PaintImage& image,
129 WhichTree tree) { 140 WhichTree tree) {
130 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id", 141 TRACE_EVENT1("cc", "CheckerImageTracker::ShouldCheckerImage", "image_id",
131 image.stable_id()); 142 image.stable_id());
132 143
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 image_controller_->QueueImageDecode( 222 image_controller_->QueueImageDecode(
212 outstanding_image_decode_.value().sk_image(), 223 outstanding_image_decode_.value().sk_image(),
213 base::Bind(&CheckerImageTracker::DidFinishImageDecode, 224 base::Bind(&CheckerImageTracker::DidFinishImageDecode,
214 weak_factory_.GetWeakPtr(), image_id)); 225 weak_factory_.GetWeakPtr(), image_id));
215 226
216 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>( 227 image_id_to_decode_.emplace(image_id, base::MakeUnique<ScopedDecodeHolder>(
217 image_controller_, request_id)); 228 image_controller_, request_id));
218 } 229 }
219 230
220 } // namespace cc 231 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/checker_image_tracker.h ('k') | cc/tiles/checker_image_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698