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/raster/zero_copy_tile_task_worker_pool.h" | 5 #include "cc/raster/zero_copy_tile_task_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 | 73 |
74 ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool( | 74 ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool( |
75 base::SequencedTaskRunner* task_runner, | 75 base::SequencedTaskRunner* task_runner, |
76 TaskGraphRunner* task_graph_runner, | 76 TaskGraphRunner* task_graph_runner, |
77 ResourceProvider* resource_provider, | 77 ResourceProvider* resource_provider, |
78 bool use_rgba_4444_texture_format) | 78 bool use_rgba_4444_texture_format) |
79 : task_runner_(task_runner), | 79 : task_runner_(task_runner), |
80 task_graph_runner_(task_graph_runner), | 80 task_graph_runner_(task_graph_runner), |
81 namespace_token_(task_graph_runner->GetNamespaceToken()), | 81 namespace_token_(task_graph_runner->GetNamespaceToken()), |
82 resource_provider_(resource_provider), | 82 resource_provider_(resource_provider), |
83 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), | 83 use_rgba_4444_texture_format_(use_rgba_4444_texture_format) {} |
84 task_set_finished_weak_ptr_factory_(this) {} | |
85 | 84 |
86 ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() { | 85 ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() { |
87 } | 86 } |
88 | 87 |
89 TileTaskRunner* ZeroCopyTileTaskWorkerPool::AsTileTaskRunner() { | 88 TileTaskRunner* ZeroCopyTileTaskWorkerPool::AsTileTaskRunner() { |
90 return this; | 89 return this; |
91 } | 90 } |
92 | 91 |
93 void ZeroCopyTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { | |
94 client_ = client; | |
95 } | |
96 | |
97 void ZeroCopyTileTaskWorkerPool::Shutdown() { | 92 void ZeroCopyTileTaskWorkerPool::Shutdown() { |
98 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::Shutdown"); | 93 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::Shutdown"); |
99 | 94 |
100 TaskGraph empty; | 95 TaskGraph empty; |
101 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 96 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
102 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 97 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
103 } | 98 } |
104 | 99 |
105 void ZeroCopyTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { | 100 void ZeroCopyTileTaskWorkerPool::ScheduleTasks(TaskGraph* graph) { |
106 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::ScheduleTasks"); | 101 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::ScheduleTasks"); |
107 | 102 |
108 if (tasks_pending_.none()) | 103 ScheduleTasksOnOriginThread(this, graph); |
109 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 104 task_graph_runner_->ScheduleTasks(namespace_token_, graph); |
110 | |
111 // Mark all task sets as pending. | |
112 tasks_pending_.set(); | |
113 | |
114 size_t priority = kTileTaskPriorityBase; | |
115 | |
116 graph_.Reset(); | |
117 | |
118 // Cancel existing OnTaskSetFinished callbacks. | |
119 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | |
120 | |
121 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; | |
122 | |
123 size_t task_count[kNumberOfTaskSets] = {0}; | |
124 | |
125 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
126 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( | |
127 task_runner_.get(), | |
128 base::Bind(&ZeroCopyTileTaskWorkerPool::OnTaskSetFinished, | |
129 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); | |
130 } | |
131 | |
132 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | |
133 it != queue->items.end(); ++it) { | |
134 const TileTaskQueue::Item& item = *it; | |
135 RasterTask* task = item.task; | |
136 DCHECK(!task->HasCompleted()); | |
137 | |
138 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
139 if (!item.task_sets[task_set]) | |
140 continue; | |
141 | |
142 ++task_count[task_set]; | |
143 | |
144 graph_.edges.push_back( | |
145 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); | |
146 } | |
147 | |
148 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | |
149 } | |
150 | |
151 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
152 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), | |
153 kTaskSetFinishedTaskPriorityBase + task_set, | |
154 task_count[task_set]); | |
155 } | |
156 | |
157 ScheduleTasksOnOriginThread(this, &graph_); | |
158 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | |
159 | |
160 std::copy(new_task_set_finished_tasks, | |
161 new_task_set_finished_tasks + kNumberOfTaskSets, | |
162 task_set_finished_tasks_); | |
163 | |
164 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", | |
165 StateAsValue()); | |
166 } | 105 } |
167 | 106 |
168 void ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks() { | 107 void ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks() { |
169 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks"); | 108 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks"); |
170 | 109 |
171 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 110 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
172 &completed_tasks_); | 111 &completed_tasks_); |
173 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 112 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
174 it != completed_tasks_.end(); ++it) { | 113 it != completed_tasks_.end(); ++it) { |
175 TileTask* task = static_cast<TileTask*>(it->get()); | 114 TileTask* task = static_cast<TileTask*>(it->get()); |
(...skipping 24 matching lines...) Expand all Loading... |
200 uint64_t previous_content_id) { | 139 uint64_t previous_content_id) { |
201 return make_scoped_ptr<RasterBuffer>( | 140 return make_scoped_ptr<RasterBuffer>( |
202 new RasterBufferImpl(resource_provider_, resource)); | 141 new RasterBufferImpl(resource_provider_, resource)); |
203 } | 142 } |
204 | 143 |
205 void ZeroCopyTileTaskWorkerPool::ReleaseBufferForRaster( | 144 void ZeroCopyTileTaskWorkerPool::ReleaseBufferForRaster( |
206 scoped_ptr<RasterBuffer> buffer) { | 145 scoped_ptr<RasterBuffer> buffer) { |
207 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 146 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
208 } | 147 } |
209 | 148 |
210 void ZeroCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { | |
211 TRACE_EVENT1("cc", "ZeroCopyTileTaskWorkerPool::OnTaskSetFinished", | |
212 "task_set", task_set); | |
213 | |
214 DCHECK(tasks_pending_[task_set]); | |
215 tasks_pending_[task_set] = false; | |
216 if (tasks_pending_.any()) { | |
217 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", | |
218 "state", StateAsValue()); | |
219 } else { | |
220 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | |
221 } | |
222 client_->DidFinishRunningTileTasks(task_set); | |
223 } | |
224 | |
225 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | |
226 ZeroCopyTileTaskWorkerPool::StateAsValue() const { | |
227 scoped_refptr<base::trace_event::TracedValue> state = | |
228 new base::trace_event::TracedValue(); | |
229 | |
230 state->BeginArray("tasks_pending"); | |
231 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | |
232 state->AppendBoolean(tasks_pending_[task_set]); | |
233 state->EndArray(); | |
234 return state; | |
235 } | |
236 | |
237 } // namespace cc | 149 } // namespace cc |
OLD | NEW |