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 "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "cc/debug/devtools_instrumentation.h" | 10 #include "cc/debug/devtools_instrumentation.h" |
| 11 #include "cc/debug/traced_value.h" | 11 #include "cc/debug/traced_value.h" |
| 12 #include "cc/resources/picture_pile_impl.h" | 12 #include "cc/resources/picture_pile_impl.h" |
| 13 #include "skia/ext/lazy_pixel_ref.h" | 13 #include "skia/ext/lazy_pixel_ref.h" |
| 14 #include "skia/ext/paint_simplifier.h" | 14 #include "skia/ext/paint_simplifier.h" |
| 15 #include "third_party/skia/include/core/SkBitmap.h" | 15 #include "third_party/skia/include/core/SkBitmap.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 = tile_resolution_ == HIGH_RESOLUTION ? |
| 176 picture_clone->RasterToBitmap( | 250 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 318 | 358 |
| 319 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); | 359 DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); |
| 320 }; | 360 }; |
| 321 | 361 |
| 322 const char* kWorkerThreadNamePrefix = "CompositorRaster"; | 362 const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
| 323 | 363 |
| 324 } // namespace | 364 } // namespace |
| 325 | 365 |
| 326 namespace internal { | 366 namespace internal { |
| 327 | 367 |
| 328 RasterWorkerPoolTask::RasterWorkerPoolTask( | 368 RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
| 329 const Resource* resource, TaskVector* dependencies) | 369 TaskVector* dependencies, |
| 370 bool use_gpu_rasterization) | |
| 330 : did_run_(false), | 371 : did_run_(false), |
| 331 did_complete_(false), | 372 did_complete_(false), |
| 332 was_canceled_(false), | 373 was_canceled_(false), |
| 333 resource_(resource) { | 374 resource_(resource), |
| 375 use_gpu_rasterization_(use_gpu_rasterization) { | |
| 334 dependencies_.swap(*dependencies); | 376 dependencies_.swap(*dependencies); |
| 335 } | 377 } |
| 336 | 378 |
| 337 RasterWorkerPoolTask::~RasterWorkerPoolTask() { | 379 RasterWorkerPoolTask::~RasterWorkerPoolTask() { |
| 338 } | 380 } |
| 339 | 381 |
| 340 void RasterWorkerPoolTask::DidRun(bool was_canceled) { | 382 void RasterWorkerPoolTask::DidRun(bool was_canceled) { |
| 341 DCHECK(!did_run_); | 383 DCHECK(!did_run_); |
| 342 did_run_ = true; | 384 did_run_ = true; |
| 343 was_canceled_ = was_canceled; | 385 was_canceled_ = was_canceled; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 424 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( | 466 RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
| 425 const Resource* resource, | 467 const Resource* resource, |
| 426 PicturePileImpl* picture_pile, | 468 PicturePileImpl* picture_pile, |
| 427 gfx::Rect content_rect, | 469 gfx::Rect content_rect, |
| 428 float contents_scale, | 470 float contents_scale, |
| 429 RasterMode raster_mode, | 471 RasterMode raster_mode, |
| 430 TileResolution tile_resolution, | 472 TileResolution tile_resolution, |
| 431 int layer_id, | 473 int layer_id, |
| 432 const void* tile_id, | 474 const void* tile_id, |
| 433 int source_frame_number, | 475 int source_frame_number, |
| 476 bool use_gpu_rasterization, | |
| 434 RenderingStatsInstrumentation* rendering_stats, | 477 RenderingStatsInstrumentation* rendering_stats, |
| 435 const RasterTask::Reply& reply, | 478 const RasterTask::Reply& reply, |
| 436 Task::Set* dependencies) { | 479 Task::Set* dependencies) { |
| 437 return RasterTask( | 480 return RasterTask( |
| 438 new RasterWorkerPoolTaskImpl(resource, | 481 new RasterWorkerPoolTaskImpl(resource, |
| 439 picture_pile, | 482 picture_pile, |
| 440 content_rect, | 483 content_rect, |
| 441 contents_scale, | 484 contents_scale, |
| 442 raster_mode, | 485 raster_mode, |
| 443 tile_resolution, | 486 tile_resolution, |
| 444 layer_id, | 487 layer_id, |
| 445 tile_id, | 488 tile_id, |
| 446 source_frame_number, | 489 source_frame_number, |
| 490 use_gpu_rasterization, | |
| 447 rendering_stats, | 491 rendering_stats, |
| 448 reply, | 492 reply, |
| 449 &dependencies->tasks_)); | 493 &dependencies->tasks_)); |
| 450 } | 494 } |
| 451 | 495 |
| 452 // static | 496 // static |
| 453 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( | 497 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( |
| 454 skia::LazyPixelRef* pixel_ref, | 498 skia::LazyPixelRef* pixel_ref, |
| 455 int layer_id, | 499 int layer_id, |
| 456 RenderingStatsInstrumentation* stats_instrumentation, | 500 RenderingStatsInstrumentation* stats_instrumentation, |
| 457 const Task::Reply& reply) { | 501 const Task::Reply& reply) { |
| 458 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, | 502 return Task(new ImageDecodeWorkerPoolTaskImpl(pixel_ref, |
| 459 layer_id, | 503 layer_id, |
| 460 stats_instrumentation, | 504 stats_instrumentation, |
| 461 reply)); | 505 reply)); |
| 462 } | 506 } |
| 463 | 507 |
| 464 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, | 508 RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider, |
| 509 ContextProvider* context_provider, | |
| 465 size_t num_threads) | 510 size_t num_threads) |
| 466 : WorkerPool(num_threads, kWorkerThreadNamePrefix), | 511 : WorkerPool(num_threads, kWorkerThreadNamePrefix), |
| 467 client_(NULL), | 512 client_(NULL), |
| 468 resource_provider_(resource_provider), | 513 resource_provider_(resource_provider), |
| 514 context_provider_(context_provider), | |
| 469 weak_ptr_factory_(this) { | 515 weak_ptr_factory_(this) { |
| 470 } | 516 } |
| 471 | 517 |
| 472 RasterWorkerPool::~RasterWorkerPool() { | 518 RasterWorkerPool::~RasterWorkerPool() { |
| 473 } | 519 } |
| 474 | 520 |
| 475 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 521 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { |
| 476 client_ = client; | 522 client_ = client; |
| 477 } | 523 } |
| 478 | 524 |
| 479 void RasterWorkerPool::Shutdown() { | 525 void RasterWorkerPool::Shutdown() { |
| 480 raster_tasks_.clear(); | 526 raster_tasks_.clear(); |
| 481 TaskGraph empty; | 527 TaskGraph empty; |
| 482 SetTaskGraph(&empty); | 528 SetTaskGraph(&empty); |
| 483 WorkerPool::Shutdown(); | 529 WorkerPool::Shutdown(); |
| 484 weak_ptr_factory_.InvalidateWeakPtrs(); | 530 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 485 } | 531 } |
| 486 | 532 |
| 533 void RasterWorkerPool::CheckForCompletedTasks() { | |
| 534 TRACE_EVENT0("cc", "RasterWorkerPool::CheckForCompletedTasks"); | |
| 535 | |
| 536 WorkerPool::CheckForCompletedTasks(); | |
| 537 | |
| 538 // Complete gpu rasterization tasks. | |
| 539 for (RasterTaskVector::iterator it = gpu_raster_tasks_.begin(); | |
| 540 it != gpu_raster_tasks_.end(); ++it) { | |
|
reveman
2013/12/19 01:36:47
nit: indent should align with RasterTaskV.. not 4
alokp
2013/12/19 06:25:42
Done. Is this in style guide?
reveman
2013/12/19 18:43:36
Maybe not but it's consistent with the rest of the
| |
| 541 internal::RasterWorkerPoolTask* task = it->get(); | |
| 542 task->WillComplete(); | |
| 543 task->CompleteOnOriginThread(); | |
| 544 task->DidComplete(); | |
| 545 } | |
| 546 gpu_raster_tasks_.clear(); | |
| 547 } | |
| 548 | |
| 487 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { | 549 void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) { |
| 488 raster_tasks_.swap(queue->tasks_); | 550 raster_tasks_.swap(queue->tasks_); |
| 489 raster_tasks_required_for_activation_.swap( | 551 raster_tasks_required_for_activation_.swap( |
| 490 queue->tasks_required_for_activation_); | 552 queue->tasks_required_for_activation_); |
| 491 } | 553 } |
| 492 | 554 |
| 493 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( | 555 bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
| 494 internal::RasterWorkerPoolTask* task) const { | 556 internal::RasterWorkerPoolTask* task) const { |
| 495 return | 557 return |
| 496 raster_tasks_required_for_activation_.find(task) != | 558 raster_tasks_required_for_activation_.find(task) != |
| 497 raster_tasks_required_for_activation_.end(); | 559 raster_tasks_required_for_activation_.end(); |
| 498 } | 560 } |
| 499 | 561 |
| 562 void RasterWorkerPool::RunGpuRasterTasks(RasterTaskVector* tasks) { | |
| 563 gpu_raster_tasks_.swap(*tasks); | |
|
vmpstr
2013/12/19 00:30:33
Can you DCHECK that current gpu_raster_tasks_ is e
reveman
2013/12/19 01:36:47
Yes, this function being called multiple times wit
alokp
2013/12/19 06:25:42
Done.
| |
| 564 if (gpu_raster_tasks_.empty()) | |
| 565 return; | |
| 566 | |
| 567 blink::WebGraphicsContext3D* context = context_provider_->Context3d(); | |
| 568 context->makeContextCurrent(); | |
| 569 | |
| 570 GrContext* gr_context = context_provider_->GrContext(); | |
| 571 gr_context->resetContext(); | |
| 572 | |
| 573 for (RasterTaskVector::iterator it = gpu_raster_tasks_.begin(); | |
| 574 it != gpu_raster_tasks_.end(); ++it) { | |
|
reveman
2013/12/19 01:36:47
nit: indent should align with RasterTaskV.. not 4
alokp
2013/12/19 06:25:42
Done.
| |
| 575 internal::RasterWorkerPoolTask* task = it->get(); | |
| 576 DCHECK(task->use_gpu_rasterization()); | |
|
vmpstr
2013/12/19 00:30:33
This is already DCHECKed in RunOnOriginThread, unl
alokp
2013/12/19 06:25:42
This is permanent (if there is such a thing). I am
| |
| 577 task->RunOnOriginThread(resource_provider_, context_provider_); | |
|
reveman
2013/12/19 01:36:47
Can we call DidSchedule() and WillRun() above this
alokp
2013/12/19 06:25:42
There are no RasterWorkerPoolTask::WillRun/DidSche
reveman
2013/12/19 18:43:36
Ah, ok.
| |
| 578 task->DidRun(false); | |
| 579 } | |
| 580 | |
| 581 gr_context->flush(); | |
| 582 } | |
| 583 | |
| 500 scoped_refptr<internal::WorkerPoolTask> | 584 scoped_refptr<internal::WorkerPoolTask> |
| 501 RasterWorkerPool::CreateRasterFinishedTask() { | 585 RasterWorkerPool::CreateRasterFinishedTask() { |
| 502 return make_scoped_refptr( | 586 return make_scoped_refptr( |
| 503 new RasterFinishedWorkerPoolTaskImpl( | 587 new RasterFinishedWorkerPoolTaskImpl( |
| 504 base::Bind(&RasterWorkerPool::OnRasterFinished, | 588 base::Bind(&RasterWorkerPool::OnRasterFinished, |
| 505 weak_ptr_factory_.GetWeakPtr()))); | 589 weak_ptr_factory_.GetWeakPtr()))); |
| 506 } | 590 } |
| 507 | 591 |
| 508 scoped_refptr<internal::WorkerPoolTask> | 592 scoped_refptr<internal::WorkerPoolTask> |
| 509 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { | 593 RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 587 | 671 |
| 588 internal::GraphNode* decode_node = CreateGraphNodeForTask( | 672 internal::GraphNode* decode_node = CreateGraphNodeForTask( |
| 589 decode_task, priority, graph); | 673 decode_task, priority, graph); |
| 590 decode_node->add_dependent(raster_node); | 674 decode_node->add_dependent(raster_node); |
| 591 } | 675 } |
| 592 | 676 |
| 593 return raster_node; | 677 return raster_node; |
| 594 } | 678 } |
| 595 | 679 |
| 596 } // namespace cc | 680 } // namespace cc |
| OLD | NEW |