OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/resources/raster_worker_pool.h" | 5 #include "cc/resources/raster_worker_pool.h" |
6 | 6 |
7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "cc/debug/benchmark_instrumentation.h" | 10 #include "cc/debug/benchmark_instrumentation.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 } | 48 } |
49 }; | 49 }; |
50 | 50 |
51 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 51 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
52 public: | 52 public: |
53 RasterWorkerPoolTaskImpl(const Resource* resource, | 53 RasterWorkerPoolTaskImpl(const Resource* resource, |
54 PicturePileImpl* picture_pile, | 54 PicturePileImpl* picture_pile, |
55 gfx::Rect content_rect, | 55 gfx::Rect content_rect, |
56 float contents_scale, | 56 float contents_scale, |
57 RasterMode raster_mode, | 57 RasterMode raster_mode, |
58 bool is_tile_in_pending_tree_now_bin, | |
59 TileResolution tile_resolution, | 58 TileResolution tile_resolution, |
60 int layer_id, | 59 int layer_id, |
61 const void* tile_id, | 60 const void* tile_id, |
62 int source_frame_number, | 61 int source_frame_number, |
63 RenderingStatsInstrumentation* rendering_stats, | 62 RenderingStatsInstrumentation* rendering_stats, |
64 const RasterWorkerPool::RasterTask::Reply& reply, | 63 const RasterWorkerPool::RasterTask::Reply& reply, |
65 TaskVector* dependencies) | 64 TaskVector* dependencies) |
66 : internal::RasterWorkerPoolTask(resource, dependencies), | 65 : internal::RasterWorkerPoolTask(resource, dependencies), |
67 picture_pile_(picture_pile), | 66 picture_pile_(picture_pile), |
68 content_rect_(content_rect), | 67 content_rect_(content_rect), |
69 contents_scale_(contents_scale), | 68 contents_scale_(contents_scale), |
70 raster_mode_(raster_mode), | 69 raster_mode_(raster_mode), |
71 is_tile_in_pending_tree_now_bin_(is_tile_in_pending_tree_now_bin), | |
72 tile_resolution_(tile_resolution), | 70 tile_resolution_(tile_resolution), |
73 layer_id_(layer_id), | 71 layer_id_(layer_id), |
74 tile_id_(tile_id), | 72 tile_id_(tile_id), |
75 source_frame_number_(source_frame_number), | 73 source_frame_number_(source_frame_number), |
76 rendering_stats_(rendering_stats), | 74 rendering_stats_(rendering_stats), |
77 reply_(reply) {} | 75 reply_(reply) {} |
78 | 76 |
79 void RunAnalysisOnThread(unsigned thread_index) { | 77 void RunAnalysisOnThread(unsigned thread_index) { |
80 TRACE_EVENT1("cc", | 78 TRACE_EVENT1("cc", |
81 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", | 79 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", |
82 "data", | 80 "data", |
83 TracedValue::FromValue(DataAsValue().release())); | 81 TracedValue::FromValue(DataAsValue().release())); |
84 | 82 |
85 DCHECK(picture_pile_.get()); | 83 DCHECK(picture_pile_.get()); |
86 DCHECK(rendering_stats_); | 84 DCHECK(rendering_stats_); |
87 | 85 |
88 PicturePileImpl* picture_clone = | 86 PicturePileImpl* picture_clone = |
89 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 87 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
90 | 88 |
91 DCHECK(picture_clone); | 89 DCHECK(picture_clone); |
92 | 90 |
93 base::TimeTicks start_time = rendering_stats_->StartRecording(); | |
94 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); | 91 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); |
95 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); | |
96 | 92 |
97 // Record the solid color prediction. | 93 // Record the solid color prediction. |
98 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", | 94 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", |
99 analysis_.is_solid_color); | 95 analysis_.is_solid_color); |
100 rendering_stats_->AddAnalysisResult(duration, analysis_.is_solid_color); | |
101 | 96 |
102 // Clear the flag if we're not using the estimator. | 97 // Clear the flag if we're not using the estimator. |
103 analysis_.is_solid_color &= kUseColorEstimator; | 98 analysis_.is_solid_color &= kUseColorEstimator; |
104 } | 99 } |
105 | 100 |
106 bool RunRasterOnThread(unsigned thread_index, | 101 bool RunRasterOnThread(unsigned thread_index, |
107 void* buffer, | 102 void* buffer, |
108 gfx::Size size, | 103 gfx::Size size, |
109 int stride) { | 104 int stride) { |
110 TRACE_EVENT2( | 105 TRACE_EVENT2( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 break; | 158 break; |
164 case HIGH_QUALITY_RASTER_MODE: | 159 case HIGH_QUALITY_RASTER_MODE: |
165 break; | 160 break; |
166 case NUM_RASTER_MODES: | 161 case NUM_RASTER_MODES: |
167 default: | 162 default: |
168 NOTREACHED(); | 163 NOTREACHED(); |
169 } | 164 } |
170 | 165 |
171 canvas.setDrawFilter(draw_filter.get()); | 166 canvas.setDrawFilter(draw_filter.get()); |
172 | 167 |
| 168 base::TimeDelta prev_rasterize_time = |
| 169 rendering_stats_->GetImplThreadRenderingStats().rasterize_time; |
| 170 |
| 171 picture_clone->RasterToBitmap( |
| 172 &canvas, content_rect_, contents_scale_, rendering_stats_); |
| 173 |
173 if (rendering_stats_->record_rendering_stats()) { | 174 if (rendering_stats_->record_rendering_stats()) { |
174 PicturePileImpl::RasterStats raster_stats; | 175 base::TimeDelta current_rasterize_time = |
175 picture_clone->RasterToBitmap( | 176 rendering_stats_->GetImplThreadRenderingStats().rasterize_time; |
176 &canvas, content_rect_, contents_scale_, &raster_stats); | |
177 rendering_stats_->AddRaster( | |
178 raster_stats.total_rasterize_time, | |
179 raster_stats.best_rasterize_time, | |
180 raster_stats.total_pixels_rasterized, | |
181 is_tile_in_pending_tree_now_bin_); | |
182 | |
183 HISTOGRAM_CUSTOM_COUNTS( | 177 HISTOGRAM_CUSTOM_COUNTS( |
184 "Renderer4.PictureRasterTimeUS", | 178 "Renderer4.PictureRasterTimeUS", |
185 raster_stats.total_rasterize_time.InMicroseconds(), | 179 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), |
186 0, | 180 0, |
187 100000, | 181 100000, |
188 100); | 182 100); |
189 } else { | |
190 picture_clone->RasterToBitmap( | |
191 &canvas, content_rect_, contents_scale_, NULL); | |
192 } | 183 } |
193 | 184 |
194 ChangeBitmapConfigIfNeeded(bitmap, buffer); | 185 ChangeBitmapConfigIfNeeded(bitmap, buffer); |
195 | 186 |
196 return true; | 187 return true; |
197 } | 188 } |
198 | 189 |
199 // Overridden from internal::RasterWorkerPoolTask: | 190 // Overridden from internal::RasterWorkerPoolTask: |
200 virtual bool RunOnWorkerThread(unsigned thread_index, | 191 virtual bool RunOnWorkerThread(unsigned thread_index, |
201 void* buffer, | 192 void* buffer, |
202 gfx::Size size, | 193 gfx::Size size, |
203 int stride) | 194 int stride) |
204 OVERRIDE { | 195 OVERRIDE { |
205 RunAnalysisOnThread(thread_index); | 196 RunAnalysisOnThread(thread_index); |
206 return RunRasterOnThread(thread_index, buffer, size, stride); | 197 return RunRasterOnThread(thread_index, buffer, size, stride); |
207 } | 198 } |
208 virtual void CompleteOnOriginThread() OVERRIDE { | 199 virtual void CompleteOnOriginThread() OVERRIDE { |
209 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); | 200 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); |
210 } | 201 } |
211 | 202 |
212 protected: | 203 protected: |
213 virtual ~RasterWorkerPoolTaskImpl() {} | 204 virtual ~RasterWorkerPoolTaskImpl() {} |
214 | 205 |
215 private: | 206 private: |
216 scoped_ptr<base::Value> DataAsValue() const { | 207 scoped_ptr<base::Value> DataAsValue() const { |
217 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | 208 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
218 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); | 209 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); |
219 res->SetBoolean("is_tile_in_pending_tree_now_bin", | |
220 is_tile_in_pending_tree_now_bin_); | |
221 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); | 210 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); |
222 res->SetInteger("source_frame_number", source_frame_number_); | 211 res->SetInteger("source_frame_number", source_frame_number_); |
223 res->SetInteger("layer_id", layer_id_); | 212 res->SetInteger("layer_id", layer_id_); |
224 return res.PassAs<base::Value>(); | 213 return res.PassAs<base::Value>(); |
225 } | 214 } |
226 | 215 |
227 void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, | 216 void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, |
228 void* buffer) { | 217 void* buffer) { |
229 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded"); | 218 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded"); |
230 SkBitmap::Config config = SkBitmapConfigFromFormat( | 219 SkBitmap::Config config = SkBitmapConfigFromFormat( |
231 resource()->format()); | 220 resource()->format()); |
232 if (bitmap.getConfig() != config) { | 221 if (bitmap.getConfig() != config) { |
233 SkBitmap bitmap_dest; | 222 SkBitmap bitmap_dest; |
234 IdentityAllocator allocator(buffer); | 223 IdentityAllocator allocator(buffer); |
235 bitmap.copyTo(&bitmap_dest, config, &allocator); | 224 bitmap.copyTo(&bitmap_dest, config, &allocator); |
236 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | 225 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the |
237 // bitmap data. This check will be removed once crbug.com/293728 is fixed. | 226 // bitmap data. This check will be removed once crbug.com/293728 is fixed. |
238 CHECK_EQ(0u, bitmap_dest.rowBytes() % 4); | 227 CHECK_EQ(0u, bitmap_dest.rowBytes() % 4); |
239 } | 228 } |
240 } | 229 } |
241 | 230 |
242 PicturePileImpl::Analysis analysis_; | 231 PicturePileImpl::Analysis analysis_; |
243 scoped_refptr<PicturePileImpl> picture_pile_; | 232 scoped_refptr<PicturePileImpl> picture_pile_; |
244 gfx::Rect content_rect_; | 233 gfx::Rect content_rect_; |
245 float contents_scale_; | 234 float contents_scale_; |
246 RasterMode raster_mode_; | 235 RasterMode raster_mode_; |
247 bool is_tile_in_pending_tree_now_bin_; | |
248 TileResolution tile_resolution_; | 236 TileResolution tile_resolution_; |
249 int layer_id_; | 237 int layer_id_; |
250 const void* tile_id_; | 238 const void* tile_id_; |
251 int source_frame_number_; | 239 int source_frame_number_; |
252 RenderingStatsInstrumentation* rendering_stats_; | 240 RenderingStatsInstrumentation* rendering_stats_; |
253 const RasterWorkerPool::RasterTask::Reply reply_; | 241 const RasterWorkerPool::RasterTask::Reply reply_; |
254 | 242 |
255 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 243 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
256 }; | 244 }; |
257 | 245 |
258 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 246 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
259 public: | 247 public: |
260 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, | 248 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, |
261 int layer_id, | 249 int layer_id, |
262 RenderingStatsInstrumentation* rendering_stats, | 250 RenderingStatsInstrumentation* rendering_stats, |
263 const RasterWorkerPool::Task::Reply& reply) | 251 const RasterWorkerPool::Task::Reply& reply) |
264 : pixel_ref_(pixel_ref), | 252 : pixel_ref_(pixel_ref), |
265 layer_id_(layer_id), | 253 layer_id_(layer_id), |
266 rendering_stats_(rendering_stats), | 254 rendering_stats_(rendering_stats), |
267 reply_(reply) {} | 255 reply_(reply) {} |
268 | 256 |
269 // Overridden from internal::WorkerPoolTask: | 257 // Overridden from internal::WorkerPoolTask: |
270 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { | 258 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
271 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); | 259 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); |
272 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( | 260 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( |
273 pixel_ref_); | 261 pixel_ref_); |
274 base::TimeTicks start_time = rendering_stats_->StartRecording(); | |
275 pixel_ref_->Decode(); | 262 pixel_ref_->Decode(); |
276 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); | |
277 rendering_stats_->AddDeferredImageDecode(duration); | |
278 } | 263 } |
279 virtual void CompleteOnOriginThread() OVERRIDE { | 264 virtual void CompleteOnOriginThread() OVERRIDE { |
280 reply_.Run(!HasFinishedRunning()); | 265 reply_.Run(!HasFinishedRunning()); |
281 } | 266 } |
282 | 267 |
283 protected: | 268 protected: |
284 virtual ~ImageDecodeWorkerPoolTaskImpl() {} | 269 virtual ~ImageDecodeWorkerPoolTaskImpl() {} |
285 | 270 |
286 private: | 271 private: |
287 skia::LazyPixelRef* pixel_ref_; | 272 skia::LazyPixelRef* pixel_ref_; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 RasterWorkerPool::RasterTask::~RasterTask() { | 412 RasterWorkerPool::RasterTask::~RasterTask() { |
428 } | 413 } |
429 | 414 |
430 // static | 415 // static |
431 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 416 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
432 const Resource* resource, | 417 const Resource* resource, |
433 PicturePileImpl* picture_pile, | 418 PicturePileImpl* picture_pile, |
434 gfx::Rect content_rect, | 419 gfx::Rect content_rect, |
435 float contents_scale, | 420 float contents_scale, |
436 RasterMode raster_mode, | 421 RasterMode raster_mode, |
437 bool is_tile_in_pending_tree_now_bin, | |
438 TileResolution tile_resolution, | 422 TileResolution tile_resolution, |
439 int layer_id, | 423 int layer_id, |
440 const void* tile_id, | 424 const void* tile_id, |
441 int source_frame_number, | 425 int source_frame_number, |
442 RenderingStatsInstrumentation* rendering_stats, | 426 RenderingStatsInstrumentation* rendering_stats, |
443 const RasterTask::Reply& reply, | 427 const RasterTask::Reply& reply, |
444 Task::Set* dependencies) { | 428 Task::Set* dependencies) { |
445 return RasterTask( | 429 return RasterTask( |
446 new RasterWorkerPoolTaskImpl(resource, | 430 new RasterWorkerPoolTaskImpl(resource, |
447 picture_pile, | 431 picture_pile, |
448 content_rect, | 432 content_rect, |
449 contents_scale, | 433 contents_scale, |
450 raster_mode, | 434 raster_mode, |
451 is_tile_in_pending_tree_now_bin, | |
452 tile_resolution, | 435 tile_resolution, |
453 layer_id, | 436 layer_id, |
454 tile_id, | 437 tile_id, |
455 source_frame_number, | 438 source_frame_number, |
456 rendering_stats, | 439 rendering_stats, |
457 reply, | 440 reply, |
458 &dependencies->tasks_)); | 441 &dependencies->tasks_)); |
459 } | 442 } |
460 | 443 |
461 // static | 444 // static |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 | 579 |
597 internal::GraphNode* decode_node = CreateGraphNodeForTask( | 580 internal::GraphNode* decode_node = CreateGraphNodeForTask( |
598 decode_task, priority, graph); | 581 decode_task, priority, graph); |
599 decode_node->add_dependent(raster_node); | 582 decode_node->add_dependent(raster_node); |
600 } | 583 } |
601 | 584 |
602 return raster_node; | 585 return raster_node; |
603 } | 586 } |
604 | 587 |
605 } // namespace cc | 588 } // namespace cc |
OLD | NEW |