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 <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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |