| 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" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 }; | 30 }; |
| 31 | 31 |
| 32 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { | 32 class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
| 33 public: | 33 public: |
| 34 RasterWorkerPoolTaskImpl(const Resource* resource, | 34 RasterWorkerPoolTaskImpl(const Resource* resource, |
| 35 PicturePileImpl* picture_pile, | 35 PicturePileImpl* picture_pile, |
| 36 gfx::Rect content_rect, | 36 gfx::Rect content_rect, |
| 37 float contents_scale, | 37 float contents_scale, |
| 38 RasterMode raster_mode, | 38 RasterMode raster_mode, |
| 39 bool use_color_estimator, | 39 bool use_color_estimator, |
| 40 const RasterTaskMetadata& metadata, | 40 bool is_tile_in_pending_tree_now_bin, |
| 41 TileResolution tile_resolution, |
| 42 int layer_id, |
| 43 const void* tile_id, |
| 44 int source_frame_number, |
| 41 RenderingStatsInstrumentation* rendering_stats, | 45 RenderingStatsInstrumentation* rendering_stats, |
| 42 const RasterWorkerPool::RasterTask::Reply& reply, | 46 const RasterWorkerPool::RasterTask::Reply& reply, |
| 43 TaskVector* dependencies) | 47 TaskVector* dependencies) |
| 44 : internal::RasterWorkerPoolTask(resource, dependencies), | 48 : internal::RasterWorkerPoolTask(resource, dependencies), |
| 45 picture_pile_(picture_pile), | 49 picture_pile_(picture_pile), |
| 46 content_rect_(content_rect), | 50 content_rect_(content_rect), |
| 47 contents_scale_(contents_scale), | 51 contents_scale_(contents_scale), |
| 48 raster_mode_(raster_mode), | 52 raster_mode_(raster_mode), |
| 49 use_color_estimator_(use_color_estimator), | 53 use_color_estimator_(use_color_estimator), |
| 50 metadata_(metadata), | 54 is_tile_in_pending_tree_now_bin_(is_tile_in_pending_tree_now_bin), |
| 55 tile_resolution_(tile_resolution), |
| 56 layer_id_(layer_id), |
| 57 tile_id_(tile_id), |
| 58 source_frame_number_(source_frame_number), |
| 51 rendering_stats_(rendering_stats), | 59 rendering_stats_(rendering_stats), |
| 52 reply_(reply) {} | 60 reply_(reply) {} |
| 53 | 61 |
| 54 void RunAnalysisOnThread(unsigned thread_index) { | 62 void RunAnalysisOnThread(unsigned thread_index) { |
| 55 TRACE_EVENT1("cc", | 63 TRACE_EVENT1("cc", |
| 56 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", | 64 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", |
| 57 "metadata", | 65 "data", |
| 58 TracedValue::FromValue(metadata_.AsValue().release())); | 66 TracedValue::FromValue(DataAsValue().release())); |
| 59 | 67 |
| 60 DCHECK(picture_pile_.get()); | 68 DCHECK(picture_pile_.get()); |
| 61 DCHECK(rendering_stats_); | 69 DCHECK(rendering_stats_); |
| 62 | 70 |
| 63 PicturePileImpl* picture_clone = | 71 PicturePileImpl* picture_clone = |
| 64 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 72 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 65 | 73 |
| 66 DCHECK(picture_clone); | 74 DCHECK(picture_clone); |
| 67 | 75 |
| 68 base::TimeTicks start_time = rendering_stats_->StartRecording(); | 76 base::TimeTicks start_time = rendering_stats_->StartRecording(); |
| 69 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); | 77 picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); |
| 70 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); | 78 base::TimeDelta duration = rendering_stats_->EndRecording(start_time); |
| 71 | 79 |
| 72 // Record the solid color prediction. | 80 // Record the solid color prediction. |
| 73 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", | 81 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", |
| 74 analysis_.is_solid_color); | 82 analysis_.is_solid_color); |
| 75 rendering_stats_->AddTileAnalysisResult(duration, | 83 rendering_stats_->AddTileAnalysisResult(duration, |
| 76 analysis_.is_solid_color); | 84 analysis_.is_solid_color); |
| 77 | 85 |
| 78 // Clear the flag if we're not using the estimator. | 86 // Clear the flag if we're not using the estimator. |
| 79 analysis_.is_solid_color &= use_color_estimator_; | 87 analysis_.is_solid_color &= use_color_estimator_; |
| 80 } | 88 } |
| 81 | 89 |
| 82 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { | 90 bool RunRasterOnThread(SkDevice* device, unsigned thread_index) { |
| 83 TRACE_EVENT1( | 91 TRACE_EVENT2( |
| 84 "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread", | 92 "cc", |
| 85 "metadata", TracedValue::FromValue(metadata_.AsValue().release())); | 93 "RasterWorkerPoolTaskImpl::RunRasterOnThread", |
| 94 "data", |
| 95 TracedValue::FromValue(DataAsValue().release()), |
| 96 "raster_mode", |
| 97 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); |
| 98 |
| 86 devtools_instrumentation::ScopedLayerTask raster_task( | 99 devtools_instrumentation::ScopedLayerTask raster_task( |
| 87 devtools_instrumentation::kRasterTask, metadata_.layer_id); | 100 devtools_instrumentation::kRasterTask, layer_id_); |
| 88 | 101 |
| 89 DCHECK(picture_pile_.get()); | 102 DCHECK(picture_pile_.get()); |
| 90 DCHECK(device); | 103 DCHECK(device); |
| 91 | 104 |
| 92 if (analysis_.is_solid_color) | 105 if (analysis_.is_solid_color) |
| 93 return false; | 106 return false; |
| 94 | 107 |
| 95 PicturePileImpl* picture_clone = | 108 PicturePileImpl* picture_clone = |
| 96 picture_pile_->GetCloneForDrawingOnThread(thread_index); | 109 picture_pile_->GetCloneForDrawingOnThread(thread_index); |
| 97 | 110 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 115 canvas.setDrawFilter(draw_filter.get()); | 128 canvas.setDrawFilter(draw_filter.get()); |
| 116 | 129 |
| 117 if (rendering_stats_->record_rendering_stats()) { | 130 if (rendering_stats_->record_rendering_stats()) { |
| 118 PicturePileImpl::RasterStats raster_stats; | 131 PicturePileImpl::RasterStats raster_stats; |
| 119 picture_clone->RasterToBitmap( | 132 picture_clone->RasterToBitmap( |
| 120 &canvas, content_rect_, contents_scale_, &raster_stats); | 133 &canvas, content_rect_, contents_scale_, &raster_stats); |
| 121 rendering_stats_->AddRaster( | 134 rendering_stats_->AddRaster( |
| 122 raster_stats.total_rasterize_time, | 135 raster_stats.total_rasterize_time, |
| 123 raster_stats.best_rasterize_time, | 136 raster_stats.best_rasterize_time, |
| 124 raster_stats.total_pixels_rasterized, | 137 raster_stats.total_pixels_rasterized, |
| 125 metadata_.is_tile_in_pending_tree_now_bin); | 138 is_tile_in_pending_tree_now_bin_); |
| 126 | 139 |
| 127 HISTOGRAM_CUSTOM_COUNTS( | 140 HISTOGRAM_CUSTOM_COUNTS( |
| 128 "Renderer4.PictureRasterTimeUS", | 141 "Renderer4.PictureRasterTimeUS", |
| 129 raster_stats.total_rasterize_time.InMicroseconds(), | 142 raster_stats.total_rasterize_time.InMicroseconds(), |
| 130 0, | 143 0, |
| 131 100000, | 144 100000, |
| 132 100); | 145 100); |
| 133 } else { | 146 } else { |
| 134 picture_clone->RasterToBitmap( | 147 picture_clone->RasterToBitmap( |
| 135 &canvas, content_rect_, contents_scale_, NULL); | 148 &canvas, content_rect_, contents_scale_, NULL); |
| 136 } | 149 } |
| 137 return true; | 150 return true; |
| 138 } | 151 } |
| 139 | 152 |
| 140 // Overridden from internal::RasterWorkerPoolTask: | 153 // Overridden from internal::RasterWorkerPoolTask: |
| 141 virtual bool RunOnThread(SkDevice* device, unsigned thread_index) OVERRIDE { | 154 virtual bool RunOnThread(SkDevice* device, unsigned thread_index) OVERRIDE { |
| 142 RunAnalysisOnThread(thread_index); | 155 RunAnalysisOnThread(thread_index); |
| 143 return RunRasterOnThread(device, thread_index); | 156 return RunRasterOnThread(device, thread_index); |
| 144 } | 157 } |
| 145 virtual void DispatchCompletionCallback() OVERRIDE { | 158 virtual void DispatchCompletionCallback() OVERRIDE { |
| 146 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); | 159 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); |
| 147 } | 160 } |
| 148 | 161 |
| 149 protected: | 162 protected: |
| 150 virtual ~RasterWorkerPoolTaskImpl() {} | 163 virtual ~RasterWorkerPoolTaskImpl() {} |
| 151 | 164 |
| 152 private: | 165 private: |
| 166 scoped_ptr<base::Value> DataAsValue() const { |
| 167 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| 168 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); |
| 169 res->SetBoolean("is_tile_in_pending_tree_now_bin", |
| 170 is_tile_in_pending_tree_now_bin_); |
| 171 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); |
| 172 res->SetInteger("source_frame_number", source_frame_number_); |
| 173 res->SetInteger("layer_id", layer_id_); |
| 174 return res.PassAs<base::Value>(); |
| 175 } |
| 176 |
| 153 PicturePileImpl::Analysis analysis_; | 177 PicturePileImpl::Analysis analysis_; |
| 154 scoped_refptr<PicturePileImpl> picture_pile_; | 178 scoped_refptr<PicturePileImpl> picture_pile_; |
| 155 gfx::Rect content_rect_; | 179 gfx::Rect content_rect_; |
| 156 float contents_scale_; | 180 float contents_scale_; |
| 157 RasterMode raster_mode_; | 181 RasterMode raster_mode_; |
| 158 bool use_color_estimator_; | 182 bool use_color_estimator_; |
| 159 RasterTaskMetadata metadata_; | 183 bool is_tile_in_pending_tree_now_bin_; |
| 184 TileResolution tile_resolution_; |
| 185 int layer_id_; |
| 186 const void* tile_id_; |
| 187 int source_frame_number_; |
| 160 RenderingStatsInstrumentation* rendering_stats_; | 188 RenderingStatsInstrumentation* rendering_stats_; |
| 161 const RasterWorkerPool::RasterTask::Reply reply_; | 189 const RasterWorkerPool::RasterTask::Reply reply_; |
| 162 | 190 |
| 163 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); | 191 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); |
| 164 }; | 192 }; |
| 165 | 193 |
| 166 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 194 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| 167 public: | 195 public: |
| 168 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, | 196 ImageDecodeWorkerPoolTaskImpl(skia::LazyPixelRef* pixel_ref, |
| 169 int layer_id, | 197 int layer_id, |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 DCHECK(!did_complete_); | 298 DCHECK(!did_complete_); |
| 271 did_complete_ = true; | 299 did_complete_ = true; |
| 272 } | 300 } |
| 273 | 301 |
| 274 bool RasterWorkerPoolTask::HasCompleted() const { | 302 bool RasterWorkerPoolTask::HasCompleted() const { |
| 275 return did_complete_; | 303 return did_complete_; |
| 276 } | 304 } |
| 277 | 305 |
| 278 } // namespace internal | 306 } // namespace internal |
| 279 | 307 |
| 280 scoped_ptr<base::Value> RasterTaskMetadata::AsValue() const { | |
| 281 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | |
| 282 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release()); | |
| 283 res->SetBoolean("is_tile_in_pending_tree_now_bin", | |
| 284 is_tile_in_pending_tree_now_bin); | |
| 285 res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); | |
| 286 res->SetInteger("source_frame_number", source_frame_number); | |
| 287 return res.PassAs<base::Value>(); | |
| 288 } | |
| 289 | |
| 290 RasterWorkerPool::Task::Set::Set() { | 308 RasterWorkerPool::Task::Set::Set() { |
| 291 } | 309 } |
| 292 | 310 |
| 293 RasterWorkerPool::Task::Set::~Set() { | 311 RasterWorkerPool::Task::Set::~Set() { |
| 294 } | 312 } |
| 295 | 313 |
| 296 void RasterWorkerPool::Task::Set::Insert(const Task& task) { | 314 void RasterWorkerPool::Task::Set::Insert(const Task& task) { |
| 297 DCHECK(!task.is_null()); | 315 DCHECK(!task.is_null()); |
| 298 tasks_.push_back(task.internal_); | 316 tasks_.push_back(task.internal_); |
| 299 } | 317 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 } | 360 } |
| 343 | 361 |
| 344 // static | 362 // static |
| 345 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 363 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
| 346 const Resource* resource, | 364 const Resource* resource, |
| 347 PicturePileImpl* picture_pile, | 365 PicturePileImpl* picture_pile, |
| 348 gfx::Rect content_rect, | 366 gfx::Rect content_rect, |
| 349 float contents_scale, | 367 float contents_scale, |
| 350 RasterMode raster_mode, | 368 RasterMode raster_mode, |
| 351 bool use_color_estimator, | 369 bool use_color_estimator, |
| 352 const RasterTaskMetadata& metadata, | 370 bool is_tile_in_pending_tree_now_bin, |
| 371 TileResolution tile_resolution, |
| 372 int layer_id, |
| 373 const void* tile_id, |
| 374 int source_frame_number, |
| 353 RenderingStatsInstrumentation* rendering_stats, | 375 RenderingStatsInstrumentation* rendering_stats, |
| 354 const RasterTask::Reply& reply, | 376 const RasterTask::Reply& reply, |
| 355 Task::Set* dependencies) { | 377 Task::Set* dependencies) { |
| 356 return RasterTask(new RasterWorkerPoolTaskImpl(resource, | 378 return RasterTask( |
| 357 picture_pile, | 379 new RasterWorkerPoolTaskImpl(resource, |
| 358 content_rect, | 380 picture_pile, |
| 359 contents_scale, | 381 content_rect, |
| 360 raster_mode, | 382 contents_scale, |
| 383 raster_mode, |
| 361 use_color_estimator, | 384 use_color_estimator, |
| 362 metadata, | 385 is_tile_in_pending_tree_now_bin, |
| 363 rendering_stats, | 386 tile_resolution, |
| 364 reply, | 387 layer_id, |
| 365 &dependencies->tasks_)); | 388 tile_id, |
| 389 source_frame_number, |
| 390 rendering_stats, |
| 391 reply, |
| 392 &dependencies->tasks_)); |
| 366 } | 393 } |
| 367 | 394 |
| 368 // static | 395 // static |
| 369 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 396 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
| 370 skia::LazyPixelRef* pixel_ref, | 397 skia::LazyPixelRef* pixel_ref, |
| 371 int layer_id, | 398 int layer_id, |
| 372 RenderingStatsInstrumentation* stats_instrumentation, | 399 RenderingStatsInstrumentation* stats_instrumentation, |
| 373 const Task::Reply& reply) { | 400 const Task::Reply& reply) { |
| 374 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 401 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
| 375 layer_id, | 402 layer_id, |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 | 530 |
| 504 internal::GraphNode* decode_node = CreateGraphNodeForTask( | 531 internal::GraphNode* decode_node = CreateGraphNodeForTask( |
| 505 decode_task, priority, graph); | 532 decode_task, priority, graph); |
| 506 decode_node->add_dependent(raster_node); | 533 decode_node->add_dependent(raster_node); |
| 507 } | 534 } |
| 508 | 535 |
| 509 return raster_node; | 536 return raster_node; |
| 510 } | 537 } |
| 511 | 538 |
| 512 } // namespace cc | 539 } // namespace cc |
| OLD | NEW |