Chromium Code Reviews| 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 { | |
|
reveman
2014/02/14 23:30:52
This shouldn't behave any different from RunOnWork
| |
| 117 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::RunOnOriginThread"); | |
| 118 | |
| 119 Analyze(picture_pile_); | |
| 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 |