| 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 |