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 "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "cc/debug/devtools_instrumentation.h" | 10 #include "cc/debug/devtools_instrumentation.h" |
11 #include "cc/debug/traced_value.h" | 11 #include "cc/debug/traced_value.h" |
12 #include "cc/resources/picture_pile_impl.h" | 12 #include "cc/resources/picture_pile_impl.h" |
13 #include "skia/ext/paint_simplifier.h" | 13 #include "skia/ext/paint_simplifier.h" |
14 #include "third_party/skia/include/core/SkBitmap.h" | 14 #include "third_party/skia/include/core/SkBitmap.h" |
15 #include "third_party/skia/include/core/SkPixelRef.h" | 15 #include "third_party/skia/include/core/SkPixelRef.h" |
| 16 #include "third_party/skia/include/gpu/GrContext.h" |
| 17 #include "third_party/skia/include/gpu/SkGpuDevice.h" |
| 18 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" |
16 | 19 |
17 namespace cc { | 20 namespace cc { |
18 | 21 |
19 namespace { | 22 namespace { |
20 | 23 |
21 // Subclass of Allocator that takes a suitably allocated pointer and uses | 24 // Subclass of Allocator that takes a suitably allocated pointer and uses |
22 // it as the pixel memory for the bitmap. | 25 // it as the pixel memory for the bitmap. |
23 class IdentityAllocator : public SkBitmap::Allocator { | 26 class IdentityAllocator : public SkBitmap::Allocator { |
24 public: | 27 public: |
25 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {} | 28 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {} |
(...skipping 25 matching lines...) Expand all Loading... |
51 public: | 54 public: |
52 RasterWorkerPoolTaskImpl(const Resource* resource, | 55 RasterWorkerPoolTaskImpl(const Resource* resource, |
53 PicturePileImpl* picture_pile, | 56 PicturePileImpl* picture_pile, |
54 gfx::Rect content_rect, | 57 gfx::Rect content_rect, |
55 float contents_scale, | 58 float contents_scale, |
56 RasterMode raster_mode, | 59 RasterMode raster_mode, |
57 TileResolution tile_resolution, | 60 TileResolution tile_resolution, |
58 int layer_id, | 61 int layer_id, |
59 const void* tile_id, | 62 const void* tile_id, |
60 int source_frame_number, | 63 int source_frame_number, |
| 64 bool use_gpu_rasterization, |
61 RenderingStatsInstrumentation* rendering_stats, | 65 RenderingStatsInstrumentation* rendering_stats, |
62 const RasterWorkerPool::RasterTask::Reply& reply, | 66 const RasterWorkerPool::RasterTask::Reply& reply, |
63 TaskVector* dependencies) | 67 TaskVector* dependencies) |
64 : internal::RasterWorkerPoolTask(resource, dependencies), | 68 : internal::RasterWorkerPoolTask(resource, |
| 69 dependencies, |
| 70 use_gpu_rasterization), |
65 picture_pile_(picture_pile), | 71 picture_pile_(picture_pile), |
66 content_rect_(content_rect), | 72 content_rect_(content_rect), |
67 contents_scale_(contents_scale), | 73 contents_scale_(contents_scale), |
68 raster_mode_(raster_mode), | 74 raster_mode_(raster_mode), |
69 tile_resolution_(tile_resolution), | 75 tile_resolution_(tile_resolution), |
70 layer_id_(layer_id), | 76 layer_id_(layer_id), |
71 tile_id_(tile_id), | 77 tile_id_(tile_id), |
72 source_frame_number_(source_frame_number), | 78 source_frame_number_(source_frame_number), |
73 rendering_stats_(rendering_stats), | 79 rendering_stats_(rendering_stats), |
74 reply_(reply) {} | 80 reply_(reply) {} |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 117 |
112 devtools_instrumentation::ScopedLayerTask raster_task( | 118 devtools_instrumentation::ScopedLayerTask raster_task( |
113 devtools_instrumentation::kRasterTask, layer_id_); | 119 devtools_instrumentation::kRasterTask, layer_id_); |
114 | 120 |
115 DCHECK(picture_pile_.get()); | 121 DCHECK(picture_pile_.get()); |
116 DCHECK(buffer); | 122 DCHECK(buffer); |
117 | 123 |
118 if (analysis_.is_solid_color) | 124 if (analysis_.is_solid_color) |
119 return false; | 125 return false; |
120 | 126 |
121 PicturePileImpl* picture_clone = | |
122 picture_pile_->GetCloneForDrawingOnThread(thread_index); | |
123 | |
124 SkBitmap bitmap; | 127 SkBitmap bitmap; |
125 switch (resource()->format()) { | 128 switch (resource()->format()) { |
126 case RGBA_4444: | 129 case RGBA_4444: |
127 // Use the default stride if we will eventually convert this | 130 // Use the default stride if we will eventually convert this |
128 // bitmap to 4444. | 131 // bitmap to 4444. |
129 bitmap.setConfig(SkBitmap::kARGB_8888_Config, | 132 bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
130 size.width(), | 133 size.width(), |
131 size.height()); | 134 size.height()); |
132 bitmap.allocPixels(); | 135 bitmap.allocPixels(); |
133 break; | 136 break; |
134 case RGBA_8888: | 137 case RGBA_8888: |
135 case BGRA_8888: | 138 case BGRA_8888: |
136 bitmap.setConfig(SkBitmap::kARGB_8888_Config, | 139 bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
137 size.width(), | 140 size.width(), |
138 size.height(), | 141 size.height(), |
139 stride); | 142 stride); |
140 bitmap.setPixels(buffer); | 143 bitmap.setPixels(buffer); |
141 break; | 144 break; |
142 case LUMINANCE_8: | 145 case LUMINANCE_8: |
143 case RGB_565: | 146 case RGB_565: |
144 case ETC1: | 147 case ETC1: |
145 NOTREACHED(); | 148 NOTREACHED(); |
146 break; | 149 break; |
147 } | 150 } |
148 | 151 |
149 SkBitmapDevice device(bitmap); | 152 SkBitmapDevice device(bitmap); |
150 SkCanvas canvas(&device); | 153 SkCanvas canvas(&device); |
| 154 Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index), &canvas); |
| 155 ChangeBitmapConfigIfNeeded(bitmap, buffer); |
| 156 |
| 157 return true; |
| 158 } |
| 159 |
| 160 // Overridden from internal::RasterWorkerPoolTask: |
| 161 virtual bool RunOnWorkerThread(unsigned thread_index, |
| 162 void* buffer, |
| 163 gfx::Size size, |
| 164 int stride) OVERRIDE { |
| 165 // TODO(alokp): For now run-on-worker-thread implies software rasterization. |
| 166 DCHECK(!use_gpu_rasterization()); |
| 167 RunAnalysisOnThread(thread_index); |
| 168 return RunRasterOnThread(thread_index, buffer, size, stride); |
| 169 } |
| 170 |
| 171 virtual void RunOnOriginThread(ResourceProvider* resource_provider, |
| 172 ContextProvider* context_provider) OVERRIDE { |
| 173 // TODO(alokp): For now run-on-origin-thread implies gpu rasterization. |
| 174 DCHECK(use_gpu_rasterization()); |
| 175 ResourceProvider::ScopedWriteLockGL lock(resource_provider, |
| 176 resource()->id()); |
| 177 DCHECK_NE(lock.texture_id(), 0u); |
| 178 |
| 179 GrBackendTextureDesc desc; |
| 180 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 181 desc.fWidth = content_rect_.width(); |
| 182 desc.fHeight = content_rect_.height(); |
| 183 desc.fConfig = ToGrFormat(resource()->format()); |
| 184 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 185 desc.fTextureHandle = lock.texture_id(); |
| 186 |
| 187 GrContext* gr_context = context_provider->GrContext(); |
| 188 skia::RefPtr<GrTexture> texture = |
| 189 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
| 190 skia::RefPtr<SkGpuDevice> device = |
| 191 skia::AdoptRef(SkGpuDevice::Create(texture.get())); |
| 192 skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(device.get())); |
| 193 |
| 194 Raster(picture_pile_, canvas.get()); |
| 195 } |
| 196 |
| 197 virtual void CompleteOnOriginThread() OVERRIDE { |
| 198 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); |
| 199 } |
| 200 |
| 201 protected: |
| 202 virtual ~RasterWorkerPoolTaskImpl() {} |
| 203 |
| 204 private: |
| 205 scoped_ptr<base::Value> DataAsValue() const { |
| 206 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| 207 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); |
| 208 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); |
| 209 res->SetInteger("source_frame_number", source_frame_number_); |
| 210 res->SetInteger("layer_id", layer_id_); |
| 211 return res.PassAs<base::Value>(); |
| 212 } |
| 213 |
| 214 static GrPixelConfig ToGrFormat(ResourceFormat format) { |
| 215 switch (format) { |
| 216 case RGBA_8888: return kRGBA_8888_GrPixelConfig; |
| 217 case BGRA_8888: return kBGRA_8888_GrPixelConfig; |
| 218 case RGBA_4444: return kRGBA_4444_GrPixelConfig; |
| 219 default: break; |
| 220 } |
| 221 DCHECK(false) << "Unsupported resource format."; |
| 222 return kSkia8888_GrPixelConfig; |
| 223 } |
| 224 |
| 225 void Raster(PicturePileImpl* picture_pile, SkCanvas* canvas) { |
151 skia::RefPtr<SkDrawFilter> draw_filter; | 226 skia::RefPtr<SkDrawFilter> draw_filter; |
152 switch (raster_mode_) { | 227 switch (raster_mode_) { |
153 case LOW_QUALITY_RASTER_MODE: | 228 case LOW_QUALITY_RASTER_MODE: |
154 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); | 229 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); |
155 break; | 230 break; |
156 case HIGH_QUALITY_NO_LCD_RASTER_MODE: | 231 case HIGH_QUALITY_NO_LCD_RASTER_MODE: |
157 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); | 232 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); |
158 break; | 233 break; |
159 case HIGH_QUALITY_RASTER_MODE: | 234 case HIGH_QUALITY_RASTER_MODE: |
160 break; | 235 break; |
161 case NUM_RASTER_MODES: | 236 case NUM_RASTER_MODES: |
162 default: | 237 default: |
163 NOTREACHED(); | 238 NOTREACHED(); |
164 } | 239 } |
165 | 240 canvas->setDrawFilter(draw_filter.get()); |
166 canvas.setDrawFilter(draw_filter.get()); | |
167 | 241 |
168 base::TimeDelta prev_rasterize_time = | 242 base::TimeDelta prev_rasterize_time = |
169 rendering_stats_->impl_thread_rendering_stats().rasterize_time; | 243 rendering_stats_->impl_thread_rendering_stats().rasterize_time; |
170 | 244 |
171 // Only record rasterization time for highres tiles, because | 245 // Only record rasterization time for highres tiles, because |
172 // lowres tiles are not required for activation and therefore | 246 // lowres tiles are not required for activation and therefore |
173 // introduce noise in the measurement (sometimes they get rasterized | 247 // introduce noise in the measurement (sometimes they get rasterized |
174 // before we draw and sometimes they aren't) | 248 // before we draw and sometimes they aren't) |
175 if (tile_resolution_ == HIGH_RESOLUTION) { | 249 RenderingStatsInstrumentation* stats = |
176 picture_clone->RasterToBitmap( | 250 tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL; |
177 &canvas, content_rect_, contents_scale_, rendering_stats_); | 251 picture_pile->RasterToBitmap(canvas, content_rect_, contents_scale_, stats); |
178 } else { | |
179 picture_clone->RasterToBitmap( | |
180 &canvas, content_rect_, contents_scale_, NULL); | |
181 } | |
182 | 252 |
183 if (rendering_stats_->record_rendering_stats()) { | 253 if (rendering_stats_->record_rendering_stats()) { |
184 base::TimeDelta current_rasterize_time = | 254 base::TimeDelta current_rasterize_time = |
185 rendering_stats_->impl_thread_rendering_stats().rasterize_time; | 255 rendering_stats_->impl_thread_rendering_stats().rasterize_time; |
186 HISTOGRAM_CUSTOM_COUNTS( | 256 HISTOGRAM_CUSTOM_COUNTS( |
187 "Renderer4.PictureRasterTimeUS", | 257 "Renderer4.PictureRasterTimeUS", |
188 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), | 258 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), |
189 0, | 259 0, |
190 100000, | 260 100000, |
191 100); | 261 100); |
192 } | 262 } |
193 | |
194 ChangeBitmapConfigIfNeeded(bitmap, buffer); | |
195 | |
196 return true; | |
197 } | |
198 | |
199 // Overridden from internal::RasterWorkerPoolTask: | |
200 virtual bool RunOnWorkerThread(unsigned thread_index, | |
201 void* buffer, | |
202 gfx::Size size, | |
203 int stride) | |
204 OVERRIDE { | |
205 RunAnalysisOnThread(thread_index); | |
206 return RunRasterOnThread(thread_index, buffer, size, stride); | |
207 } | |
208 virtual void CompleteOnOriginThread() OVERRIDE { | |
209 reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); | |
210 } | |
211 | |
212 protected: | |
213 virtual ~RasterWorkerPoolTaskImpl() {} | |
214 | |
215 private: | |
216 scoped_ptr<base::Value> DataAsValue() const { | |
217 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); | |
218 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); | |
219 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); | |
220 res->SetInteger("source_frame_number", source_frame_number_); | |
221 res->SetInteger("layer_id", layer_id_); | |
222 return res.PassAs<base::Value>(); | |
223 } | 263 } |
224 | 264 |
225 void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, | 265 void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, |
226 void* buffer) { | 266 void* buffer) { |
227 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded"); | 267 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded"); |
228 SkBitmap::Config config = SkBitmapConfig(resource()->format()); | 268 SkBitmap::Config config = SkBitmapConfig(resource()->format()); |
229 if (bitmap.getConfig() != config) { | 269 if (bitmap.getConfig() != config) { |
230 SkBitmap bitmap_dest; | 270 SkBitmap bitmap_dest; |
231 IdentityAllocator allocator(buffer); | 271 IdentityAllocator allocator(buffer); |
232 bitmap.copyTo(&bitmap_dest, config, &allocator); | 272 bitmap.copyTo(&bitmap_dest, config, &allocator); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 | 360 |
321 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); | 361 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); |
322 }; | 362 }; |
323 | 363 |
324 const char* kWorkerThreadNamePrefix = "CompositorRaster"; | 364 const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
325 | 365 |
326 } // namespace | 366 } // namespace |
327 | 367 |
328 namespace internal { | 368 namespace internal { |
329 | 369 |
330 RasterWorkerPoolTask::RasterWorkerPoolTask( | 370 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
331 const Resource* resource, TaskVector* dependencies) | 371 TaskVector* dependencies, |
| 372 bool use_gpu_rasterization) |
332 : did_run_(false), | 373 : did_run_(false), |
333 did_complete_(false), | 374 did_complete_(false), |
334 was_canceled_(false), | 375 was_canceled_(false), |
335 resource_(resource) { | 376 resource_(resource), |
| 377 use_gpu_rasterization_(use_gpu_rasterization) { |
336 dependencies_.swap(*dependencies); | 378 dependencies_.swap(*dependencies); |
337 } | 379 } |
338 | 380 |
339 RasterWorkerPoolTask::~RasterWorkerPoolTask() { | 381 RasterWorkerPoolTask::~RasterWorkerPoolTask() { |
340 } | 382 } |
341 | 383 |
342 void RasterWorkerPoolTask::DidRun(bool was_canceled) { | 384 void RasterWorkerPoolTask::DidRun(bool was_canceled) { |
343 DCHECK(!did_run_); | 385 DCHECK(!did_run_); |
344 did_run_ = true; | 386 did_run_ = true; |
345 was_canceled_ = was_canceled; | 387 was_canceled_ = was_canceled; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 468 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
427 const Resource* resource, | 469 const Resource* resource, |
428 PicturePileImpl* picture_pile, | 470 PicturePileImpl* picture_pile, |
429 gfx::Rect content_rect, | 471 gfx::Rect content_rect, |
430 float contents_scale, | 472 float contents_scale, |
431 RasterMode raster_mode, | 473 RasterMode raster_mode, |
432 TileResolution tile_resolution, | 474 TileResolution tile_resolution, |
433 int layer_id, | 475 int layer_id, |
434 const void* tile_id, | 476 const void* tile_id, |
435 int source_frame_number, | 477 int source_frame_number, |
| 478 bool use_gpu_rasterization, |
436 RenderingStatsInstrumentation* rendering_stats, | 479 RenderingStatsInstrumentation* rendering_stats, |
437 const RasterTask::Reply& reply, | 480 const RasterTask::Reply& reply, |
438 Task::Set* dependencies) { | 481 Task::Set* dependencies) { |
439 return RasterTask( | 482 return RasterTask( |
440 new RasterWorkerPoolTaskImpl(resource, | 483 new RasterWorkerPoolTaskImpl(resource, |
441 picture_pile, | 484 picture_pile, |
442 content_rect, | 485 content_rect, |
443 contents_scale, | 486 contents_scale, |
444 raster_mode, | 487 raster_mode, |
445 tile_resolution, | 488 tile_resolution, |
446 layer_id, | 489 layer_id, |
447 tile_id, | 490 tile_id, |
448 source_frame_number, | 491 source_frame_number, |
| 492 use_gpu_rasterization, |
449 rendering_stats, | 493 rendering_stats, |
450 reply, | 494 reply, |
451 &dependencies->tasks_)); | 495 &dependencies->tasks_)); |
452 } | 496 } |
453 | 497 |
454 // static | 498 // static |
455 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 499 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
456 SkPixelRef* pixel_ref, | 500 SkPixelRef* pixel_ref, |
457 int layer_id, | 501 int layer_id, |
458 RenderingStatsInstrumentation* stats_instrumentation, | 502 RenderingStatsInstrumentation* stats_instrumentation, |
459 const Task::Reply& reply) { | 503 const Task::Reply& reply) { |
460 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 504 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
461 layer_id, | 505 layer_id, |
462 stats_instrumentation, | 506 stats_instrumentation, |
463 reply)); | 507 reply)); |
464 } | 508 } |
465 | 509 |
466 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, | 510 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
| 511 ContextProvider* context_provider, |
467 size_t num_threads) | 512 size_t num_threads) |
468 : WorkerPool(num_threads, kWorkerThreadNamePrefix), | 513 : WorkerPool(num_threads, kWorkerThreadNamePrefix), |
469 client_(NULL), | 514 client_(NULL), |
470 resource_provider_(resource_provider), | 515 resource_provider_(resource_provider), |
| 516 context_provider_(context_provider), |
471 weak_ptr_factory_(this) { | 517 weak_ptr_factory_(this) { |
472 } | 518 } |
473 | 519 |
474 RasterWorkerPool::~RasterWorkerPool() { | 520 RasterWorkerPool::~RasterWorkerPool() { |
475 } | 521 } |
476 | 522 |
477 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 523 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
478 client_ = client; | 524 client_ = client; |
479 } | 525 } |
480 | 526 |
481 void RasterWorkerPool::Shutdown() { | 527 void RasterWorkerPool::Shutdown() { |
482 raster_tasks_.clear(); | 528 raster_tasks_.clear(); |
483 TaskGraph empty; | 529 TaskGraph empty; |
484 SetTaskGraph(&empty); | 530 SetTaskGraph(&empty); |
485 WorkerPool::Shutdown(); | 531 WorkerPool::Shutdown(); |
486 weak_ptr_factory_.InvalidateWeakPtrs(); | 532 weak_ptr_factory_.InvalidateWeakPtrs(); |
487 } | 533 } |
488 | 534 |
| 535 void RasterWorkerPool::CheckForCompletedTasks() { |
| 536 TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks"); |
| 537 |
| 538 // Check for completed worker-thread tasks. |
| 539 CheckForCompletedWorkerTasks(); |
| 540 |
| 541 // Complete gpu rasterization tasks. |
| 542 while (!completed_gpu_raster_tasks_.empty()) { |
| 543 internal::RasterWorkerPoolTask* task = |
| 544 completed_gpu_raster_tasks_.front().get(); |
| 545 task->WillComplete(); |
| 546 task->CompleteOnOriginThread(); |
| 547 task->DidComplete(); |
| 548 |
| 549 completed_gpu_raster_tasks_.pop_front(); |
| 550 } |
| 551 } |
| 552 |
489 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { | 553 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
490 raster_tasks_.swap(queue->tasks_); | 554 raster_tasks_.swap(queue->tasks_); |
491 raster_tasks_required_for_activation_.swap( | 555 raster_tasks_required_for_activation_.swap( |
492 queue->tasks_required_for_activation_); | 556 queue->tasks_required_for_activation_); |
493 } | 557 } |
494 | 558 |
495 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 559 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
496 internal::RasterWorkerPoolTask* task) const { | 560 internal::RasterWorkerPoolTask* task) const { |
497 return | 561 return |
498 raster_tasks_required_for_activation_.find(task) != | 562 raster_tasks_required_for_activation_.find(task) != |
499 raster_tasks_required_for_activation_.end(); | 563 raster_tasks_required_for_activation_.end(); |
500 } | 564 } |
501 | 565 |
| 566 void RasterWorkerPool::RunGpuRasterTasks(const RasterTaskVector& tasks) { |
| 567 if (tasks.empty()) |
| 568 return; |
| 569 |
| 570 blink::WebGraphicsContext3D* context = context_provider_->Context3d(); |
| 571 if (!context->makeContextCurrent()) |
| 572 return; |
| 573 |
| 574 GrContext* gr_context = context_provider_->GrContext(); |
| 575 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 576 if (gr_context) gr_context->resetContext(); |
| 577 |
| 578 for (RasterTaskVector::const_iterator it = tasks.begin(); |
| 579 it != tasks.end(); ++it) { |
| 580 internal::RasterWorkerPoolTask* task = it->get(); |
| 581 DCHECK(task->use_gpu_rasterization()); |
| 582 |
| 583 task->RunOnOriginThread(resource_provider_, context_provider_); |
| 584 task->DidRun(false); |
| 585 completed_gpu_raster_tasks_.push_back(task); |
| 586 } |
| 587 |
| 588 // TODO(alokp): Implement TestContextProvider::GrContext(). |
| 589 if (gr_context) gr_context->flush(); |
| 590 } |
| 591 |
502 scoped_refptr<internal::WorkerPoolTask> | 592 scoped_refptr<internal::WorkerPoolTask> |
503 RasterWorkerPool::CreateRasterFinishedTask() { | 593 RasterWorkerPool::CreateRasterFinishedTask() { |
504 return make_scoped_refptr( | 594 return make_scoped_refptr( |
505 new RasterFinishedWorkerPoolTaskImpl( | 595 new RasterFinishedWorkerPoolTaskImpl( |
506 base::Bind(&RasterWorkerPool::OnRasterFinished, | 596 base::Bind(&RasterWorkerPool::OnRasterFinished, |
507 weak_ptr_factory_.GetWeakPtr()))); | 597 weak_ptr_factory_.GetWeakPtr()))); |
508 } | 598 } |
509 | 599 |
510 scoped_refptr<internal::WorkerPoolTask> | 600 scoped_refptr<internal::WorkerPoolTask> |
511 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { | 601 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 | 679 |
590 internal::GraphNode* decode_node = CreateGraphNodeForTask( | 680 internal::GraphNode* decode_node = CreateGraphNodeForTask( |
591 decode_task, priority, graph); | 681 decode_task, priority, graph); |
592 decode_node->add_dependent(raster_node); | 682 decode_node->add_dependent(raster_node); |
593 } | 683 } |
594 | 684 |
595 return raster_node; | 685 return raster_node; |
596 } | 686 } |
597 | 687 |
598 } // namespace cc | 688 } // namespace cc |
OLD | NEW |