OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/gpu_raster_worker_pool.h" | 5 #include "cc/resources/gpu_tile_task_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
11 #include "cc/resources/raster_buffer.h" | 11 #include "cc/resources/raster_buffer.h" |
12 #include "cc/resources/raster_source.h" | 12 #include "cc/resources/raster_source.h" |
13 #include "cc/resources/resource.h" | 13 #include "cc/resources/resource.h" |
14 #include "cc/resources/resource_provider.h" | 14 #include "cc/resources/resource_provider.h" |
15 #include "cc/resources/scoped_gpu_raster.h" | 15 #include "cc/resources/scoped_gpu_raster.h" |
(...skipping 27 matching lines...) Expand all Loading... |
43 raster_source->ShouldAttemptToUseDistanceFieldText(); | 43 raster_source->ShouldAttemptToUseDistanceFieldText(); |
44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text, | 44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text, |
45 raster_source->CanUseLCDText()); | 45 raster_source->CanUseLCDText()); |
46 | 46 |
47 if (!sk_surface) | 47 if (!sk_surface) |
48 return; | 48 return; |
49 | 49 |
50 SkPictureRecorder recorder; | 50 SkPictureRecorder recorder; |
51 gfx::Size size = resource_->size(); | 51 gfx::Size size = resource_->size(); |
52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; | 52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; |
53 skia::RefPtr<SkCanvas> canvas = | 53 skia::RefPtr<SkCanvas> canvas = skia::SharePtr( |
54 skia::SharePtr(recorder.beginRecording(size.width(), size.height(), | 54 recorder.beginRecording(size.width(), size.height(), NULL, flags)); |
55 NULL, flags)); | |
56 | |
57 | 55 |
58 canvas->save(); | 56 canvas->save(); |
59 raster_source->PlaybackToCanvas(canvas.get(), rect, scale); | 57 raster_source->PlaybackToCanvas(canvas.get(), rect, scale); |
60 canvas->restore(); | 58 canvas->restore(); |
61 | 59 |
62 // Add the canvas and recorded picture to |multi_picture_draw_|. | 60 // Add the canvas and recorded picture to |multi_picture_draw_|. |
63 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); | 61 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); |
64 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get()); | 62 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get()); |
65 } | 63 } |
66 | 64 |
67 private: | 65 private: |
68 ResourceProvider::ScopedWriteLockGr lock_; | 66 ResourceProvider::ScopedWriteLockGr lock_; |
69 const Resource* resource_; | 67 const Resource* resource_; |
70 SkMultiPictureDraw* multi_picture_draw_; | 68 SkMultiPictureDraw* multi_picture_draw_; |
71 bool use_distance_field_text_; | 69 bool use_distance_field_text_; |
72 | 70 |
73 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
74 }; | 72 }; |
75 | 73 |
76 } // namespace | 74 } // namespace |
77 | 75 |
78 // static | 76 // static |
79 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( | 77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( |
80 base::SequencedTaskRunner* task_runner, | 78 base::SequencedTaskRunner* task_runner, |
81 ContextProvider* context_provider, | 79 ContextProvider* context_provider, |
82 ResourceProvider* resource_provider, | 80 ResourceProvider* resource_provider, |
83 bool use_distance_field_text) { | 81 bool use_distance_field_text) { |
84 return make_scoped_ptr<RasterWorkerPool>( | 82 return make_scoped_ptr<TileTaskWorkerPool>( |
85 new GpuRasterWorkerPool(task_runner, | 83 new GpuTileTaskWorkerPool(task_runner, context_provider, |
86 context_provider, | 84 resource_provider, use_distance_field_text)); |
87 resource_provider, | |
88 use_distance_field_text)); | |
89 } | 85 } |
90 | 86 |
91 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, | 87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( |
92 ContextProvider* context_provider, | 88 base::SequencedTaskRunner* task_runner, |
93 ResourceProvider* resource_provider, | 89 ContextProvider* context_provider, |
94 bool use_distance_field_text) | 90 ResourceProvider* resource_provider, |
| 91 bool use_distance_field_text) |
95 : task_runner_(task_runner), | 92 : task_runner_(task_runner), |
96 task_graph_runner_(new TaskGraphRunner), | 93 task_graph_runner_(new TaskGraphRunner), |
97 namespace_token_(task_graph_runner_->GetNamespaceToken()), | 94 namespace_token_(task_graph_runner_->GetNamespaceToken()), |
98 context_provider_(context_provider), | 95 context_provider_(context_provider), |
99 resource_provider_(resource_provider), | 96 resource_provider_(resource_provider), |
100 run_tasks_on_origin_thread_pending_(false), | 97 run_tasks_on_origin_thread_pending_(false), |
101 use_distance_field_text_(use_distance_field_text), | 98 use_distance_field_text_(use_distance_field_text), |
102 raster_finished_weak_ptr_factory_(this), | 99 task_set_finished_weak_ptr_factory_(this), |
103 weak_ptr_factory_(this) { | 100 weak_ptr_factory_(this) { |
104 DCHECK(context_provider_); | 101 DCHECK(context_provider_); |
105 } | 102 } |
106 | 103 |
107 GpuRasterWorkerPool::~GpuRasterWorkerPool() { | 104 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() { |
108 DCHECK_EQ(0u, completed_tasks_.size()); | 105 DCHECK_EQ(0u, completed_tasks_.size()); |
109 } | 106 } |
110 | 107 |
111 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { | 108 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() { |
112 return this; | 109 return this; |
113 } | 110 } |
114 | 111 |
115 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { | 112 void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { |
116 client_ = client; | 113 client_ = client; |
117 } | 114 } |
118 | 115 |
119 void GpuRasterWorkerPool::Shutdown() { | 116 void GpuTileTaskWorkerPool::Shutdown() { |
120 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); | 117 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown"); |
121 | 118 |
122 TaskGraph empty; | 119 TaskGraph empty; |
123 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 120 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
124 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 121 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
125 } | 122 } |
126 | 123 |
127 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 124 void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { |
128 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); | 125 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks"); |
129 | 126 |
130 // Mark all task sets as pending. | 127 // Mark all task sets as pending. |
131 raster_pending_.set(); | 128 tasks_pending_.set(); |
132 | 129 |
133 unsigned priority = kRasterTaskPriorityBase; | 130 unsigned priority = kTileTaskPriorityBase; |
134 | 131 |
135 graph_.Reset(); | 132 graph_.Reset(); |
136 | 133 |
137 // Cancel existing OnRasterFinished callbacks. | 134 // Cancel existing OnTaskSetFinished callbacks. |
138 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 135 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
139 | 136 |
140 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 137 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; |
141 | 138 |
142 size_t task_count[kNumberOfTaskSets] = {0}; | 139 size_t task_count[kNumberOfTaskSets] = {0}; |
143 | 140 |
144 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 141 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
145 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 142 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( |
146 task_runner_.get(), | 143 task_runner_.get(), |
147 base::Bind(&GpuRasterWorkerPool::OnRasterFinished, | 144 base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished, |
148 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 145 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); |
149 task_set)); | |
150 } | 146 } |
151 | 147 |
152 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 148 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
153 it != queue->items.end(); | 149 it != queue->items.end(); ++it) { |
154 ++it) { | 150 const TileTaskQueue::Item& item = *it; |
155 const RasterTaskQueue::Item& item = *it; | |
156 RasterTask* task = item.task; | 151 RasterTask* task = item.task; |
157 DCHECK(!task->HasCompleted()); | 152 DCHECK(!task->HasCompleted()); |
158 | 153 |
159 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 154 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
160 if (!item.task_sets[task_set]) | 155 if (!item.task_sets[task_set]) |
161 continue; | 156 continue; |
162 | 157 |
163 ++task_count[task_set]; | 158 ++task_count[task_set]; |
164 | 159 |
165 graph_.edges.push_back( | 160 graph_.edges.push_back( |
166 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get())); | 161 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); |
167 } | 162 } |
168 | 163 |
169 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | 164 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); |
170 } | 165 } |
171 | 166 |
172 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
173 InsertNodeForTask(&graph_, | 168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), |
174 new_raster_finished_tasks[task_set].get(), | 169 kTaskSetFinishedTaskPriority, task_count[task_set]); |
175 kRasterFinishedTaskPriority, | |
176 task_count[task_set]); | |
177 } | 170 } |
178 | 171 |
179 ScheduleTasksOnOriginThread(this, &graph_); | 172 ScheduleTasksOnOriginThread(this, &graph_); |
180 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
181 | 174 |
182 ScheduleRunTasksOnOriginThread(); | 175 ScheduleRunTasksOnOriginThread(); |
183 | 176 |
184 std::copy(new_raster_finished_tasks, | 177 std::copy(new_task_set_finished_tasks, |
185 new_raster_finished_tasks + kNumberOfTaskSets, | 178 new_task_set_finished_tasks + kNumberOfTaskSets, |
186 raster_finished_tasks_); | 179 task_set_finished_tasks_); |
187 } | 180 } |
188 | 181 |
189 void GpuRasterWorkerPool::CheckForCompletedTasks() { | 182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { |
190 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); | 183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); |
191 | 184 |
192 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 185 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
193 &completed_tasks_); | 186 &completed_tasks_); |
194 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 187 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
195 it != completed_tasks_.end(); | 188 it != completed_tasks_.end(); ++it) { |
196 ++it) { | 189 TileTask* task = static_cast<TileTask*>(it->get()); |
197 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | |
198 | 190 |
199 task->WillComplete(); | 191 task->WillComplete(); |
200 task->CompleteOnOriginThread(this); | 192 task->CompleteOnOriginThread(this); |
201 task->DidComplete(); | 193 task->DidComplete(); |
202 | 194 |
203 task->RunReplyOnOriginThread(); | 195 task->RunReplyOnOriginThread(); |
204 } | 196 } |
205 completed_tasks_.clear(); | 197 completed_tasks_.clear(); |
206 } | 198 } |
207 | 199 |
208 scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( | 200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( |
209 const Resource* resource) { | 201 const Resource* resource) { |
210 return make_scoped_ptr<RasterBuffer>( | 202 return make_scoped_ptr<RasterBuffer>( |
211 new RasterBufferImpl(resource_provider_, | 203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_, |
212 resource, | |
213 &multi_picture_draw_, | |
214 use_distance_field_text_)); | 204 use_distance_field_text_)); |
215 } | 205 } |
216 | 206 |
217 void GpuRasterWorkerPool::ReleaseBufferForRaster( | 207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( |
218 scoped_ptr<RasterBuffer> buffer) { | 208 scoped_ptr<RasterBuffer> buffer) { |
219 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
220 } | 210 } |
221 | 211 |
222 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
223 TRACE_EVENT1( | 213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", |
224 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 214 task_set); |
225 | 215 |
226 DCHECK(raster_pending_[task_set]); | 216 DCHECK(tasks_pending_[task_set]); |
227 raster_pending_[task_set] = false; | 217 tasks_pending_[task_set] = false; |
228 client_->DidFinishRunningTasks(task_set); | 218 client_->DidFinishRunningTileTasks(task_set); |
229 } | 219 } |
230 | 220 |
231 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { | 221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() { |
232 if (run_tasks_on_origin_thread_pending_) | 222 if (run_tasks_on_origin_thread_pending_) |
233 return; | 223 return; |
234 | 224 |
235 task_runner_->PostTask( | 225 task_runner_->PostTask( |
236 FROM_HERE, | 226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread, |
237 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, | 227 weak_ptr_factory_.GetWeakPtr())); |
238 weak_ptr_factory_.GetWeakPtr())); | |
239 run_tasks_on_origin_thread_pending_ = true; | 228 run_tasks_on_origin_thread_pending_ = true; |
240 } | 229 } |
241 | 230 |
242 void GpuRasterWorkerPool::RunTasksOnOriginThread() { | 231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() { |
243 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); | 232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread"); |
244 | 233 |
245 DCHECK(run_tasks_on_origin_thread_pending_); | 234 DCHECK(run_tasks_on_origin_thread_pending_); |
246 run_tasks_on_origin_thread_pending_ = false; | 235 run_tasks_on_origin_thread_pending_ = false; |
247 | 236 |
248 ScopedGpuRaster gpu_raster(context_provider_); | 237 ScopedGpuRaster gpu_raster(context_provider_); |
249 task_graph_runner_->RunUntilIdle(); | 238 task_graph_runner_->RunUntilIdle(); |
250 | 239 |
251 // Draw each all of the pictures that were collected. This will also clear | 240 // Draw each all of the pictures that were collected. This will also clear |
252 // the pictures and canvases added to |multi_picture_draw_| | 241 // the pictures and canvases added to |multi_picture_draw_| |
253 multi_picture_draw_.draw(); | 242 multi_picture_draw_.draw(); |
254 } | 243 } |
255 | 244 |
256 } // namespace cc | 245 } // namespace cc |
OLD | NEW |