Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index e09d004a0114f85342324be1d864034f50410e7b..bcb5f86863ab13017d0b4060e79eb8e2de9bd97a 100644 |
| --- a/cc/output/gl_renderer.cc |
| +++ b/cc/output/gl_renderer.cc |
| @@ -78,6 +78,41 @@ class SimpleSwapFence : public ResourceProvider::Fence { |
| bool has_passed_; |
| }; |
| +class OnDemandRasterTaskImpl : public internal::Task { |
| + public: |
| + OnDemandRasterTaskImpl(PicturePileImpl* picture_pile, |
| + SkBitmap* bitmap, |
| + gfx::Rect contents_rect, |
| + float contents_scale) |
| + : picture_pile_(picture_pile), |
| + bitmap_(bitmap), |
| + contents_rect_(contents_rect), |
| + contents_scale_(contents_scale) { |
| + DCHECK(picture_pile_); |
| + DCHECK(bitmap_); |
| + } |
| + |
| + // Overridden from internal::Task: |
| + virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
| + TRACE_EVENT0("cc", "OnDemandRasterTaskImpl::RunOnWorkerThread"); |
| + SkBitmapDevice device(*bitmap_); |
| + SkCanvas canvas(&device); |
| + picture_pile_->RasterToBitmap( |
| + &canvas, contents_rect_, contents_scale_, NULL); |
| + } |
| + |
| + protected: |
| + virtual ~OnDemandRasterTaskImpl() {} |
| + |
| + private: |
| + PicturePileImpl* picture_pile_; |
| + SkBitmap* bitmap_; |
| + const gfx::Rect contents_rect_; |
| + const float contents_scale_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(OnDemandRasterTaskImpl); |
| +}; |
| + |
| bool NeedsIOSurfaceReadbackWorkaround() { |
| #if defined(OS_MACOSX) |
| // This isn't strictly required in DumpRenderTree-mode when Mesa is used, |
| @@ -1720,8 +1755,36 @@ void GLRenderer::DrawPictureQuad(const DrawingFrame* frame, |
| SkBitmapDevice device(on_demand_tile_raster_bitmap_); |
| SkCanvas canvas(&device); |
| - quad->picture_pile->RasterToBitmap( |
| - &canvas, quad->content_rect, quad->contents_scale, NULL); |
| + internal::TaskGraphRunner* task_graph_runner = |
| + RasterWorkerPool::GetTaskGraphRunner(); |
| + // Make sure we have a unique task namespace token. |
| + if (!on_demand_task_namespace_.IsValid()) |
| + on_demand_task_namespace_ = task_graph_runner->GetNamespaceToken(); |
| + |
| + // Create a raster task for for tile. |
| + scoped_refptr<internal::Task> on_demand_raster_task( |
| + new OnDemandRasterTaskImpl(quad->picture_pile, |
| + &on_demand_tile_raster_bitmap_, |
| + quad->content_rect, |
| + quad->contents_scale)); |
| + |
| + // Construct a task graph that contains this single raster task. |
| + internal::TaskGraph graph; |
| + graph.nodes.push_back( |
| + internal::TaskGraph::Node(on_demand_raster_task.get(), |
| + RasterWorkerPool::kOnDemandRasterTaskPriority, |
| + 0u)); |
| + |
| + // Schedule task and wait for task grap runner to finish running it. |
|
enne (OOO)
2014/02/11 22:30:45
typo
reveman
2014/02/11 23:40:42
Done.
|
| + task_graph_runner->SetTaskGraph(on_demand_task_namespace_, &graph); |
| + task_graph_runner->WaitForTasksToFinishRunning(on_demand_task_namespace_); |
| + |
| + // Collect task now that it has finished running. |
| + internal::Task::Vector completed_tasks; |
| + task_graph_runner->CollectCompletedTasks(on_demand_task_namespace_, |
| + &completed_tasks); |
| + DCHECK_EQ(1u, completed_tasks.size()); |
| + DCHECK_EQ(completed_tasks[0], on_demand_raster_task.get()); |
| uint8_t* bitmap_pixels = NULL; |
| SkBitmap on_demand_tile_raster_bitmap_dest; |