Chromium Code Reviews| 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/devtools_instrumentation.h" | 10 #include "cc/debug/devtools_instrumentation.h" |
| 11 #include "cc/debug/traced_value.h" | 11 #include "cc/debug/traced_value.h" |
| 12 #include "cc/resources/picture_pile_impl.h" | 12 #include "cc/resources/picture_pile_impl.h" |
| 13 #include "skia/ext/lazy_pixel_ref.h" | 13 #include "skia/ext/lazy_pixel_ref.h" |
| 14 #include "skia/ext/paint_simplifier.h" | 14 #include "skia/ext/paint_simplifier.h" |
| 15 | 15 |
| 16 namespace cc { | 16 namespace cc { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // Flag to indicate whether we should try and detect that | 20 // Flag to indicate whether we should try and detect that |
| 21 // a tile is of solid color. | 21 // a tile is of solid color. |
| 22 const bool kUseColorEstimator = true; | 22 const bool kUseColorEstimator = true; |
| 23 | 23 |
| 24 scoped_ptr<base::Value> RasterModeAsValue(RasterMode raster_mode) { | |
| 25 switch (raster_mode) { | |
| 26 case HIGH_QUALITY_NO_LCD_RASTER_MODE: | |
| 27 return scoped_ptr<base::Value>( | |
| 28 base::Value::CreateStringValue("HIGH_QUALITY_NO_LCD_RASTER_MODE")); | |
| 29 case HIGH_QUALITY_RASTER_MODE: | |
| 30 return scoped_ptr<base::Value>( | |
| 31 base::Value::CreateStringValue("HIGH_QUALITY_RASTER_MODE")); | |
| 32 case LOW_QUALITY_RASTER_MODE: | |
| 33 return scoped_ptr<base::Value>( | |
| 34 base::Value::CreateStringValue("LOW_QUALITY_RASTER_MODE")); | |
| 35 case NUM_RASTER_MODES: | |
| 36 default: | |
| 37 NOTREACHED() << "Unrecognized RasterMode value " << raster_mode; | |
| 38 return scoped_ptr<base::Value>( | |
| 39 base::Value::CreateStringValue("<unknown RasterMode value>")); | |
| 40 } | |
| 41 } | |
| 42 | |
| 43 class DisableLCDTextFilter : public SkDrawFilter { | 24 class DisableLCDTextFilter : public SkDrawFilter { |
| 44 public: | 25 public: |
| 45 // SkDrawFilter interface. | 26 // SkDrawFilter interface. |
| 46 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { | 27 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { |
| 47 if (type != SkDrawFilter::kText_Type) | 28 if (type != SkDrawFilter::kText_Type) |
| 48 return true; | 29 return true; |
| 49 | 30 |
| 50 paint->setLCDRenderText(false); | 31 paint->setLCDRenderText(false); |
| 51 return true; | 32 return true; |
| 52 } | 33 } |
| 53 }; | 34 }; |
| 54 | 35 |
| 36 scoped_ptr<base::Value> RasterTracingDataAsValue( | |
| 37 bool is_tile_in_pending_tree_now_bin_, | |
| 38 TileResolution tile_resolution_, | |
| 39 int layer_id_, | |
| 40 const void* tile_id_, | |
| 41 int source_frame_number_) { | |
|
reveman
2013/07/03 16:56:12
no "_" suffixes please. however, I think this woul
vmpstr
2013/07/03 17:33:33
Oops, sorry about the trailing underscores, it was
| |
| 42 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | |
| 43 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); | |
| 44 res->SetBoolean("is_tile_in_pending_tree_now_bin", | |
| 45 is_tile_in_pending_tree_now_bin_); | |
| 46 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); | |
| 47 res->SetInteger("source_frame_number", source_frame_number_); | |
| 48 res->SetInteger("layer_id", layer_id_); | |
| 49 return res.PassAs<base::Value>(); | |
| 50 } | |
| 51 | |
| 55 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 52 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| 56 public: | 53 public: |
| 57 RasterWorkerPoolTaskImpl(const Resource* resource, | 54 RasterWorkerPoolTaskImpl(const Resource* resource, |
| 58 PicturePileImpl* picture_pile, | 55 PicturePileImpl* picture_pile, |
| 59 gfx::Rect content_rect, | 56 gfx::Rect content_rect, |
| 60 float contents_scale, | 57 float contents_scale, |
| 61 RasterMode raster_mode, | 58 RasterMode raster_mode, |
| 62 const RasterTaskMetadata& metadata, | 59 bool is_tile_in_pending_tree_now_bin, |
| 60 TileResolution tile_resolution, | |
| 61 int layer_id, | |
| 62 const void* tile_id, | |
| 63 int source_frame_number, | |
| 63 RenderingStatsInstrumentation* rendering_stats, | 64 RenderingStatsInstrumentation* rendering_stats, |
| 64 const RasterWorkerPool::RasterTask::Reply& reply, | 65 const RasterWorkerPool::RasterTask::Reply& reply, |
| 65 TaskVector* dependencies) | 66 TaskVector* dependencies) |
| 66 : internal::RasterWorkerPoolTask(resource, dependencies), | 67 : internal::RasterWorkerPoolTask(resource, dependencies), |
| 67 picture_pile_(picture_pile), | 68 picture_pile_(picture_pile), |
| 68 content_rect_(content_rect), | 69 content_rect_(content_rect), |
| 69 contents_scale_(contents_scale), | 70 contents_scale_(contents_scale), |
| 70 raster_mode_(raster_mode), | 71 raster_mode_(raster_mode), |
| 71 metadata_(metadata), | 72 is_tile_in_pending_tree_now_bin_(is_tile_in_pending_tree_now_bin), |
| 73 tile_resolution_(tile_resolution), | |
| 74 layer_id_(layer_id), | |
| 75 tile_id_(tile_id), | |
| 76 source_frame_number_(source_frame_number), | |
| 72 rendering_stats_(rendering_stats), | 77 rendering_stats_(rendering_stats), |
| 73 reply_(reply) {} | 78 reply_(reply) {} |
| 74 | 79 |
| 75 void RunAnalysisOnThread(unsigned thread_index) { | 80 void RunAnalysisOnThread(unsigned thread_index) { |
| 76 TRACE_EVENT1("cc", | 81 TRACE_EVENT1("cc", |
| 77 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", | 82 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", |
| 78 "metadata", | 83 "metadata", |
|
reveman
2013/07/03 16:56:12
lets remove all references to metadata. "data" her
vmpstr
2013/07/03 17:33:33
Done.
| |
| 79 TracedValue::FromValue(metadata_.AsValue().release())); | 84 TracedValue::FromValue( |
| 85 RasterTracingDataAsValue(is_tile_in_pending_tree_now_bin_, | |
| 86 tile_resolution_, | |
| 87 layer_id_, | |
| 88 tile_id_, | |
| 89 source_frame_number_).release())); | |
| 80 | 90 |
| 81 DCHECK(picture_pile_.get()); | 91 DCHECK(picture_pile_.get()); |
| 82 DCHECK(rendering_stats_); | 92 DCHECK(rendering_stats_); |
| 83 | 93 |
| 84 PicturePileImpl* picture_clone = | 94 PicturePileImpl* picture_clone = |
| 85 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 95 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 86 | 96 |
| 87 DCHECK(picture_clone); | 97 DCHECK(picture_clone); |
| 88 | 98 |
| 89 base::TimeTicks start_time = rendering_stats_->StartRecording(); | 99 base::TimeTicks start_time = rendering_stats_->StartRecording(); |
| 90 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); | 100 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); |
| 91 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); | 101 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); |
| 92 | 102 |
| 93 // Record the solid color prediction. | 103 // Record the solid color prediction. |
| 94 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", | 104 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", |
| 95 analysis_.is_solid_color); | 105 analysis_.is_solid_color); |
| 96 rendering_stats_->AddTileAnalysisResult(duration, | 106 rendering_stats_->AddTileAnalysisResult(duration, |
| 97 analysis_.is_solid_color); | 107 analysis_.is_solid_color); |
| 98 | 108 |
| 99 // Clear the flag if we're not using the estimator. | 109 // Clear the flag if we're not using the estimator. |
| 100 analysis_.is_solid_color &= kUseColorEstimator; | 110 analysis_.is_solid_color &= kUseColorEstimator; |
| 101 } | 111 } |
| 102 | 112 |
| 103 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { | 113 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { |
| 104 TRACE_EVENT2( | 114 TRACE_EVENT2( |
| 105 "cc", | 115 "cc", |
| 106 "RasterWorkerPoolTaskImpl::RunRasterOnThread", | 116 "RasterWorkerPoolTaskImpl::RunRasterOnThread", |
| 107 "metadata", | 117 "metadata", |
| 108 TracedValue::FromValue(metadata_.AsValue().release()), | 118 TracedValue::FromValue( |
| 119 RasterTracingDataAsValue(is_tile_in_pending_tree_now_bin_, | |
| 120 tile_resolution_, | |
| 121 layer_id_, | |
| 122 tile_id_, | |
| 123 source_frame_number_).release()), | |
| 109 "raster_mode", | 124 "raster_mode", |
| 110 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); | 125 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); |
| 111 | 126 |
| 112 devtools_instrumentation::ScopedLayerTask raster_task( | 127 devtools_instrumentation::ScopedLayerTask raster_task( |
| 113 devtools_instrumentation::kRasterTask, metadata_.layer_id); | 128 devtools_instrumentation::kRasterTask, layer_id_); |
| 114 | 129 |
| 115 DCHECK(picture_pile_.get()); | 130 DCHECK(picture_pile_.get()); |
| 116 DCHECK(device); | 131 DCHECK(device); |
| 117 | 132 |
| 118 if (analysis_.is_solid_color) | 133 if (analysis_.is_solid_color) |
| 119 return false; | 134 return false; |
| 120 | 135 |
| 121 PicturePileImpl* picture_clone = | 136 PicturePileImpl* picture_clone = |
| 122 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 137 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 123 | 138 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 141 canvas.setDrawFilter(draw_filter.get()); | 156 canvas.setDrawFilter(draw_filter.get()); |
| 142 | 157 |
| 143 if (rendering_stats_->record_rendering_stats()) { | 158 if (rendering_stats_->record_rendering_stats()) { |
| 144 PicturePileImpl::RasterStats raster_stats; | 159 PicturePileImpl::RasterStats raster_stats; |
| 145 picture_clone->RasterToBitmap( | 160 picture_clone->RasterToBitmap( |
| 146 &canvas, content_rect_, contents_scale_, &raster_stats); | 161 &canvas, content_rect_, contents_scale_, &raster_stats); |
| 147 rendering_stats_->AddRaster( | 162 rendering_stats_->AddRaster( |
| 148 raster_stats.total_rasterize_time, | 163 raster_stats.total_rasterize_time, |
| 149 raster_stats.best_rasterize_time, | 164 raster_stats.best_rasterize_time, |
| 150 raster_stats.total_pixels_rasterized, | 165 raster_stats.total_pixels_rasterized, |
| 151 metadata_.is_tile_in_pending_tree_now_bin); | 166 is_tile_in_pending_tree_now_bin_); |
| 152 | 167 |
| 153 HISTOGRAM_CUSTOM_COUNTS( | 168 HISTOGRAM_CUSTOM_COUNTS( |
| 154 "Renderer4.PictureRasterTimeUS", | 169 "Renderer4.PictureRasterTimeUS", |
| 155 raster_stats.total_rasterize_time.InMicroseconds(), | 170 raster_stats.total_rasterize_time.InMicroseconds(), |
| 156 0, | 171 0, |
| 157 100000, | 172 100000, |
| 158 100); | 173 100); |
| 159 } else { | 174 } else { |
| 160 picture_clone->RasterToBitmap( | 175 picture_clone->RasterToBitmap( |
| 161 &canvas, content_rect_, contents_scale_, NULL); | 176 &canvas, content_rect_, contents_scale_, NULL); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 175 | 190 |
| 176 protected: | 191 protected: |
| 177 virtual ~RasterWorkerPoolTaskImpl() {} | 192 virtual ~RasterWorkerPoolTaskImpl() {} |
| 178 | 193 |
| 179 private: | 194 private: |
| 180 PicturePileImpl::Analysis analysis_; | 195 PicturePileImpl::Analysis analysis_; |
| 181 scoped_refptr<PicturePileImpl> picture_pile_; | 196 scoped_refptr<PicturePileImpl> picture_pile_; |
| 182 gfx::Rect content_rect_; | 197 gfx::Rect content_rect_; |
| 183 float contents_scale_; | 198 float contents_scale_; |
| 184 RasterMode raster_mode_; | 199 RasterMode raster_mode_; |
| 185 RasterTaskMetadata metadata_; | 200 bool is_tile_in_pending_tree_now_bin_; |
| 201 TileResolution tile_resolution_; | |
| 202 int layer_id_; | |
| 203 const void* tile_id_; | |
| 204 int source_frame_number_; | |
| 186 RenderingStatsInstrumentation* rendering_stats_; | 205 RenderingStatsInstrumentation* rendering_stats_; |
| 187 const RasterWorkerPool::RasterTask::Reply reply_; | 206 const RasterWorkerPool::RasterTask::Reply reply_; |
| 188 | 207 |
| 189 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 208 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
| 190 }; | 209 }; |
| 191 | 210 |
| 192 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 211 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 193 public: | 212 public: |
| 194 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, | 213 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, |
| 195 int layer_id, | 214 int layer_id, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 292 DCHECK(!did_complete_); | 311 DCHECK(!did_complete_); |
| 293 did_complete_ = true; | 312 did_complete_ = true; |
| 294 } | 313 } |
| 295 | 314 |
| 296 bool RasterWorkerPoolTask::HasCompleted() const { | 315 bool RasterWorkerPoolTask::HasCompleted() const { |
| 297 return did_complete_; | 316 return did_complete_; |
| 298 } | 317 } |
| 299 | 318 |
| 300 } // namespace internal | 319 } // namespace internal |
| 301 | 320 |
| 302 scoped_ptr<base::Value> RasterTaskMetadata::AsValue() const { | |
| 303 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | |
| 304 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release()); | |
| 305 res->SetBoolean("is_tile_in_pending_tree_now_bin", | |
| 306 is_tile_in_pending_tree_now_bin); | |
| 307 res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); | |
| 308 res->SetInteger("source_frame_number", source_frame_number); | |
| 309 return res.PassAs<base::Value>(); | |
| 310 } | |
| 311 | |
| 312 RasterWorkerPool::Task::Set::Set() { | 321 RasterWorkerPool::Task::Set::Set() { |
| 313 } | 322 } |
| 314 | 323 |
| 315 RasterWorkerPool::Task::Set::~Set() { | 324 RasterWorkerPool::Task::Set::~Set() { |
| 316 } | 325 } |
| 317 | 326 |
| 318 void RasterWorkerPool::Task::Set::Insert(const Task& task) { | 327 void RasterWorkerPool::Task::Set::Insert(const Task& task) { |
| 319 DCHECK(!task.is_null()); | 328 DCHECK(!task.is_null()); |
| 320 tasks_.push_back(task.internal_); | 329 tasks_.push_back(task.internal_); |
| 321 } | 330 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 graph_.set(raster_task, raster_node.Pass()); | 422 graph_.set(raster_task, raster_node.Pass()); |
| 414 } | 423 } |
| 415 | 424 |
| 416 // static | 425 // static |
| 417 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 426 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
| 418 const Resource* resource, | 427 const Resource* resource, |
| 419 PicturePileImpl* picture_pile, | 428 PicturePileImpl* picture_pile, |
| 420 gfx::Rect content_rect, | 429 gfx::Rect content_rect, |
| 421 float contents_scale, | 430 float contents_scale, |
| 422 RasterMode raster_mode, | 431 RasterMode raster_mode, |
| 423 const RasterTaskMetadata& metadata, | 432 bool is_tile_in_pending_tree_now_bin, |
| 433 TileResolution tile_resolution, | |
| 434 int layer_id, | |
| 435 const void* tile_id, | |
| 436 int source_frame_number, | |
| 424 RenderingStatsInstrumentation* rendering_stats, | 437 RenderingStatsInstrumentation* rendering_stats, |
| 425 const RasterTask::Reply& reply, | 438 const RasterTask::Reply& reply, |
| 426 Task::Set* dependencies) { | 439 Task::Set* dependencies) { |
| 427 return RasterTask(new RasterWorkerPoolTaskImpl(resource, | 440 return RasterTask( |
| 428 picture_pile, | 441 new RasterWorkerPoolTaskImpl(resource, |
| 429 content_rect, | 442 picture_pile, |
| 430 contents_scale, | 443 content_rect, |
| 431 raster_mode, | 444 contents_scale, |
| 432 metadata, | 445 raster_mode, |
| 433 rendering_stats, | 446 is_tile_in_pending_tree_now_bin, |
| 434 reply, | 447 tile_resolution, |
| 435 &dependencies->tasks_)); | 448 layer_id, |
| 449 tile_id, | |
| 450 source_frame_number, | |
| 451 rendering_stats, | |
| 452 reply, | |
| 453 &dependencies->tasks_)); | |
| 436 } | 454 } |
| 437 | 455 |
| 438 // static | 456 // static |
| 439 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 457 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
| 440 skia::LazyPixelRef* pixel_ref, | 458 skia::LazyPixelRef* pixel_ref, |
| 441 int layer_id, | 459 int layer_id, |
| 442 RenderingStatsInstrumentation* stats_instrumentation, | 460 RenderingStatsInstrumentation* stats_instrumentation, |
| 443 const Task::Reply& reply) { | 461 const Task::Reply& reply) { |
| 444 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 462 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
| 445 layer_id, | 463 layer_id, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 516 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", | 534 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", |
| 517 "schedule_raster_tasks_count", schedule_raster_tasks_count); | 535 "schedule_raster_tasks_count", schedule_raster_tasks_count); |
| 518 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); | 536 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); |
| 519 // Call OnRasterTasksFinished() when we've finished running all raster | 537 // Call OnRasterTasksFinished() when we've finished running all raster |
| 520 // tasks needed since last time SetRasterTaskGraph() was called. | 538 // tasks needed since last time SetRasterTaskGraph() was called. |
| 521 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) | 539 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) |
| 522 OnRasterTasksFinished(); | 540 OnRasterTasksFinished(); |
| 523 } | 541 } |
| 524 | 542 |
| 525 } // namespace cc | 543 } // namespace cc |
| OLD | NEW |