OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/playback/display_item_list.h" | 5 #include "cc/playback/display_item_list.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 !settings.use_cached_picture || DisplayItemsTracingEnabled())); | 48 !settings.use_cached_picture || DisplayItemsTracingEnabled())); |
49 } | 49 } |
50 | 50 |
51 DisplayItemList::DisplayItemList(gfx::Rect layer_rect, | 51 DisplayItemList::DisplayItemList(gfx::Rect layer_rect, |
52 const DisplayItemListSettings& settings, | 52 const DisplayItemListSettings& settings, |
53 bool retain_individual_display_items) | 53 bool retain_individual_display_items) |
54 : items_(LargestDisplayItemSize(), kDefaultNumDisplayItemsToReserve), | 54 : items_(LargestDisplayItemSize(), kDefaultNumDisplayItemsToReserve), |
55 use_cached_picture_(settings.use_cached_picture), | 55 use_cached_picture_(settings.use_cached_picture), |
56 retain_individual_display_items_(retain_individual_display_items), | 56 retain_individual_display_items_(retain_individual_display_items), |
57 layer_rect_(layer_rect), | 57 layer_rect_(layer_rect), |
58 is_suitable_for_gpu_rasterization_(true), | 58 all_items_are_suitable_for_gpu_rasterization_(true), |
59 approximate_op_count_(0), | 59 approximate_op_count_(0), |
60 picture_memory_usage_(0), | 60 picture_memory_usage_(0), |
61 external_memory_usage_(0) { | 61 external_memory_usage_(0) { |
62 #if DCHECK_IS_ON() | 62 #if DCHECK_IS_ON() |
63 needs_process_ = false; | 63 needs_process_ = false; |
64 #endif | 64 #endif |
65 if (use_cached_picture_) { | 65 if (use_cached_picture_) { |
66 SkRTreeFactory factory; | 66 SkRTreeFactory factory; |
67 recorder_.reset(new SkPictureRecorder()); | 67 recorder_.reset(new SkPictureRecorder()); |
68 canvas_ = skia::SharePtr(recorder_->beginRecording( | 68 canvas_ = skia::SharePtr(recorder_->beginRecording( |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // after |items_| grows too large and we process it. | 116 // after |items_| grows too large and we process it. |
117 DCHECK(items_.empty()); | 117 DCHECK(items_.empty()); |
118 } | 118 } |
119 } | 119 } |
120 | 120 |
121 void DisplayItemList::ProcessAppendedItems() { | 121 void DisplayItemList::ProcessAppendedItems() { |
122 #if DCHECK_IS_ON() | 122 #if DCHECK_IS_ON() |
123 needs_process_ = false; | 123 needs_process_ = false; |
124 #endif | 124 #endif |
125 for (const DisplayItem* item : items_) { | 125 for (const DisplayItem* item : items_) { |
| 126 all_items_are_suitable_for_gpu_rasterization_ &= |
| 127 item->is_suitable_for_gpu_rasterization(); |
| 128 approximate_op_count_ += item->approximate_op_count(); |
| 129 |
126 if (use_cached_picture_) { | 130 if (use_cached_picture_) { |
127 // When using a cached picture we will calculate gpu suitability on the | |
128 // entire cached picture instead of the items. This is more permissive | |
129 // since none of the items might individually trigger a veto even though | |
130 // they collectively have enough "bad" operations that a corresponding | |
131 // Picture would get vetoed. See crbug.com/513016. | |
132 DCHECK(canvas_); | 131 DCHECK(canvas_); |
133 approximate_op_count_ += item->approximate_op_count(); | 132 item->Raster(canvas_.get(), gfx::Rect(), NULL); |
134 item->Raster(canvas_.get(), gfx::Rect(), nullptr); | |
135 } else { | |
136 is_suitable_for_gpu_rasterization_ &= | |
137 item->is_suitable_for_gpu_rasterization(); | |
138 approximate_op_count_ += item->approximate_op_count(); | |
139 } | 133 } |
140 | 134 |
141 if (retain_individual_display_items_) { | 135 if (retain_individual_display_items_) { |
142 // Warning: this double-counts SkPicture data if use_cached_picture_ is | 136 // Warning: this double-counts SkPicture data if use_cached_picture_ is |
143 // also true. | 137 // also true. |
144 external_memory_usage_ += item->external_memory_usage(); | 138 external_memory_usage_ += item->external_memory_usage(); |
145 } | 139 } |
146 } | 140 } |
147 | 141 |
148 if (!retain_individual_display_items_) | 142 if (!retain_individual_display_items_) |
149 items_.clear(); | 143 items_.clear(); |
150 } | 144 } |
151 | 145 |
152 void DisplayItemList::RasterIntoCanvas(const DisplayItem& item) { | 146 void DisplayItemList::RasterIntoCanvas(const DisplayItem& item) { |
153 DCHECK(canvas_); | 147 DCHECK(canvas_); |
154 DCHECK(!retain_individual_display_items_); | 148 DCHECK(!retain_individual_display_items_); |
| 149 all_items_are_suitable_for_gpu_rasterization_ &= |
| 150 item.is_suitable_for_gpu_rasterization(); |
155 approximate_op_count_ += item.approximate_op_count(); | 151 approximate_op_count_ += item.approximate_op_count(); |
156 | 152 |
157 item.Raster(canvas_.get(), gfx::Rect(), nullptr); | 153 item.Raster(canvas_.get(), gfx::Rect(), NULL); |
158 } | 154 } |
159 | 155 |
160 bool DisplayItemList::RetainsIndividualDisplayItems() const { | 156 bool DisplayItemList::RetainsIndividualDisplayItems() const { |
161 return retain_individual_display_items_; | 157 return retain_individual_display_items_; |
162 } | 158 } |
163 | 159 |
164 void DisplayItemList::RemoveLast() { | 160 void DisplayItemList::RemoveLast() { |
165 // We cannot remove the last item if it has been squashed into a picture. | 161 // We cannot remove the last item if it has been squashed into a picture. |
166 // The last item should not have been handled by ProcessAppendedItems, so we | 162 // The last item should not have been handled by ProcessAppendedItems, so we |
167 // don't need to remove it from approximate_op_count_, etc. | 163 // don't need to remove it from approximate_op_count_, etc. |
168 DCHECK(retain_individual_display_items_); | 164 DCHECK(retain_individual_display_items_); |
169 DCHECK(!use_cached_picture_); | 165 DCHECK(!use_cached_picture_); |
170 items_.RemoveLast(); | 166 items_.RemoveLast(); |
171 } | 167 } |
172 | 168 |
173 void DisplayItemList::Finalize() { | 169 void DisplayItemList::Finalize() { |
174 ProcessAppendedItems(); | 170 ProcessAppendedItems(); |
175 | 171 |
176 if (use_cached_picture_) { | 172 if (use_cached_picture_) { |
177 // Convert to an SkPicture for faster rasterization. | 173 // Convert to an SkPicture for faster rasterization. |
178 DCHECK(use_cached_picture_); | 174 DCHECK(use_cached_picture_); |
179 DCHECK(!picture_); | 175 DCHECK(!picture_); |
180 picture_ = skia::AdoptRef(recorder_->endRecordingAsPicture()); | 176 picture_ = skia::AdoptRef(recorder_->endRecordingAsPicture()); |
181 DCHECK(picture_); | 177 DCHECK(picture_); |
182 picture_memory_usage_ = | 178 picture_memory_usage_ = |
183 SkPictureUtils::ApproximateBytesUsed(picture_.get()); | 179 SkPictureUtils::ApproximateBytesUsed(picture_.get()); |
184 recorder_.reset(); | 180 recorder_.reset(); |
185 canvas_.clear(); | 181 canvas_.clear(); |
186 is_suitable_for_gpu_rasterization_ = | |
187 picture_->suitableForGpuRasterization(nullptr); | |
188 } | 182 } |
189 } | 183 } |
190 | 184 |
191 bool DisplayItemList::IsSuitableForGpuRasterization() const { | 185 bool DisplayItemList::IsSuitableForGpuRasterization() const { |
192 DCHECK(ProcessAppendedItemsCalled()); | 186 DCHECK(ProcessAppendedItemsCalled()); |
193 return is_suitable_for_gpu_rasterization_; | 187 if (use_cached_picture_) |
| 188 return picture_->suitableForGpuRasterization(NULL); |
| 189 |
| 190 // This is more permissive than Picture's implementation, since none of the |
| 191 // items might individually trigger a veto even though they collectively have |
| 192 // enough "bad" operations that a corresponding Picture would get vetoed. See |
| 193 // crbug.com/513016. |
| 194 return all_items_are_suitable_for_gpu_rasterization_; |
194 } | 195 } |
195 | 196 |
196 int DisplayItemList::ApproximateOpCount() const { | 197 int DisplayItemList::ApproximateOpCount() const { |
197 DCHECK(ProcessAppendedItemsCalled()); | 198 DCHECK(ProcessAppendedItemsCalled()); |
198 return approximate_op_count_; | 199 return approximate_op_count_; |
199 } | 200 } |
200 | 201 |
201 size_t DisplayItemList::ApproximateMemoryUsage() const { | 202 size_t DisplayItemList::ApproximateMemoryUsage() const { |
202 DCHECK(ProcessAppendedItemsCalled()); | 203 DCHECK(ProcessAppendedItemsCalled()); |
203 // We double-count in this case. Produce zero to avoid being misleading. | 204 // We double-count in this case. Produce zero to avoid being misleading. |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 DCHECK(picture_); | 277 DCHECK(picture_); |
277 DCHECK(!images_); | 278 DCHECK(!images_); |
278 images_ = make_scoped_ptr(new DiscardableImageMap(grid_cell_size)); | 279 images_ = make_scoped_ptr(new DiscardableImageMap(grid_cell_size)); |
279 if (!picture_->willPlayBackBitmaps()) | 280 if (!picture_->willPlayBackBitmaps()) |
280 return; | 281 return; |
281 | 282 |
282 images_->GatherImagesFromPicture(picture_.get(), layer_rect_); | 283 images_->GatherImagesFromPicture(picture_.get(), layer_rect_); |
283 } | 284 } |
284 | 285 |
285 } // namespace cc | 286 } // namespace cc |
OLD | NEW |