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

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

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix typo Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_delegate.h » ('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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event_synthetic_delay.h" 9 #include "base/debug/trace_event_synthetic_delay.h"
10 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 public: 71 public:
72 RasterWorkerPoolTaskImpl(const Resource* resource, 72 RasterWorkerPoolTaskImpl(const Resource* resource,
73 PicturePileImpl* picture_pile, 73 PicturePileImpl* picture_pile,
74 const gfx::Rect& content_rect, 74 const gfx::Rect& content_rect,
75 float contents_scale, 75 float contents_scale,
76 RasterMode raster_mode, 76 RasterMode raster_mode,
77 TileResolution tile_resolution, 77 TileResolution tile_resolution,
78 int layer_id, 78 int layer_id,
79 const void* tile_id, 79 const void* tile_id,
80 int source_frame_number, 80 int source_frame_number,
81 bool use_gpu_rasterization,
82 RenderingStatsInstrumentation* rendering_stats, 81 RenderingStatsInstrumentation* rendering_stats,
83 const RasterWorkerPool::RasterTask::Reply& reply, 82 const RasterWorkerPool::RasterTask::Reply& reply,
84 internal::Task::Vector* dependencies) 83 internal::WorkerPoolTask::Vector* dependencies,
85 : internal::RasterWorkerPoolTask(resource, 84 ContextProvider* context_provider)
86 dependencies, 85 : internal::RasterWorkerPoolTask(resource, dependencies),
87 use_gpu_rasterization),
88 picture_pile_(picture_pile), 86 picture_pile_(picture_pile),
89 content_rect_(content_rect), 87 content_rect_(content_rect),
90 contents_scale_(contents_scale), 88 contents_scale_(contents_scale),
91 raster_mode_(raster_mode), 89 raster_mode_(raster_mode),
92 tile_resolution_(tile_resolution), 90 tile_resolution_(tile_resolution),
93 layer_id_(layer_id), 91 layer_id_(layer_id),
94 tile_id_(tile_id), 92 tile_id_(tile_id),
95 source_frame_number_(source_frame_number), 93 source_frame_number_(source_frame_number),
96 rendering_stats_(rendering_stats), 94 rendering_stats_(rendering_stats),
97 reply_(reply), 95 reply_(reply),
96 context_provider_(context_provider),
98 canvas_(NULL) {} 97 canvas_(NULL) {}
99 98
100 void RunAnalysisOnThread(unsigned thread_index) { 99 // Overridden from internal::Task:
101 TRACE_EVENT1("cc", 100 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
102 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", 101 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::RunOnWorkerThread");
103 "data",
104 TracedValue::FromValue(DataAsValue().release()));
105 102
106 DCHECK(picture_pile_.get()); 103 DCHECK(picture_pile_);
107 DCHECK(rendering_stats_); 104 Analyze(picture_pile_->GetCloneForDrawingOnThread(thread_index));
108 105 if (!canvas_ || analysis_.is_solid_color)
109 PicturePileImpl* picture_clone = 106 return;
110 picture_pile_->GetCloneForDrawingOnThread(thread_index);
111
112 DCHECK(picture_clone);
113
114 picture_clone->AnalyzeInRect(
115 content_rect_, contents_scale_, &analysis_, rendering_stats_);
116
117 // Record the solid color prediction.
118 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
119 analysis_.is_solid_color);
120
121 // Clear the flag if we're not using the estimator.
122 analysis_.is_solid_color &= kUseColorEstimator;
123 }
124
125 void RunRasterOnThread(unsigned thread_index) {
126 TRACE_EVENT2(
127 "cc",
128 "RasterWorkerPoolTaskImpl::RunRasterOnThread",
129 "data",
130 TracedValue::FromValue(DataAsValue().release()),
131 "raster_mode",
132 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release()));
133
134 devtools_instrumentation::ScopedLayerTask raster_task(
135 devtools_instrumentation::kRasterTask, layer_id_);
136
137 DCHECK(picture_pile_.get());
138 Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index)); 107 Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index));
139 } 108 }
140 109
141 // Overridden from internal::Task:
142 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
143 // TODO(alokp): For now run-on-worker-thread implies software rasterization.
144 DCHECK(!use_gpu_rasterization());
145 RunAnalysisOnThread(thread_index);
146 if (canvas_ && !analysis_.is_solid_color)
147 RunRasterOnThread(thread_index);
148 }
149
150 // Overridden from internal::WorkerPoolTask: 110 // Overridden from internal::WorkerPoolTask:
151 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 111 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
152 OVERRIDE { 112 OVERRIDE {
153 DCHECK(!canvas_); 113 DCHECK(!canvas_);
154 canvas_ = client->AcquireCanvasForRaster(this); 114 canvas_ = client->AcquireCanvasForRaster(this);
155 } 115 }
116 virtual void RunOnOriginThread() OVERRIDE {
117 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::RunOnOriginThread");
118
119 Analyze(picture_pile_);
vangelis 2014/02/18 22:25:29 I think the Analysis is an overkill for ganesh mod
120 if (!canvas_ || analysis_.is_solid_color)
121 return;
122 // TODO(alokp): Use a trace macro to push/pop markers.
123 // Using push/pop functions directly incurs cost to evaluate function
124 // arguments even when tracing is disabled.
125 DCHECK(context_provider_);
126 context_provider_->ContextGL()->PushGroupMarkerEXT(
127 0,
128 base::StringPrintf(
129 "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_)
130 .c_str());
131 Raster(picture_pile_);
132 context_provider_->ContextGL()->PopGroupMarkerEXT();
133 }
156 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 134 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
157 OVERRIDE { 135 OVERRIDE {
158 canvas_ = NULL; 136 canvas_ = NULL;
159 client->OnRasterCompleted(this, analysis_); 137 client->OnRasterCompleted(this, analysis_);
160 } 138 }
161 virtual void RunReplyOnOriginThread() OVERRIDE { 139 virtual void RunReplyOnOriginThread() OVERRIDE {
162 DCHECK(!canvas_); 140 DCHECK(!canvas_);
163 reply_.Run(analysis_, !HasFinishedRunning()); 141 reply_.Run(analysis_, !HasFinishedRunning());
164 } 142 }
165 143
166 // Overridden from internal::RasterWorkerPoolTask:
167 virtual void RunOnOriginThread(ResourceProvider* resource_provider,
168 ContextProvider* context_provider) OVERRIDE {
169 // TODO(alokp): Use a trace macro to push/pop markers.
170 // Using push/pop functions directly incurs cost to evaluate function
171 // arguments even when tracing is disabled.
172 context_provider->ContextGL()->PushGroupMarkerEXT(
173 0,
174 base::StringPrintf(
175 "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_)
176 .c_str());
177 // TODO(alokp): For now run-on-origin-thread implies gpu rasterization.
178 DCHECK(use_gpu_rasterization());
179 Raster(picture_pile_);
180 context_provider->ContextGL()->PopGroupMarkerEXT();
181 }
182
183 protected: 144 protected:
184 virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!canvas_); } 145 virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!canvas_); }
185 146
186 private: 147 private:
187 scoped_ptr<base::Value> DataAsValue() const { 148 scoped_ptr<base::Value> DataAsValue() const {
188 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); 149 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
189 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); 150 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release());
190 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); 151 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release());
191 res->SetInteger("source_frame_number", source_frame_number_); 152 res->SetInteger("source_frame_number", source_frame_number_);
192 res->SetInteger("layer_id", layer_id_); 153 res->SetInteger("layer_id", layer_id_);
193 return res.PassAs<base::Value>(); 154 return res.PassAs<base::Value>();
194 } 155 }
195 156
157 void Analyze(PicturePileImpl* picture_pile) {
158 TRACE_EVENT1("cc",
159 "RasterWorkerPoolTaskImpl::Analyze",
160 "data",
161 TracedValue::FromValue(DataAsValue().release()));
162
163 DCHECK(picture_pile);
164
165 picture_pile->AnalyzeInRect(
166 content_rect_, contents_scale_, &analysis_, rendering_stats_);
167
168 // Record the solid color prediction.
169 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
170 analysis_.is_solid_color);
171
172 // Clear the flag if we're not using the estimator.
173 analysis_.is_solid_color &= kUseColorEstimator;
174 }
175
196 void Raster(PicturePileImpl* picture_pile) { 176 void Raster(PicturePileImpl* picture_pile) {
177 TRACE_EVENT2(
178 "cc",
179 "RasterWorkerPoolTaskImpl::Raster",
180 "data",
181 TracedValue::FromValue(DataAsValue().release()),
182 "raster_mode",
183 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release()));
184
185 devtools_instrumentation::ScopedLayerTask raster_task(
186 devtools_instrumentation::kRasterTask, layer_id_);
187
197 skia::RefPtr<SkDrawFilter> draw_filter; 188 skia::RefPtr<SkDrawFilter> draw_filter;
198 switch (raster_mode_) { 189 switch (raster_mode_) {
199 case LOW_QUALITY_RASTER_MODE: 190 case LOW_QUALITY_RASTER_MODE:
200 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); 191 draw_filter = skia::AdoptRef(new skia::PaintSimplifier);
201 break; 192 break;
202 case HIGH_QUALITY_NO_LCD_RASTER_MODE: 193 case HIGH_QUALITY_NO_LCD_RASTER_MODE:
203 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); 194 draw_filter = skia::AdoptRef(new DisableLCDTextFilter);
204 break; 195 break;
205 case HIGH_QUALITY_RASTER_MODE: 196 case HIGH_QUALITY_RASTER_MODE:
206 break; 197 break;
207 case NUM_RASTER_MODES: 198 case NUM_RASTER_MODES:
208 default: 199 default:
209 NOTREACHED(); 200 NOTREACHED();
210 } 201 }
211 canvas_->setDrawFilter(draw_filter.get()); 202 canvas_->setDrawFilter(draw_filter.get());
212 203
213 base::TimeDelta prev_rasterize_time = 204 base::TimeDelta prev_rasterize_time =
214 rendering_stats_->impl_thread_rendering_stats().rasterize_time; 205 rendering_stats_->impl_thread_rendering_stats().rasterize_time;
215 206
216 // Only record rasterization time for highres tiles, because 207 // Only record rasterization time for highres tiles, because
217 // lowres tiles are not required for activation and therefore 208 // lowres tiles are not required for activation and therefore
218 // introduce noise in the measurement (sometimes they get rasterized 209 // introduce noise in the measurement (sometimes they get rasterized
219 // before we draw and sometimes they aren't) 210 // before we draw and sometimes they aren't)
220 RenderingStatsInstrumentation* stats = 211 RenderingStatsInstrumentation* stats =
221 tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL; 212 tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL;
213 DCHECK(picture_pile);
222 picture_pile->RasterToBitmap( 214 picture_pile->RasterToBitmap(
223 canvas_, content_rect_, contents_scale_, stats); 215 canvas_, content_rect_, contents_scale_, stats);
224 216
225 if (rendering_stats_->record_rendering_stats()) { 217 if (rendering_stats_->record_rendering_stats()) {
226 base::TimeDelta current_rasterize_time = 218 base::TimeDelta current_rasterize_time =
227 rendering_stats_->impl_thread_rendering_stats().rasterize_time; 219 rendering_stats_->impl_thread_rendering_stats().rasterize_time;
228 HISTOGRAM_CUSTOM_COUNTS( 220 HISTOGRAM_CUSTOM_COUNTS(
229 "Renderer4.PictureRasterTimeUS", 221 "Renderer4.PictureRasterTimeUS",
230 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), 222 (current_rasterize_time - prev_rasterize_time).InMicroseconds(),
231 0, 223 0,
232 100000, 224 100000,
233 100); 225 100);
234 } 226 }
235 } 227 }
236 228
237 PicturePileImpl::Analysis analysis_; 229 PicturePileImpl::Analysis analysis_;
238 scoped_refptr<PicturePileImpl> picture_pile_; 230 scoped_refptr<PicturePileImpl> picture_pile_;
239 gfx::Rect content_rect_; 231 gfx::Rect content_rect_;
240 float contents_scale_; 232 float contents_scale_;
241 RasterMode raster_mode_; 233 RasterMode raster_mode_;
242 TileResolution tile_resolution_; 234 TileResolution tile_resolution_;
243 int layer_id_; 235 int layer_id_;
244 const void* tile_id_; 236 const void* tile_id_;
245 int source_frame_number_; 237 int source_frame_number_;
246 RenderingStatsInstrumentation* rendering_stats_; 238 RenderingStatsInstrumentation* rendering_stats_;
247 const RasterWorkerPool::RasterTask::Reply reply_; 239 const RasterWorkerPool::RasterTask::Reply reply_;
240 ContextProvider* context_provider_;
248 SkCanvas* canvas_; 241 SkCanvas* canvas_;
249 242
250 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); 243 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl);
251 }; 244 };
252 245
253 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { 246 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
254 public: 247 public:
255 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, 248 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref,
256 int layer_id, 249 int layer_id,
257 RenderingStatsInstrumentation* rendering_stats, 250 RenderingStatsInstrumentation* rendering_stats,
258 const RasterWorkerPool::Task::Reply& reply) 251 const RasterWorkerPool::Task::Reply& reply)
259 : pixel_ref_(skia::SharePtr(pixel_ref)), 252 : pixel_ref_(skia::SharePtr(pixel_ref)),
260 layer_id_(layer_id), 253 layer_id_(layer_id),
261 rendering_stats_(rendering_stats), 254 rendering_stats_(rendering_stats),
262 reply_(reply) {} 255 reply_(reply) {}
263 256
264 // Overridden from internal::Task: 257 // Overridden from internal::Task:
265 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 258 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
266 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread"); 259 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnWorkerThread");
267 devtools_instrumentation::ScopedImageDecodeTask image_decode_task( 260 Decode();
268 pixel_ref_.get());
269 // This will cause the image referred to by pixel ref to be decoded.
270 pixel_ref_->lockPixels();
271 pixel_ref_->unlockPixels();
272 } 261 }
273 262
274 // Overridden from internal::WorkerPoolTask: 263 // Overridden from internal::WorkerPoolTask:
275 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 264 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
276 OVERRIDE {} 265 OVERRIDE {}
266 virtual void RunOnOriginThread() OVERRIDE {
267 TRACE_EVENT0("cc", "ImageDecodeWorkerPoolTaskImpl::RunOnOriginThread");
268 Decode();
269 }
277 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 270 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
278 OVERRIDE { 271 OVERRIDE {
279 client->OnImageDecodeCompleted(this); 272 client->OnImageDecodeCompleted(this);
280 } 273 }
281 virtual void RunReplyOnOriginThread() OVERRIDE { 274 virtual void RunReplyOnOriginThread() OVERRIDE {
282 reply_.Run(!HasFinishedRunning()); 275 reply_.Run(!HasFinishedRunning());
283 } 276 }
284 277
285 protected: 278 protected:
286 virtual ~ImageDecodeWorkerPoolTaskImpl() {} 279 virtual ~ImageDecodeWorkerPoolTaskImpl() {}
287 280
288 private: 281 private:
282 void Decode() {
283 devtools_instrumentation::ScopedImageDecodeTask image_decode_task(
284 pixel_ref_.get());
285 // This will cause the image referred to by pixel ref to be decoded.
286 pixel_ref_->lockPixels();
287 pixel_ref_->unlockPixels();
288 }
289
289 skia::RefPtr<SkPixelRef> pixel_ref_; 290 skia::RefPtr<SkPixelRef> pixel_ref_;
290 int layer_id_; 291 int layer_id_;
291 RenderingStatsInstrumentation* rendering_stats_; 292 RenderingStatsInstrumentation* rendering_stats_;
292 const RasterWorkerPool::Task::Reply reply_; 293 const RasterWorkerPool::Task::Reply reply_;
293 294
294 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl); 295 DISALLOW_COPY_AND_ASSIGN(ImageDecodeWorkerPoolTaskImpl);
295 }; 296 };
296 297
297 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { 298 class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask {
298 public: 299 public:
299 typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback; 300 typedef base::Callback<void(const internal::WorkerPoolTask* source)> Callback;
300 301
301 explicit RasterFinishedWorkerPoolTaskImpl( 302 explicit RasterFinishedWorkerPoolTaskImpl(
302 const Callback& on_raster_finished_callback) 303 const Callback& on_raster_finished_callback)
303 : origin_loop_(base::MessageLoopProxy::current().get()), 304 : origin_loop_(base::MessageLoopProxy::current().get()),
304 on_raster_finished_callback_(on_raster_finished_callback) {} 305 on_raster_finished_callback_(on_raster_finished_callback) {}
305 306
306 // Overridden from internal::Task: 307 // Overridden from internal::Task:
307 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 308 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
308 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); 309 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread");
309 origin_loop_->PostTask( 310 RasterFinished();
310 FROM_HERE,
311 base::Bind(&RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread, this));
312 } 311 }
313 312
314 // Overridden from internal::WorkerPoolTask: 313 // Overridden from internal::WorkerPoolTask:
315 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 314 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
316 OVERRIDE {} 315 OVERRIDE {}
316 virtual void RunOnOriginThread() OVERRIDE {
317 TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread");
318 RasterFinished();
319 }
317 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 320 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
318 OVERRIDE {} 321 OVERRIDE {}
319 virtual void RunReplyOnOriginThread() OVERRIDE {} 322 virtual void RunReplyOnOriginThread() OVERRIDE {}
320 323
321 protected: 324 protected:
322 virtual ~RasterFinishedWorkerPoolTaskImpl() {} 325 virtual ~RasterFinishedWorkerPoolTaskImpl() {}
323 326
327 void RasterFinished() {
328 origin_loop_->PostTask(
329 FROM_HERE,
330 base::Bind(
331 &RasterFinishedWorkerPoolTaskImpl::OnRasterFinishedOnOriginThread,
332 this));
333 }
334
324 private: 335 private:
325 void RunOnOriginThread() const { on_raster_finished_callback_.Run(this); } 336 void OnRasterFinishedOnOriginThread() const {
337 on_raster_finished_callback_.Run(this);
338 }
326 339
327 scoped_refptr<base::MessageLoopProxy> origin_loop_; 340 scoped_refptr<base::MessageLoopProxy> origin_loop_;
328 const Callback on_raster_finished_callback_; 341 const Callback on_raster_finished_callback_;
329 342
330 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); 343 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl);
331 }; 344 };
332 345
333 class RasterRequiredForActivationFinishedWorkerPoolTaskImpl 346 class RasterRequiredForActivationFinishedWorkerPoolTaskImpl
334 : public RasterFinishedWorkerPoolTaskImpl { 347 : public RasterFinishedWorkerPoolTaskImpl {
335 public: 348 public:
336 RasterRequiredForActivationFinishedWorkerPoolTaskImpl( 349 RasterRequiredForActivationFinishedWorkerPoolTaskImpl(
337 const Callback& on_raster_finished_callback, 350 const Callback& on_raster_finished_callback,
338 size_t tasks_required_for_activation_count) 351 size_t tasks_required_for_activation_count)
339 : RasterFinishedWorkerPoolTaskImpl(on_raster_finished_callback), 352 : RasterFinishedWorkerPoolTaskImpl(on_raster_finished_callback),
340 tasks_required_for_activation_count_( 353 tasks_required_for_activation_count_(
341 tasks_required_for_activation_count) { 354 tasks_required_for_activation_count) {
342 if (tasks_required_for_activation_count_) { 355 if (tasks_required_for_activation_count_) {
343 g_raster_required_for_activation_delay.Get().delay->BeginParallel( 356 g_raster_required_for_activation_delay.Get().delay->BeginParallel(
344 &activation_delay_end_time_); 357 &activation_delay_end_time_);
345 } 358 }
346 } 359 }
347 360
348 // Overridden from RasterFinishedWorkerPoolTaskImpl: 361 // Overridden from internal::Task:
349 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 362 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
350 TRACE_EVENT0("cc", 363 TRACE_EVENT0("cc",
351 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::" 364 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::"
352 "RunOnWorkerThread"); 365 "RunOnWorkerThread");
353 if (tasks_required_for_activation_count_) { 366 RunRasterFinished();
354 g_raster_required_for_activation_delay.Get().delay->EndParallel( 367 }
355 activation_delay_end_time_); 368
356 } 369 // Overridden from internal::WorkerPoolTask:
357 RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread(thread_index); 370 virtual void RunOnOriginThread() OVERRIDE {
371 TRACE_EVENT0("cc",
372 "RasterRequiredForActivationFinishedWorkerPoolTaskImpl::"
373 "RunOnOriginThread");
374 RunRasterFinished();
358 } 375 }
359 376
360 private: 377 private:
361 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {} 378 virtual ~RasterRequiredForActivationFinishedWorkerPoolTaskImpl() {}
362 379
380 void RunRasterFinished() {
381 if (tasks_required_for_activation_count_) {
382 g_raster_required_for_activation_delay.Get().delay->EndParallel(
383 activation_delay_end_time_);
384 }
385 RasterFinished();
386 }
387
363 base::TimeTicks activation_delay_end_time_; 388 base::TimeTicks activation_delay_end_time_;
364 const size_t tasks_required_for_activation_count_; 389 const size_t tasks_required_for_activation_count_;
365 390
366 DISALLOW_COPY_AND_ASSIGN( 391 DISALLOW_COPY_AND_ASSIGN(
367 RasterRequiredForActivationFinishedWorkerPoolTaskImpl); 392 RasterRequiredForActivationFinishedWorkerPoolTaskImpl);
368 }; 393 };
369 394
370 class RasterTaskGraphRunner : public internal::TaskGraphRunner { 395 class RasterTaskGraphRunner : public internal::TaskGraphRunner {
371 public: 396 public:
372 RasterTaskGraphRunner() 397 RasterTaskGraphRunner()
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 429
405 void WorkerPoolTask::DidComplete() { 430 void WorkerPoolTask::DidComplete() {
406 DCHECK(did_schedule_); 431 DCHECK(did_schedule_);
407 DCHECK(!did_complete_); 432 DCHECK(!did_complete_);
408 did_schedule_ = false; 433 did_schedule_ = false;
409 did_complete_ = true; 434 did_complete_ = true;
410 } 435 }
411 436
412 bool WorkerPoolTask::HasCompleted() const { return did_complete_; } 437 bool WorkerPoolTask::HasCompleted() const { return did_complete_; }
413 438
414 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, 439 RasterWorkerPoolTask::RasterWorkerPoolTask(
415 internal::Task::Vector* dependencies, 440 const Resource* resource,
416 bool use_gpu_rasterization) 441 internal::WorkerPoolTask::Vector* dependencies)
417 : resource_(resource), use_gpu_rasterization_(use_gpu_rasterization) { 442 : resource_(resource) {
418 dependencies_.swap(*dependencies); 443 dependencies_.swap(*dependencies);
419 } 444 }
420 445
421 RasterWorkerPoolTask::~RasterWorkerPoolTask() {} 446 RasterWorkerPoolTask::~RasterWorkerPoolTask() {}
422 447
423 } // namespace internal 448 } // namespace internal
424 449
425 RasterWorkerPool::Task::Set::Set() {} 450 RasterWorkerPool::Task::Set::Set() {}
426 451
427 RasterWorkerPool::Task::Set::~Set() {} 452 RasterWorkerPool::Task::Set::~Set() {}
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 // with highest priority using the same task graph runner instance. 509 // with highest priority using the same task graph runner instance.
485 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u; 510 unsigned RasterWorkerPool::kOnDemandRasterTaskPriority = 0u;
486 // Task priorities that make sure raster finished tasks run before any 511 // Task priorities that make sure raster finished tasks run before any
487 // remaining raster tasks. 512 // remaining raster tasks.
488 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u; 513 unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 2u;
489 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority = 514 unsigned RasterWorkerPool::kRasterRequiredForActivationFinishedTaskPriority =
490 1u; 515 1u;
491 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u; 516 unsigned RasterWorkerPool::kRasterTaskPriorityBase = 3u;
492 517
493 RasterWorkerPool::RasterWorkerPool(internal::TaskGraphRunner* task_graph_runner, 518 RasterWorkerPool::RasterWorkerPool(internal::TaskGraphRunner* task_graph_runner,
494 ResourceProvider* resource_provider, 519 ResourceProvider* resource_provider)
495 ContextProvider* context_provider)
496 : task_graph_runner_(task_graph_runner), 520 : task_graph_runner_(task_graph_runner),
497 namespace_token_(task_graph_runner_->GetNamespaceToken()),
498 client_(NULL), 521 client_(NULL),
499 resource_provider_(resource_provider), 522 resource_provider_(resource_provider),
500 context_provider_(context_provider), 523 weak_ptr_factory_(this) {
501 weak_ptr_factory_(this) {} 524 if (task_graph_runner_)
525 namespace_token_ = task_graph_runner_->GetNamespaceToken();
526 }
502 527
503 RasterWorkerPool::~RasterWorkerPool() {} 528 RasterWorkerPool::~RasterWorkerPool() {}
504 529
505 // static 530 // static
506 void RasterWorkerPool::SetNumRasterThreads(int num_threads) { 531 void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
507 DCHECK_LT(0, num_threads); 532 DCHECK_LT(0, num_threads);
508 DCHECK_EQ(0, g_num_raster_threads); 533 DCHECK_EQ(0, g_num_raster_threads);
509 534
510 g_num_raster_threads = num_threads; 535 g_num_raster_threads = num_threads;
511 } 536 }
(...skipping 15 matching lines...) Expand all
527 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( 552 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask(
528 const Resource* resource, 553 const Resource* resource,
529 PicturePileImpl* picture_pile, 554 PicturePileImpl* picture_pile,
530 const gfx::Rect& content_rect, 555 const gfx::Rect& content_rect,
531 float contents_scale, 556 float contents_scale,
532 RasterMode raster_mode, 557 RasterMode raster_mode,
533 TileResolution tile_resolution, 558 TileResolution tile_resolution,
534 int layer_id, 559 int layer_id,
535 const void* tile_id, 560 const void* tile_id,
536 int source_frame_number, 561 int source_frame_number,
537 bool use_gpu_rasterization,
538 RenderingStatsInstrumentation* rendering_stats, 562 RenderingStatsInstrumentation* rendering_stats,
539 const RasterTask::Reply& reply, 563 const RasterTask::Reply& reply,
540 Task::Set* dependencies) { 564 Task::Set* dependencies,
565 ContextProvider* context_provider) {
541 return RasterTask(new RasterWorkerPoolTaskImpl(resource, 566 return RasterTask(new RasterWorkerPoolTaskImpl(resource,
542 picture_pile, 567 picture_pile,
543 content_rect, 568 content_rect,
544 contents_scale, 569 contents_scale,
545 raster_mode, 570 raster_mode,
546 tile_resolution, 571 tile_resolution,
547 layer_id, 572 layer_id,
548 tile_id, 573 tile_id,
549 source_frame_number, 574 source_frame_number,
550 use_gpu_rasterization,
551 rendering_stats, 575 rendering_stats,
552 reply, 576 reply,
553 &dependencies->tasks_)); 577 &dependencies->tasks_,
578 context_provider));
554 } 579 }
555 580
556 // static 581 // static
557 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( 582 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask(
558 SkPixelRef* pixel_ref, 583 SkPixelRef* pixel_ref,
559 int layer_id, 584 int layer_id,
560 RenderingStatsInstrumentation* rendering_stats, 585 RenderingStatsInstrumentation* rendering_stats,
561 const Task::Reply& reply) { 586 const Task::Reply& reply) {
562 return Task(new ImageDecodeWorkerPoolTaskImpl( 587 return Task(new ImageDecodeWorkerPoolTaskImpl(
563 pixel_ref, layer_id, rendering_stats, reply)); 588 pixel_ref, layer_id, rendering_stats, reply));
564 } 589 }
565 590
566 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { 591 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) {
567 client_ = client; 592 client_ = client;
568 } 593 }
569 594
570 void RasterWorkerPool::Shutdown() { 595 void RasterWorkerPool::Shutdown() {
571 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); 596 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown");
572 597
573 internal::TaskGraph empty; 598 if (task_graph_runner_) {
574 SetTaskGraph(&empty); 599 internal::TaskGraph empty;
575 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 600 task_graph_runner_->SetTaskGraph(namespace_token_, &empty);
601 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
602 }
603
576 weak_ptr_factory_.InvalidateWeakPtrs(); 604 weak_ptr_factory_.InvalidateWeakPtrs();
577 } 605 }
578 606
579 void RasterWorkerPool::SetTaskGraph(internal::TaskGraph* graph) { 607 void RasterWorkerPool::SetTaskGraph(internal::TaskGraph* graph) {
580 TRACE_EVENT0("cc", "RasterWorkerPool::SetTaskGraph"); 608 TRACE_EVENT0("cc", "RasterWorkerPool::SetTaskGraph");
581 609
610 DCHECK(task_graph_runner_);
582 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin(); 611 for (internal::TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
583 it != graph->nodes.end(); 612 it != graph->nodes.end();
584 ++it) { 613 ++it) {
585 internal::TaskGraph::Node& node = *it; 614 internal::TaskGraph::Node& node = *it;
586 internal::WorkerPoolTask* task = 615 internal::WorkerPoolTask* task =
587 static_cast<internal::WorkerPoolTask*>(node.task); 616 static_cast<internal::WorkerPoolTask*>(node.task);
588 617
589 if (!task->HasBeenScheduled()) { 618 if (!task->HasBeenScheduled()) {
590 task->WillSchedule(); 619 task->WillSchedule();
591 task->ScheduleOnOriginThread(this); 620 task->ScheduleOnOriginThread(this);
592 task->DidSchedule(); 621 task->DidSchedule();
593 } 622 }
594 } 623 }
595 624
596 task_graph_runner_->SetTaskGraph(namespace_token_, graph); 625 task_graph_runner_->SetTaskGraph(namespace_token_, graph);
597 } 626 }
598 627
599 void RasterWorkerPool::CollectCompletedWorkerPoolTasks( 628 void RasterWorkerPool::CollectCompletedWorkerPoolTasks(
600 internal::Task::Vector* completed_tasks) { 629 internal::Task::Vector* completed_tasks) {
630 DCHECK(task_graph_runner_);
601 task_graph_runner_->CollectCompletedTasks(namespace_token_, completed_tasks); 631 task_graph_runner_->CollectCompletedTasks(namespace_token_, completed_tasks);
602 } 632 }
603 633
604 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) {
605 DCHECK(!tasks.empty());
606 TRACE_EVENT1(
607 "cc", "RasterWorkerPool::RunGpuRasterTasks", "num_tasks", tasks.size());
608
609 GrContext* gr_context = context_provider_->GrContext();
610 // TODO(alokp): Implement TestContextProvider::GrContext().
611 if (gr_context)
612 gr_context->resetContext();
613
614 for (RasterTaskVector::const_iterator it = tasks.begin(); it != tasks.end();
615 ++it) {
616 internal::RasterWorkerPoolTask* task = it->get();
617 DCHECK(task->use_gpu_rasterization());
618
619 task->WillSchedule();
620 task->ScheduleOnOriginThread(this);
621 task->DidSchedule();
622
623 task->WillRun();
624 task->RunOnOriginThread(resource_provider_, context_provider_);
625 task->DidRun();
626
627 task->WillComplete();
628 task->CompleteOnOriginThread(this);
629 task->DidComplete();
630
631 completed_gpu_raster_tasks_.push_back(task);
632 }
633
634 // TODO(alokp): Implement TestContextProvider::GrContext().
635 if (gr_context)
636 gr_context->flush();
637 }
638
639 void RasterWorkerPool::CheckForCompletedGpuRasterTasks() {
640 // Complete gpu rasterization tasks.
641 while (!completed_gpu_raster_tasks_.empty()) {
642 internal::WorkerPoolTask* task = completed_gpu_raster_tasks_.front().get();
643
644 task->RunReplyOnOriginThread();
645
646 completed_gpu_raster_tasks_.pop_front();
647 }
648 }
649
650 scoped_refptr<internal::WorkerPoolTask> 634 scoped_refptr<internal::WorkerPoolTask>
651 RasterWorkerPool::CreateRasterFinishedTask() { 635 RasterWorkerPool::CreateRasterFinishedTask() {
652 return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl(base::Bind( 636 return make_scoped_refptr(new RasterFinishedWorkerPoolTaskImpl(base::Bind(
653 &RasterWorkerPool::OnRasterFinished, weak_ptr_factory_.GetWeakPtr()))); 637 &RasterWorkerPool::OnRasterFinished, weak_ptr_factory_.GetWeakPtr())));
654 } 638 }
655 639
656 scoped_refptr<internal::WorkerPoolTask> 640 scoped_refptr<internal::WorkerPoolTask>
657 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( 641 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask(
658 size_t tasks_required_for_activation_count) { 642 size_t tasks_required_for_activation_count) {
659 return make_scoped_refptr( 643 return make_scoped_refptr(
660 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl( 644 new RasterRequiredForActivationFinishedWorkerPoolTaskImpl(
661 base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, 645 base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished,
662 weak_ptr_factory_.GetWeakPtr()), 646 weak_ptr_factory_.GetWeakPtr()),
663 tasks_required_for_activation_count)); 647 tasks_required_for_activation_count));
664 } 648 }
665 649
650 void RasterWorkerPool::RunTaskOnOriginThread(internal::WorkerPoolTask* task) {
651 task->WillSchedule();
652 task->ScheduleOnOriginThread(this);
653 task->DidSchedule();
654
655 task->WillRun();
656 task->RunOnOriginThread();
657 task->DidRun();
658
659 task->WillComplete();
660 task->CompleteOnOriginThread(this);
661 task->DidComplete();
662 }
663
666 void RasterWorkerPool::OnRasterFinished( 664 void RasterWorkerPool::OnRasterFinished(
667 const internal::WorkerPoolTask* source) { 665 const internal::WorkerPoolTask* source) {
668 TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished"); 666 TRACE_EVENT0("cc", "RasterWorkerPool::OnRasterFinished");
669 667
670 // Early out if current |raster_finished_task_| is not the source. 668 // Early out if current |raster_finished_task_| is not the source.
671 if (source != raster_finished_task_.get()) 669 if (source != raster_finished_task_.get())
672 return; 670 return;
673 671
674 OnRasterTasksFinished(); 672 OnRasterTasksFinished();
675 } 673 }
(...skipping 20 matching lines...) Expand all
696 internal::TaskGraph::Node::TaskComparator(task)) == 694 internal::TaskGraph::Node::TaskComparator(task)) ==
697 graph->nodes.end()); 695 graph->nodes.end());
698 graph->nodes.push_back( 696 graph->nodes.push_back(
699 internal::TaskGraph::Node(task, priority, dependencies)); 697 internal::TaskGraph::Node(task, priority, dependencies));
700 } 698 }
701 699
702 // static 700 // static
703 void RasterWorkerPool::InsertNodeForRasterTask( 701 void RasterWorkerPool::InsertNodeForRasterTask(
704 internal::TaskGraph* graph, 702 internal::TaskGraph* graph,
705 internal::WorkerPoolTask* raster_task, 703 internal::WorkerPoolTask* raster_task,
706 const internal::Task::Vector& decode_tasks, 704 const internal::WorkerPoolTask::Vector& decode_tasks,
707 unsigned priority) { 705 unsigned priority) {
708 size_t dependencies = 0u; 706 size_t dependencies = 0u;
709 707
710 // Insert image decode tasks. 708 // Insert image decode tasks.
711 for (internal::Task::Vector::const_iterator it = decode_tasks.begin(); 709 for (internal::WorkerPoolTask::Vector::const_iterator it =
710 decode_tasks.begin();
712 it != decode_tasks.end(); 711 it != decode_tasks.end();
713 ++it) { 712 ++it) {
714 internal::WorkerPoolTask* decode_task = 713 internal::WorkerPoolTask* decode_task = it->get();
715 static_cast<internal::WorkerPoolTask*>(it->get());
716 714
717 // Skip if already decoded. 715 // Skip if already decoded.
718 if (decode_task->HasCompleted()) 716 if (decode_task->HasCompleted())
719 continue; 717 continue;
720 718
721 dependencies++; 719 dependencies++;
722 720
723 // Add decode task if it doesn't already exists in graph. 721 // Add decode task if it doesn't already exists in graph.
724 internal::TaskGraph::Node::Vector::iterator decode_it = 722 internal::TaskGraph::Node::Vector::iterator decode_it =
725 std::find_if(graph->nodes.begin(), 723 std::find_if(graph->nodes.begin(),
726 graph->nodes.end(), 724 graph->nodes.end(),
727 internal::TaskGraph::Node::TaskComparator(decode_task)); 725 internal::TaskGraph::Node::TaskComparator(decode_task));
728 if (decode_it == graph->nodes.end()) 726 if (decode_it == graph->nodes.end())
729 InsertNodeForTask(graph, decode_task, priority, 0u); 727 InsertNodeForTask(graph, decode_task, priority, 0u);
730 728
731 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); 729 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task));
732 } 730 }
733 731
734 InsertNodeForTask(graph, raster_task, priority, dependencies); 732 InsertNodeForTask(graph, raster_task, priority, dependencies);
735 } 733 }
736 734
737 } // namespace cc 735 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/raster_worker_pool.h ('k') | cc/resources/raster_worker_pool_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698