Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index c3ea50005021f8a1dd963afa3e169da0fa834971..790613a28a3512b743057018ac49a67f2b5ddcbd 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -216,6 +216,7 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
: client_(client), |
proxy_(proxy), |
use_gpu_rasterization_(false), |
+ on_demand_task_graph_runner_(NULL), |
input_handler_client_(NULL), |
did_lock_scrolling_layer_(false), |
should_bubble_scrolls_(false), |
@@ -1883,6 +1884,7 @@ void LayerTreeHostImpl::CreateAndSetTileManager() { |
DirectRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
resource_provider_.get(), |
context_provider); |
+ on_demand_task_graph_runner_ = &synchronous_task_graph_runner_; |
} else if (UseZeroCopyTextureUpload()) { |
resource_pool_ = |
ResourcePool::Create(resource_provider_.get(), |
@@ -1893,6 +1895,7 @@ void LayerTreeHostImpl::CreateAndSetTileManager() { |
ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
RasterWorkerPool::GetTaskGraphRunner(), |
resource_provider_.get()); |
+ on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner(); |
} else if (UseOneCopyTextureUpload()) { |
// We need to create a staging resource pool when using copy rasterizer. |
staging_resource_pool_ = |
@@ -1909,6 +1912,7 @@ void LayerTreeHostImpl::CreateAndSetTileManager() { |
RasterWorkerPool::GetTaskGraphRunner(), |
resource_provider_.get(), |
staging_resource_pool_.get()); |
+ on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner(); |
} else { |
resource_pool_ = ResourcePool::Create( |
resource_provider_.get(), |
@@ -1920,6 +1924,7 @@ void LayerTreeHostImpl::CreateAndSetTileManager() { |
RasterWorkerPool::GetTaskGraphRunner(), |
resource_provider_.get(), |
transfer_buffer_memory_limit_); |
+ on_demand_task_graph_runner_ = RasterWorkerPool::GetTaskGraphRunner(); |
} |
tile_manager_ = |
@@ -1931,6 +1936,7 @@ void LayerTreeHostImpl::CreateAndSetTileManager() { |
UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
need_to_update_visible_tiles_before_draw_ = false; |
+ on_demand_task_namespace_ = on_demand_task_graph_runner_->GetNamespaceToken(); |
} |
void LayerTreeHostImpl::DestroyTileManager() { |
@@ -2761,6 +2767,34 @@ void LayerTreeHostImpl::SetFullRootLayerDamage() { |
SetViewportDamage(gfx::Rect(DrawViewportSize())); |
} |
+void LayerTreeHostImpl::RunOnDemandRasterTask(Task* on_demand_raster_task) { |
+ DCHECK(on_demand_task_graph_runner_); |
+ |
+ // Construct a task graph that contains this single raster task. |
+ TaskGraph graph; |
+ graph.nodes.push_back( |
+ TaskGraph::Node(on_demand_raster_task, |
+ RasterWorkerPool::kOnDemandRasterTaskPriority, |
+ 0u)); |
+ |
+ // Schedule task and wait for task graph runner to finish running it. |
+ on_demand_task_graph_runner_->ScheduleTasks(on_demand_task_namespace_, |
+ &graph); |
+ |
+ if (on_demand_task_graph_runner_ == &synchronous_task_graph_runner_) |
+ on_demand_task_graph_runner_->RunUntilIdle(); |
+ |
+ on_demand_task_graph_runner_->WaitForTasksToFinishRunning( |
+ on_demand_task_namespace_); |
+ |
+ // Collect task now that it has finished running. |
+ Task::Vector completed_tasks; |
+ on_demand_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); |
+} |
+ |
void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) { |
DCHECK(InnerViewportScrollLayer()); |
LayerImpl* scroll_layer = OuterViewportScrollLayer() |