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

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