| 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.
|
| + 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;
|
|
|