Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: cc/resources/raster_worker_pool.cc

Issue 17625002: cc: Eliminate tile.h's dependency on tile_manager.h (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reveman's review Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698