| 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 |
| 55 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 36 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| 56 public: | 37 public: |
| 57 RasterWorkerPoolTaskImpl(const Resource* resource, | 38 RasterWorkerPoolTaskImpl(const Resource* resource, |
| 58 PicturePileImpl* picture_pile, | 39 PicturePileImpl* picture_pile, |
| 59 gfx::Rect content_rect, | 40 gfx::Rect content_rect, |
| 60 float contents_scale, | 41 float contents_scale, |
| 61 RasterMode raster_mode, | 42 RasterMode raster_mode, |
| 62 const RasterTaskMetadata& metadata, | 43 bool is_tile_in_pending_tree_now_bin, |
| 44 TileResolution tile_resolution, |
| 45 int layer_id, |
| 46 const void* tile_id, |
| 47 int source_frame_number, |
| 63 RenderingStatsInstrumentation* rendering_stats, | 48 RenderingStatsInstrumentation* rendering_stats, |
| 64 const RasterWorkerPool::RasterTask::Reply& reply, | 49 const RasterWorkerPool::RasterTask::Reply& reply, |
| 65 TaskVector* dependencies) | 50 TaskVector* dependencies) |
| 66 : internal::RasterWorkerPoolTask(resource, dependencies), | 51 : internal::RasterWorkerPoolTask(resource, dependencies), |
| 67 picture_pile_(picture_pile), | 52 picture_pile_(picture_pile), |
| 68 content_rect_(content_rect), | 53 content_rect_(content_rect), |
| 69 contents_scale_(contents_scale), | 54 contents_scale_(contents_scale), |
| 70 raster_mode_(raster_mode), | 55 raster_mode_(raster_mode), |
| 71 metadata_(metadata), | 56 is_tile_in_pending_tree_now_bin_(is_tile_in_pending_tree_now_bin), |
| 57 tile_resolution_(tile_resolution), |
| 58 layer_id_(layer_id), |
| 59 tile_id_(tile_id), |
| 60 source_frame_number_(source_frame_number), |
| 72 rendering_stats_(rendering_stats), | 61 rendering_stats_(rendering_stats), |
| 73 reply_(reply) {} | 62 reply_(reply) {} |
| 74 | 63 |
| 75 void RunAnalysisOnThread(unsigned thread_index) { | 64 void RunAnalysisOnThread(unsigned thread_index) { |
| 76 TRACE_EVENT1("cc", | 65 TRACE_EVENT1("cc", |
| 77 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", | 66 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", |
| 78 "metadata", | 67 "data", |
| 79 TracedValue::FromValue(metadata_.AsValue().release())); | 68 TracedValue::FromValue(DataAsValue().release())); |
| 80 | 69 |
| 81 DCHECK(picture_pile_.get()); | 70 DCHECK(picture_pile_.get()); |
| 82 DCHECK(rendering_stats_); | 71 DCHECK(rendering_stats_); |
| 83 | 72 |
| 84 PicturePileImpl* picture_clone = | 73 PicturePileImpl* picture_clone = |
| 85 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 74 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 86 | 75 |
| 87 DCHECK(picture_clone); | 76 DCHECK(picture_clone); |
| 88 | 77 |
| 89 base::TimeTicks start_time = rendering_stats_->StartRecording(); | 78 base::TimeTicks start_time = rendering_stats_->StartRecording(); |
| 90 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); | 79 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); |
| 91 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); | 80 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); |
| 92 | 81 |
| 93 // Record the solid color prediction. | 82 // Record the solid color prediction. |
| 94 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", | 83 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", |
| 95 analysis_.is_solid_color); | 84 analysis_.is_solid_color); |
| 96 rendering_stats_->AddTileAnalysisResult(duration, | 85 rendering_stats_->AddTileAnalysisResult(duration, |
| 97 analysis_.is_solid_color); | 86 analysis_.is_solid_color); |
| 98 | 87 |
| 99 // Clear the flag if we're not using the estimator. | 88 // Clear the flag if we're not using the estimator. |
| 100 analysis_.is_solid_color &= kUseColorEstimator; | 89 analysis_.is_solid_color &= kUseColorEstimator; |
| 101 } | 90 } |
| 102 | 91 |
| 103 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { | 92 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { |
| 104 TRACE_EVENT2( | 93 TRACE_EVENT2( |
| 105 "cc", | 94 "cc", |
| 106 "RasterWorkerPoolTaskImpl::RunRasterOnThread", | 95 "RasterWorkerPoolTaskImpl::RunRasterOnThread", |
| 107 "metadata", | 96 "data", |
| 108 TracedValue::FromValue(metadata_.AsValue().release()), | 97 TracedValue::FromValue(DataAsValue().release()), |
| 109 "raster_mode", | 98 "raster_mode", |
| 110 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); | 99 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); |
| 111 | 100 |
| 112 devtools_instrumentation::ScopedLayerTask raster_task( | 101 devtools_instrumentation::ScopedLayerTask raster_task( |
| 113 devtools_instrumentation::kRasterTask, metadata_.layer_id); | 102 devtools_instrumentation::kRasterTask, layer_id_); |
| 114 | 103 |
| 115 DCHECK(picture_pile_.get()); | 104 DCHECK(picture_pile_.get()); |
| 116 DCHECK(device); | 105 DCHECK(device); |
| 117 | 106 |
| 118 if (analysis_.is_solid_color) | 107 if (analysis_.is_solid_color) |
| 119 return false; | 108 return false; |
| 120 | 109 |
| 121 PicturePileImpl* picture_clone = | 110 PicturePileImpl* picture_clone = |
| 122 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 111 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 123 | 112 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 141 canvas.setDrawFilter(draw_filter.get()); | 130 canvas.setDrawFilter(draw_filter.get()); |
| 142 | 131 |
| 143 if (rendering_stats_->record_rendering_stats()) { | 132 if (rendering_stats_->record_rendering_stats()) { |
| 144 PicturePileImpl::RasterStats raster_stats; | 133 PicturePileImpl::RasterStats raster_stats; |
| 145 picture_clone->RasterToBitmap( | 134 picture_clone->RasterToBitmap( |
| 146 &canvas, content_rect_, contents_scale_, &raster_stats); | 135 &canvas, content_rect_, contents_scale_, &raster_stats); |
| 147 rendering_stats_->AddRaster( | 136 rendering_stats_->AddRaster( |
| 148 raster_stats.total_rasterize_time, | 137 raster_stats.total_rasterize_time, |
| 149 raster_stats.best_rasterize_time, | 138 raster_stats.best_rasterize_time, |
| 150 raster_stats.total_pixels_rasterized, | 139 raster_stats.total_pixels_rasterized, |
| 151 metadata_.is_tile_in_pending_tree_now_bin); | 140 is_tile_in_pending_tree_now_bin_); |
| 152 | 141 |
| 153 HISTOGRAM_CUSTOM_COUNTS( | 142 HISTOGRAM_CUSTOM_COUNTS( |
| 154 "Renderer4.PictureRasterTimeUS", | 143 "Renderer4.PictureRasterTimeUS", |
| 155 raster_stats.total_rasterize_time.InMicroseconds(), | 144 raster_stats.total_rasterize_time.InMicroseconds(), |
| 156 0, | 145 0, |
| 157 100000, | 146 100000, |
| 158 100); | 147 100); |
| 159 } else { | 148 } else { |
| 160 picture_clone->RasterToBitmap( | 149 picture_clone->RasterToBitmap( |
| 161 &canvas, content_rect_, contents_scale_, NULL); | 150 &canvas, content_rect_, contents_scale_, NULL); |
| 162 } | 151 } |
| 163 return true; | 152 return true; |
| 164 } | 153 } |
| 165 | 154 |
| 166 // Overridden from internal::RasterWorkerPoolTask: | 155 // Overridden from internal::RasterWorkerPoolTask: |
| 167 virtual bool RunOnWorkerThread(SkDevice* device, unsigned thread_index) | 156 virtual bool RunOnWorkerThread(SkDevice* device, unsigned thread_index) |
| 168 OVERRIDE { | 157 OVERRIDE { |
| 169 RunAnalysisOnThread(thread_index); | 158 RunAnalysisOnThread(thread_index); |
| 170 return RunRasterOnThread(device, thread_index); | 159 return RunRasterOnThread(device, thread_index); |
| 171 } | 160 } |
| 172 virtual void CompleteOnOriginThread() OVERRIDE { | 161 virtual void CompleteOnOriginThread() OVERRIDE { |
| 173 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); | 162 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); |
| 174 } | 163 } |
| 175 | 164 |
| 176 protected: | 165 protected: |
| 177 virtual ~RasterWorkerPoolTaskImpl() {} | 166 virtual ~RasterWorkerPoolTaskImpl() {} |
| 178 | 167 |
| 179 private: | 168 private: |
| 169 scoped_ptr<base::Value> DataAsValue() const { |
| 170 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| 171 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); |
| 172 res->SetBoolean("is_tile_in_pending_tree_now_bin", |
| 173 is_tile_in_pending_tree_now_bin_); |
| 174 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); |
| 175 res->SetInteger("source_frame_number", source_frame_number_); |
| 176 res->SetInteger("layer_id", layer_id_); |
| 177 return res.PassAs<base::Value>(); |
| 178 } |
| 179 |
| 180 PicturePileImpl::Analysis analysis_; | 180 PicturePileImpl::Analysis analysis_; |
| 181 scoped_refptr<PicturePileImpl> picture_pile_; | 181 scoped_refptr<PicturePileImpl> picture_pile_; |
| 182 gfx::Rect content_rect_; | 182 gfx::Rect content_rect_; |
| 183 float contents_scale_; | 183 float contents_scale_; |
| 184 RasterMode raster_mode_; | 184 RasterMode raster_mode_; |
| 185 RasterTaskMetadata metadata_; | 185 bool is_tile_in_pending_tree_now_bin_; |
| 186 TileResolution tile_resolution_; |
| 187 int layer_id_; |
| 188 const void* tile_id_; |
| 189 int source_frame_number_; |
| 186 RenderingStatsInstrumentation* rendering_stats_; | 190 RenderingStatsInstrumentation* rendering_stats_; |
| 187 const RasterWorkerPool::RasterTask::Reply reply_; | 191 const RasterWorkerPool::RasterTask::Reply reply_; |
| 188 | 192 |
| 189 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 193 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
| 190 }; | 194 }; |
| 191 | 195 |
| 192 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 196 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 193 public: | 197 public: |
| 194 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, | 198 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, |
| 195 int layer_id, | 199 int layer_id, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 DCHECK(!did_complete_); | 296 DCHECK(!did_complete_); |
| 293 did_complete_ = true; | 297 did_complete_ = true; |
| 294 } | 298 } |
| 295 | 299 |
| 296 bool RasterWorkerPoolTask::HasCompleted() const { | 300 bool RasterWorkerPoolTask::HasCompleted() const { |
| 297 return did_complete_; | 301 return did_complete_; |
| 298 } | 302 } |
| 299 | 303 |
| 300 } // namespace internal | 304 } // namespace internal |
| 301 | 305 |
| 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() { | 306 RasterWorkerPool::Task::Set::Set() { |
| 313 } | 307 } |
| 314 | 308 |
| 315 RasterWorkerPool::Task::Set::~Set() { | 309 RasterWorkerPool::Task::Set::~Set() { |
| 316 } | 310 } |
| 317 | 311 |
| 318 void RasterWorkerPool::Task::Set::Insert(const Task& task) { | 312 void RasterWorkerPool::Task::Set::Insert(const Task& task) { |
| 319 DCHECK(!task.is_null()); | 313 DCHECK(!task.is_null()); |
| 320 tasks_.push_back(task.internal_); | 314 tasks_.push_back(task.internal_); |
| 321 } | 315 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 graph_.set(raster_task, raster_node.Pass()); | 407 graph_.set(raster_task, raster_node.Pass()); |
| 414 } | 408 } |
| 415 | 409 |
| 416 // static | 410 // static |
| 417 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 411 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
| 418 const Resource* resource, | 412 const Resource* resource, |
| 419 PicturePileImpl* picture_pile, | 413 PicturePileImpl* picture_pile, |
| 420 gfx::Rect content_rect, | 414 gfx::Rect content_rect, |
| 421 float contents_scale, | 415 float contents_scale, |
| 422 RasterMode raster_mode, | 416 RasterMode raster_mode, |
| 423 const RasterTaskMetadata& metadata, | 417 bool is_tile_in_pending_tree_now_bin, |
| 418 TileResolution tile_resolution, |
| 419 int layer_id, |
| 420 const void* tile_id, |
| 421 int source_frame_number, |
| 424 RenderingStatsInstrumentation* rendering_stats, | 422 RenderingStatsInstrumentation* rendering_stats, |
| 425 const RasterTask::Reply& reply, | 423 const RasterTask::Reply& reply, |
| 426 Task::Set* dependencies) { | 424 Task::Set* dependencies) { |
| 427 return RasterTask(new RasterWorkerPoolTaskImpl(resource, | 425 return RasterTask( |
| 428 picture_pile, | 426 new RasterWorkerPoolTaskImpl(resource, |
| 429 content_rect, | 427 picture_pile, |
| 430 contents_scale, | 428 content_rect, |
| 431 raster_mode, | 429 contents_scale, |
| 432 metadata, | 430 raster_mode, |
| 433 rendering_stats, | 431 is_tile_in_pending_tree_now_bin, |
| 434 reply, | 432 tile_resolution, |
| 435 &dependencies->tasks_)); | 433 layer_id, |
| 434 tile_id, |
| 435 source_frame_number, |
| 436 rendering_stats, |
| 437 reply, |
| 438 &dependencies->tasks_)); |
| 436 } | 439 } |
| 437 | 440 |
| 438 // static | 441 // static |
| 439 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 442 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
| 440 skia::LazyPixelRef* pixel_ref, | 443 skia::LazyPixelRef* pixel_ref, |
| 441 int layer_id, | 444 int layer_id, |
| 442 RenderingStatsInstrumentation* stats_instrumentation, | 445 RenderingStatsInstrumentation* stats_instrumentation, |
| 443 const Task::Reply& reply) { | 446 const Task::Reply& reply) { |
| 444 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 447 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
| 445 layer_id, | 448 layer_id, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", | 519 TRACE_EVENT1("cc", "RasterWorkerPool::OnRasterFinished", |
| 517 "schedule_raster_tasks_count", schedule_raster_tasks_count); | 520 "schedule_raster_tasks_count", schedule_raster_tasks_count); |
| 518 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); | 521 DCHECK_GE(schedule_raster_tasks_count_, schedule_raster_tasks_count); |
| 519 // Call OnRasterTasksFinished() when we've finished running all raster | 522 // Call OnRasterTasksFinished() when we've finished running all raster |
| 520 // tasks needed since last time SetRasterTaskGraph() was called. | 523 // tasks needed since last time SetRasterTaskGraph() was called. |
| 521 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) | 524 if (schedule_raster_tasks_count_ == schedule_raster_tasks_count) |
| 522 OnRasterTasksFinished(); | 525 OnRasterTasksFinished(); |
| 523 } | 526 } |
| 524 | 527 |
| 525 } // namespace cc | 528 } // namespace cc |
| OLD | NEW |