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/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
10 | 10 |
(...skipping 22 matching lines...) Expand all Loading... |
33 CheckerImageTracker::~CheckerImageTracker() { | 33 CheckerImageTracker::~CheckerImageTracker() { |
34 // Unlock all images pending decode requests. | 34 // Unlock all images pending decode requests. |
35 for (auto it : image_id_to_decode_request_id_) | 35 for (auto it : image_id_to_decode_request_id_) |
36 image_controller_->UnlockImageDecode(it.second); | 36 image_controller_->UnlockImageDecode(it.second); |
37 } | 37 } |
38 | 38 |
39 void CheckerImageTracker::FilterImagesForCheckeringForTile( | 39 void CheckerImageTracker::FilterImagesForCheckeringForTile( |
40 std::vector<DrawImage>* images, | 40 std::vector<DrawImage>* images, |
41 ImageIdFlatSet* checkered_images, | 41 ImageIdFlatSet* checkered_images, |
42 WhichTree tree) { | 42 WhichTree tree) { |
| 43 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 44 "CheckerImageTracker::FilterImagesForCheckeringForTile", "tree", |
| 45 tree); |
43 DCHECK(checkered_images->empty()); | 46 DCHECK(checkered_images->empty()); |
44 | 47 |
45 base::EraseIf(*images, | 48 base::EraseIf(*images, |
46 [this, tree, &checkered_images](const DrawImage& draw_image) { | 49 [this, tree, &checkered_images](const DrawImage& draw_image) { |
47 const sk_sp<const SkImage>& image = draw_image.image(); | 50 const sk_sp<const SkImage>& image = draw_image.image(); |
48 DCHECK(image->isLazyGenerated()); | 51 DCHECK(image->isLazyGenerated()); |
49 if (ShouldCheckerImage(image, tree)) { | 52 if (ShouldCheckerImage(image, tree)) { |
50 ScheduleImageDecodeIfNecessary(image); | 53 ScheduleImageDecodeIfNecessary(image); |
51 checkered_images->insert(image->uniqueID()); | 54 checkered_images->insert(image->uniqueID()); |
52 return true; | 55 return true; |
53 } | 56 } |
54 return false; | 57 return false; |
55 }); | 58 }); |
56 } | 59 } |
57 | 60 |
58 const ImageIdFlatSet& CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { | 61 const ImageIdFlatSet& CheckerImageTracker::TakeImagesToInvalidateOnSyncTree() { |
| 62 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 63 "CheckerImageTracker::TakeImagesToInvalidateOnSyncTree"); |
59 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) | 64 DCHECK_EQ(invalidated_images_on_current_sync_tree_.size(), 0u) |
60 << "Sync tree can not be invalidated more than once"; | 65 << "Sync tree can not be invalidated more than once"; |
61 | 66 |
62 invalidated_images_on_current_sync_tree_.swap(images_pending_invalidation_); | 67 invalidated_images_on_current_sync_tree_.swap(images_pending_invalidation_); |
63 images_pending_invalidation_.clear(); | 68 images_pending_invalidation_.clear(); |
64 return invalidated_images_on_current_sync_tree_; | 69 return invalidated_images_on_current_sync_tree_; |
65 } | 70 } |
66 | 71 |
67 void CheckerImageTracker::DidActivateSyncTree() { | 72 void CheckerImageTracker::DidActivateSyncTree() { |
| 73 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 74 "CheckerImageTracker::DidActivateSyncTree"); |
68 for (auto image_id : invalidated_images_on_current_sync_tree_) { | 75 for (auto image_id : invalidated_images_on_current_sync_tree_) { |
69 auto it = image_id_to_decode_request_id_.find(image_id); | 76 auto it = image_id_to_decode_request_id_.find(image_id); |
70 image_controller_->UnlockImageDecode(it->second); | 77 image_controller_->UnlockImageDecode(it->second); |
71 image_id_to_decode_request_id_.erase(it); | 78 image_id_to_decode_request_id_.erase(it); |
72 } | 79 } |
73 | 80 |
74 invalidated_images_on_current_sync_tree_.clear(); | 81 invalidated_images_on_current_sync_tree_.clear(); |
75 } | 82 } |
76 | 83 |
77 void CheckerImageTracker::DidFinishImageDecode( | 84 void CheckerImageTracker::DidFinishImageDecode( |
78 ImageId image_id, | 85 ImageId image_id, |
79 ImageController::ImageDecodeRequestId request_id, | 86 ImageController::ImageDecodeRequestId request_id, |
80 ImageController::ImageDecodeResult result) { | 87 ImageController::ImageDecodeResult result) { |
| 88 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 89 "CheckerImageTracker::DidFinishImageDecode"); |
81 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", | 90 TRACE_EVENT_ASYNC_END0("cc", "CheckerImageTracker::DeferImageDecode", |
82 image_id); | 91 image_id); |
83 | 92 |
84 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED); | 93 DCHECK_NE(result, ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED); |
85 DCHECK_NE(pending_image_decodes_.count(image_id), 0u); | 94 DCHECK_NE(pending_image_decodes_.count(image_id), 0u); |
86 pending_image_decodes_.erase(image_id); | 95 pending_image_decodes_.erase(image_id); |
87 | 96 |
88 images_decoded_once_.insert(image_id); | 97 images_decoded_once_.insert(image_id); |
89 images_pending_invalidation_.insert(image_id); | 98 images_pending_invalidation_.insert(image_id); |
90 client_->NeedsInvalidationForCheckerImagedTiles(); | 99 client_->NeedsInvalidationForCheckerImagedTiles(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 if (images_decoded_once_.find(image->uniqueID()) != | 132 if (images_decoded_once_.find(image->uniqueID()) != |
124 images_decoded_once_.end()) { | 133 images_decoded_once_.end()) { |
125 return false; | 134 return false; |
126 } | 135 } |
127 | 136 |
128 return SafeSizeOfImage(image.get()) >= kMinImageSizeToCheckerBytes; | 137 return SafeSizeOfImage(image.get()) >= kMinImageSizeToCheckerBytes; |
129 } | 138 } |
130 | 139 |
131 void CheckerImageTracker::ScheduleImageDecodeIfNecessary( | 140 void CheckerImageTracker::ScheduleImageDecodeIfNecessary( |
132 const sk_sp<const SkImage>& image) { | 141 const sk_sp<const SkImage>& image) { |
| 142 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 143 "CheckerImageTracker::ScheduleImageDecodeIfNecessary"); |
133 ImageId image_id = image->uniqueID(); | 144 ImageId image_id = image->uniqueID(); |
134 | 145 |
135 // If the image has already been decoded, or a decode request is pending, we | 146 // If the image has already been decoded, or a decode request is pending, we |
136 // don't need to schedule another decode. | 147 // don't need to schedule another decode. |
137 if (images_decoded_once_.count(image_id) != 0 || | 148 if (images_decoded_once_.count(image_id) != 0 || |
138 pending_image_decodes_.count(image_id) != 0) { | 149 pending_image_decodes_.count(image_id) != 0) { |
139 return; | 150 return; |
140 } | 151 } |
141 | 152 |
142 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode", | 153 TRACE_EVENT_ASYNC_BEGIN0("cc", "CheckerImageTracker::DeferImageDecode", |
143 image_id); | 154 image_id); |
144 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U); | 155 DCHECK_EQ(image_id_to_decode_request_id_.count(image_id), 0U); |
145 | 156 |
146 image_id_to_decode_request_id_[image_id] = | 157 image_id_to_decode_request_id_[image_id] = |
147 image_controller_->QueueImageDecode( | 158 image_controller_->QueueImageDecode( |
148 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, | 159 image, base::Bind(&CheckerImageTracker::DidFinishImageDecode, |
149 weak_factory_.GetWeakPtr(), image_id)); | 160 weak_factory_.GetWeakPtr(), image_id)); |
150 pending_image_decodes_.insert(image_id); | 161 pending_image_decodes_.insert(image_id); |
151 } | 162 } |
152 | 163 |
153 } // namespace cc | 164 } // namespace cc |
OLD | NEW |