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/direct_raster_worker_pool.h" | 5 #include "cc/resources/direct_raster_worker_pool.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/output/context_provider.h" | 8 #include "cc/output/context_provider.h" |
9 #include "cc/resources/resource.h" | 9 #include "cc/resources/resource.h" |
10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
11 #include "gpu/command_buffer/client/gles2_interface.h" | 11 #include "gpu/command_buffer/client/gles2_interface.h" |
12 #include "third_party/skia/include/gpu/GrContext.h" | 12 #include "third_party/skia/include/gpu/GrContext.h" |
13 | 13 |
14 namespace cc { | 14 namespace cc { |
15 | 15 |
16 // static | 16 // static |
17 scoped_ptr<DirectRasterWorkerPool> DirectRasterWorkerPool::Create( | 17 scoped_ptr<RasterWorkerPool> DirectRasterWorkerPool::Create( |
18 base::SequencedTaskRunner* task_runner, | 18 base::SequencedTaskRunner* task_runner, |
19 ResourceProvider* resource_provider, | 19 ResourceProvider* resource_provider, |
20 ContextProvider* context_provider) { | 20 ContextProvider* context_provider) { |
21 return make_scoped_ptr(new DirectRasterWorkerPool( | 21 return make_scoped_ptr<RasterWorkerPool>(new DirectRasterWorkerPool( |
22 task_runner, resource_provider, context_provider)); | 22 task_runner, resource_provider, context_provider)); |
23 } | 23 } |
24 | 24 |
25 DirectRasterWorkerPool::DirectRasterWorkerPool( | 25 DirectRasterWorkerPool::DirectRasterWorkerPool( |
26 base::SequencedTaskRunner* task_runner, | 26 base::SequencedTaskRunner* task_runner, |
27 ResourceProvider* resource_provider, | 27 ResourceProvider* resource_provider, |
28 ContextProvider* context_provider) | 28 ContextProvider* context_provider) |
29 : task_runner_(task_runner), | 29 : task_runner_(task_runner), |
30 resource_provider_(resource_provider), | 30 resource_provider_(resource_provider), |
31 context_provider_(context_provider), | 31 context_provider_(context_provider), |
32 run_tasks_on_origin_thread_pending_(false), | 32 run_tasks_on_origin_thread_pending_(false), |
33 raster_tasks_pending_(false), | 33 raster_tasks_pending_(false), |
34 raster_tasks_required_for_activation_pending_(false), | 34 raster_tasks_required_for_activation_pending_(false), |
35 raster_finished_weak_ptr_factory_(this), | 35 raster_finished_weak_ptr_factory_(this), |
36 weak_ptr_factory_(this) {} | 36 weak_ptr_factory_(this) {} |
37 | 37 |
38 DirectRasterWorkerPool::~DirectRasterWorkerPool() { | 38 DirectRasterWorkerPool::~DirectRasterWorkerPool() { |
39 DCHECK_EQ(0u, completed_tasks_.size()); | 39 DCHECK_EQ(0u, completed_tasks_.size()); |
40 } | 40 } |
41 | 41 |
42 void DirectRasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { | 42 Rasterizer* DirectRasterWorkerPool::AsRasterizer() { return this; } |
| 43 |
| 44 void DirectRasterWorkerPool::SetClient(RasterizerClient* client) { |
43 client_ = client; | 45 client_ = client; |
44 } | 46 } |
45 | 47 |
46 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 48 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
47 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); | 49 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); |
48 | 50 |
49 DCHECK_EQ(queue->required_for_activation_count, | 51 DCHECK_EQ(queue->required_for_activation_count, |
50 static_cast<size_t>( | 52 static_cast<size_t>( |
51 std::count_if(queue->items.begin(), | 53 std::count_if(queue->items.begin(), |
52 queue->items.end(), | 54 queue->items.end(), |
53 RasterTaskQueue::Item::IsRequiredForActivation))); | 55 RasterTaskQueue::Item::IsRequiredForActivation))); |
54 | 56 |
55 raster_tasks_pending_ = true; | 57 raster_tasks_pending_ = true; |
56 raster_tasks_required_for_activation_pending_ = true; | 58 raster_tasks_required_for_activation_pending_ = true; |
57 | 59 |
58 // Cancel existing OnRasterFinished callbacks. | 60 // Cancel existing OnRasterFinished callbacks. |
59 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 61 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
60 | 62 |
61 scoped_refptr<internal::WorkerPoolTask> | 63 scoped_refptr<internal::RasterizerTask> |
62 new_raster_required_for_activation_finished_task( | 64 new_raster_required_for_activation_finished_task( |
63 CreateRasterRequiredForActivationFinishedTask( | 65 CreateRasterRequiredForActivationFinishedTask( |
64 queue->required_for_activation_count, | 66 queue->required_for_activation_count, |
65 task_runner_.get(), | 67 task_runner_.get(), |
66 base::Bind(&DirectRasterWorkerPool:: | 68 base::Bind(&DirectRasterWorkerPool:: |
67 OnRasterRequiredForActivationFinished, | 69 OnRasterRequiredForActivationFinished, |
68 raster_finished_weak_ptr_factory_.GetWeakPtr()))); | 70 raster_finished_weak_ptr_factory_.GetWeakPtr()))); |
69 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( | 71 scoped_refptr<internal::RasterizerTask> new_raster_finished_task( |
70 CreateRasterFinishedTask( | 72 CreateRasterFinishedTask( |
71 task_runner_.get(), | 73 task_runner_.get(), |
72 base::Bind(&DirectRasterWorkerPool::OnRasterFinished, | 74 base::Bind(&DirectRasterWorkerPool::OnRasterFinished, |
73 raster_finished_weak_ptr_factory_.GetWeakPtr()))); | 75 raster_finished_weak_ptr_factory_.GetWeakPtr()))); |
74 | 76 |
75 // Need to cancel tasks not present in new queue if we haven't had a | 77 // Need to cancel tasks not present in new queue if we haven't had a |
76 // chance to run the previous set of tasks yet. | 78 // chance to run the previous set of tasks yet. |
77 // TODO(reveman): Remove this once only tasks for which | 79 // TODO(reveman): Remove this once only tasks for which |
78 // ::ScheduleOnOriginThread has been called need to be canceled. | 80 // ::ScheduleOnOriginThread has been called need to be canceled. |
79 if (run_tasks_on_origin_thread_pending_) { | 81 if (run_tasks_on_origin_thread_pending_) { |
80 for (RasterTaskQueue::Item::Vector::const_iterator it = | 82 for (RasterTaskQueue::Item::Vector::const_iterator it = |
81 raster_tasks_.items.begin(); | 83 raster_tasks_.items.begin(); |
82 it != raster_tasks_.items.end(); | 84 it != raster_tasks_.items.end(); |
83 ++it) { | 85 ++it) { |
84 internal::RasterWorkerPoolTask* task = it->task; | 86 internal::RasterTask* task = it->task; |
85 | 87 |
86 if (std::find_if(queue->items.begin(), | 88 if (std::find_if(queue->items.begin(), |
87 queue->items.end(), | 89 queue->items.end(), |
88 RasterTaskQueue::Item::TaskComparator(task)) == | 90 RasterTaskQueue::Item::TaskComparator(task)) == |
89 queue->items.end()) | 91 queue->items.end()) |
90 completed_tasks_.push_back(task); | 92 completed_tasks_.push_back(task); |
91 } | 93 } |
92 } | 94 } |
93 | 95 |
94 ScheduleRunTasksOnOriginThread(); | 96 ScheduleRunTasksOnOriginThread(); |
95 | 97 |
96 raster_tasks_.Swap(queue); | 98 raster_tasks_.Swap(queue); |
97 | 99 |
98 raster_finished_task_ = new_raster_finished_task; | 100 raster_finished_task_ = new_raster_finished_task; |
99 raster_required_for_activation_finished_task_ = | 101 raster_required_for_activation_finished_task_ = |
100 new_raster_required_for_activation_finished_task; | 102 new_raster_required_for_activation_finished_task; |
101 } | 103 } |
102 | 104 |
103 unsigned DirectRasterWorkerPool::GetResourceTarget() const { | 105 unsigned DirectRasterWorkerPool::GetResourceTarget() const { |
104 return GL_TEXTURE_2D; | 106 return GL_TEXTURE_2D; |
105 } | 107 } |
106 | 108 |
107 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { | 109 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { |
108 return resource_provider_->best_texture_format(); | 110 return resource_provider_->best_texture_format(); |
109 } | 111 } |
110 | 112 |
111 void DirectRasterWorkerPool::CheckForCompletedTasks() { | 113 void DirectRasterWorkerPool::CheckForCompletedTasks() { |
112 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); | 114 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); |
113 | 115 |
114 for (internal::WorkerPoolTask::Vector::const_iterator it = | 116 for (internal::RasterizerTask::Vector::const_iterator it = |
115 completed_tasks_.begin(); | 117 completed_tasks_.begin(); |
116 it != completed_tasks_.end(); | 118 it != completed_tasks_.end(); |
117 ++it) { | 119 ++it) { |
118 internal::WorkerPoolTask* task = it->get(); | 120 internal::RasterizerTask* task = it->get(); |
119 | 121 |
120 task->RunReplyOnOriginThread(); | 122 task->RunReplyOnOriginThread(); |
121 } | 123 } |
122 completed_tasks_.clear(); | 124 completed_tasks_.clear(); |
123 } | 125 } |
124 | 126 |
125 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( | 127 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( |
126 internal::WorkerPoolTask* task, | 128 internal::RasterTask* task) { |
127 const Resource* resource) { | 129 return resource_provider_->MapDirectRasterBuffer(task->resource()->id()); |
128 return resource_provider_->MapDirectRasterBuffer(resource->id()); | |
129 } | 130 } |
130 | 131 |
131 void DirectRasterWorkerPool::ReleaseCanvasForRaster( | 132 void DirectRasterWorkerPool::ReleaseCanvasForRaster( |
132 internal::WorkerPoolTask* task, | 133 internal::RasterTask* task) { |
133 const Resource* resource) { | 134 resource_provider_->UnmapDirectRasterBuffer(task->resource()->id()); |
134 resource_provider_->UnmapDirectRasterBuffer(resource->id()); | |
135 } | 135 } |
136 | 136 |
137 void DirectRasterWorkerPool::OnRasterFinished() { | 137 void DirectRasterWorkerPool::OnRasterFinished() { |
138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished"); | 138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished"); |
139 | 139 |
140 DCHECK(raster_tasks_pending_); | 140 DCHECK(raster_tasks_pending_); |
141 raster_tasks_pending_ = false; | 141 raster_tasks_pending_ = false; |
142 client_->DidFinishRunningTasks(); | 142 client_->DidFinishRunningTasks(); |
143 } | 143 } |
144 | 144 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 | 179 |
180 GrContext* gr_context = context_provider_->GrContext(); | 180 GrContext* gr_context = context_provider_->GrContext(); |
181 // TODO(alokp): Implement TestContextProvider::GrContext(). | 181 // TODO(alokp): Implement TestContextProvider::GrContext(). |
182 if (gr_context) | 182 if (gr_context) |
183 gr_context->resetContext(); | 183 gr_context->resetContext(); |
184 | 184 |
185 for (RasterTaskQueue::Item::Vector::const_iterator it = | 185 for (RasterTaskQueue::Item::Vector::const_iterator it = |
186 raster_tasks_.items.begin(); | 186 raster_tasks_.items.begin(); |
187 it != raster_tasks_.items.end(); | 187 it != raster_tasks_.items.end(); |
188 ++it) { | 188 ++it) { |
189 internal::RasterWorkerPoolTask* task = it->task; | 189 internal::RasterTask* task = it->task; |
190 DCHECK(!task->HasCompleted()); | 190 DCHECK(!task->HasCompleted()); |
191 | 191 |
192 // First need to run all dependencies. | 192 // First need to run all dependencies. |
193 for (internal::WorkerPoolTask::Vector::const_iterator it = | 193 for (internal::ImageDecodeTask::Vector::const_iterator it = |
194 task->dependencies().begin(); | 194 task->dependencies().begin(); |
195 it != task->dependencies().end(); | 195 it != task->dependencies().end(); |
196 ++it) { | 196 ++it) { |
197 internal::WorkerPoolTask* dependency = it->get(); | 197 internal::ImageDecodeTask* dependency = it->get(); |
198 if (dependency->HasCompleted()) | 198 if (dependency->HasCompleted()) |
199 continue; | 199 continue; |
200 | 200 |
201 RunTaskOnOriginThread(dependency); | 201 RunTaskOnOriginThread(dependency); |
202 completed_tasks_.push_back(dependency); | 202 completed_tasks_.push_back(dependency); |
203 } | 203 } |
204 | 204 |
205 RunTaskOnOriginThread(task); | 205 RunTaskOnOriginThread(task); |
206 completed_tasks_.push_back(task); | 206 completed_tasks_.push_back(task); |
207 } | 207 } |
208 | 208 |
209 // TODO(alokp): Implement TestContextProvider::GrContext(). | 209 // TODO(alokp): Implement TestContextProvider::GrContext(). |
210 if (gr_context) | 210 if (gr_context) |
211 gr_context->flush(); | 211 gr_context->flush(); |
212 | 212 |
213 context_provider_->ContextGL()->PopGroupMarkerEXT(); | 213 context_provider_->ContextGL()->PopGroupMarkerEXT(); |
214 } | 214 } |
215 | 215 |
216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get()); | 216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get()); |
217 RunTaskOnOriginThread(raster_finished_task_.get()); | 217 RunTaskOnOriginThread(raster_finished_task_.get()); |
218 } | 218 } |
219 | 219 |
220 void DirectRasterWorkerPool::RunTaskOnOriginThread( | 220 void DirectRasterWorkerPool::RunTaskOnOriginThread( |
221 internal::WorkerPoolTask* task) { | 221 internal::RasterizerTask* task) { |
222 task->WillSchedule(); | 222 task->WillSchedule(); |
223 task->ScheduleOnOriginThread(this); | 223 task->ScheduleOnOriginThread(this); |
224 task->DidSchedule(); | 224 task->DidSchedule(); |
225 | 225 |
226 task->WillRun(); | 226 task->WillRun(); |
227 task->RunOnOriginThread(); | 227 task->RunOnOriginThread(); |
228 task->DidRun(); | 228 task->DidRun(); |
229 | 229 |
230 task->WillComplete(); | 230 task->WillComplete(); |
231 task->CompleteOnOriginThread(this); | 231 task->CompleteOnOriginThread(this); |
232 task->DidComplete(); | 232 task->DidComplete(); |
233 } | 233 } |
234 | 234 |
235 } // namespace cc | 235 } // namespace cc |
OLD | NEW |