Chromium Code Reviews| 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 #ifndef CC_RESOURCES_RASTER_WORKER_POOL_H_ | 5 #ifndef CC_RESOURCES_RASTER_WORKER_POOL_H_ |
| 6 #define CC_RESOURCES_RASTER_WORKER_POOL_H_ | 6 #define CC_RESOURCES_RASTER_WORKER_POOL_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 class CC_EXPORT RasterWorkerPoolClient { | 86 class CC_EXPORT RasterWorkerPoolClient { |
| 87 public: | 87 public: |
| 88 virtual bool ShouldForceTasksRequiredForActivationToComplete() const = 0; | 88 virtual bool ShouldForceTasksRequiredForActivationToComplete() const = 0; |
| 89 virtual void DidFinishRunningTasks() = 0; | 89 virtual void DidFinishRunningTasks() = 0; |
| 90 virtual void DidFinishRunningTasksRequiredForActivation() = 0; | 90 virtual void DidFinishRunningTasksRequiredForActivation() = 0; |
| 91 | 91 |
| 92 protected: | 92 protected: |
| 93 virtual ~RasterWorkerPoolClient() {} | 93 virtual ~RasterWorkerPoolClient() {} |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 struct CC_EXPORT RasterTaskQueue { | |
| 97 struct CC_EXPORT Item { | |
| 98 class TaskComparator { | |
| 99 public: | |
| 100 explicit TaskComparator(const internal::RasterWorkerPoolTask* task) | |
| 101 : task_(task) {} | |
| 102 | |
| 103 bool operator()(const Item& item) const { return item.task == task_; } | |
| 104 | |
| 105 private: | |
| 106 const internal::RasterWorkerPoolTask* task_; | |
| 107 }; | |
| 108 | |
| 109 typedef std::vector<Item> Vector; | |
| 110 | |
| 111 Item(internal::RasterWorkerPoolTask* task, bool required_for_activation); | |
| 112 ~Item(); | |
| 113 | |
| 114 static bool IsRequiredForActivation(const Item& item) { | |
| 115 return item.required_for_activation; | |
| 116 } | |
| 117 | |
| 118 scoped_refptr<internal::RasterWorkerPoolTask> task; | |
| 119 bool required_for_activation; | |
| 120 }; | |
| 121 | |
| 122 RasterTaskQueue(); | |
| 123 ~RasterTaskQueue(); | |
| 124 | |
| 125 void Swap(RasterTaskQueue* other); | |
|
vmpstr
2014/02/18 21:10:23
This might be awkward, but wdyt about adding Begin
| |
| 126 void Reset(); | |
| 127 | |
| 128 Item::Vector items; | |
| 129 size_t required_for_activation_count; | |
| 130 }; | |
| 131 | |
| 96 // A worker thread pool that runs raster tasks. | 132 // A worker thread pool that runs raster tasks. |
| 97 class CC_EXPORT RasterWorkerPool : public internal::WorkerPoolTaskClient { | 133 class CC_EXPORT RasterWorkerPool : public internal::WorkerPoolTaskClient { |
| 98 public: | 134 public: |
| 99 class CC_EXPORT Task { | |
| 100 public: | |
| 101 typedef base::Callback<void(bool was_canceled)> Reply; | |
| 102 | |
| 103 class CC_EXPORT Set { | |
| 104 public: | |
| 105 Set(); | |
| 106 ~Set(); | |
| 107 | |
| 108 void Insert(const Task& task); | |
| 109 | |
| 110 private: | |
| 111 friend class RasterWorkerPool; | |
| 112 | |
| 113 internal::WorkerPoolTask::Vector tasks_; | |
| 114 }; | |
| 115 | |
| 116 Task(); | |
| 117 ~Task(); | |
| 118 | |
| 119 // Returns true if Task is null (doesn't refer to anything). | |
| 120 bool is_null() const { return !internal_.get(); } | |
| 121 | |
| 122 // Returns the Task into an uninitialized state. | |
| 123 void Reset(); | |
| 124 | |
| 125 protected: | |
| 126 friend class RasterWorkerPool; | |
| 127 | |
| 128 explicit Task(internal::WorkerPoolTask* internal); | |
| 129 | |
| 130 scoped_refptr<internal::WorkerPoolTask> internal_; | |
| 131 }; | |
| 132 | |
| 133 class CC_EXPORT RasterTask { | |
| 134 public: | |
| 135 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, | |
| 136 bool was_canceled)> Reply; | |
| 137 | |
| 138 class CC_EXPORT Queue { | |
| 139 public: | |
| 140 Queue(); | |
| 141 ~Queue(); | |
| 142 | |
| 143 void Reset(); | |
| 144 void Append(const RasterTask& task, bool required_for_activation); | |
| 145 void Swap(Queue* other); | |
| 146 | |
| 147 size_t count() const { return tasks_.size(); } | |
| 148 size_t required_for_activation_count() const { | |
| 149 return required_for_activation_count_; | |
| 150 } | |
| 151 | |
| 152 private: | |
| 153 friend class RasterWorkerPool; | |
| 154 friend class DirectRasterWorkerPool; | |
| 155 | |
| 156 struct QueuedTask { | |
| 157 class TaskComparator { | |
| 158 public: | |
| 159 explicit TaskComparator(const internal::RasterWorkerPoolTask* task) | |
| 160 : task_(task) {} | |
| 161 | |
| 162 bool operator()(const QueuedTask& queued_task) const { | |
| 163 return queued_task.task == task_; | |
| 164 } | |
| 165 | |
| 166 private: | |
| 167 const internal::RasterWorkerPoolTask* task_; | |
| 168 }; | |
| 169 | |
| 170 typedef std::vector<QueuedTask> Vector; | |
| 171 | |
| 172 QueuedTask(internal::RasterWorkerPoolTask* task, | |
| 173 bool required_for_activation); | |
| 174 ~QueuedTask(); | |
| 175 | |
| 176 scoped_refptr<internal::RasterWorkerPoolTask> task; | |
| 177 bool required_for_activation; | |
| 178 }; | |
| 179 | |
| 180 QueuedTask::Vector tasks_; | |
| 181 size_t required_for_activation_count_; | |
| 182 }; | |
| 183 | |
| 184 RasterTask(); | |
| 185 ~RasterTask(); | |
| 186 | |
| 187 // Returns true if Task is null (doesn't refer to anything). | |
| 188 bool is_null() const { return !internal_.get(); } | |
| 189 | |
| 190 // Returns the Task into an uninitialized state. | |
| 191 void Reset(); | |
| 192 | |
| 193 protected: | |
| 194 friend class RasterWorkerPool; | |
| 195 | |
| 196 explicit RasterTask(internal::RasterWorkerPoolTask* internal); | |
| 197 | |
| 198 scoped_refptr<internal::RasterWorkerPoolTask> internal_; | |
| 199 }; | |
| 200 | |
| 201 virtual ~RasterWorkerPool(); | 135 virtual ~RasterWorkerPool(); |
| 202 | 136 |
| 203 static void SetNumRasterThreads(int num_threads); | 137 static void SetNumRasterThreads(int num_threads); |
| 204 static int GetNumRasterThreads(); | 138 static int GetNumRasterThreads(); |
| 205 | 139 |
| 206 static internal::TaskGraphRunner* GetTaskGraphRunner(); | 140 static internal::TaskGraphRunner* GetTaskGraphRunner(); |
| 207 | 141 |
| 208 static unsigned kOnDemandRasterTaskPriority; | 142 static unsigned kOnDemandRasterTaskPriority; |
| 209 static unsigned kRasterFinishedTaskPriority; | 143 static unsigned kRasterFinishedTaskPriority; |
| 210 static unsigned kRasterRequiredForActivationFinishedTaskPriority; | 144 static unsigned kRasterRequiredForActivationFinishedTaskPriority; |
| 211 static unsigned kRasterTaskPriorityBase; | 145 static unsigned kRasterTaskPriorityBase; |
| 212 | 146 |
| 213 // TODO(vmpstr): Figure out an elegant way to not pass this many parameters. | 147 // TODO(vmpstr): Figure out an elegant way to not pass this many parameters. |
| 214 static RasterTask CreateRasterTask( | 148 static scoped_refptr<internal::RasterWorkerPoolTask> CreateRasterTask( |
| 215 const Resource* resource, | 149 const Resource* resource, |
| 216 PicturePileImpl* picture_pile, | 150 PicturePileImpl* picture_pile, |
| 217 const gfx::Rect& content_rect, | 151 const gfx::Rect& content_rect, |
| 218 float contents_scale, | 152 float contents_scale, |
| 219 RasterMode raster_mode, | 153 RasterMode raster_mode, |
| 220 TileResolution tile_resolution, | 154 TileResolution tile_resolution, |
| 221 int layer_id, | 155 int layer_id, |
| 222 const void* tile_id, | 156 const void* tile_id, |
| 223 int source_frame_number, | 157 int source_frame_number, |
| 224 RenderingStatsInstrumentation* rendering_stats, | 158 RenderingStatsInstrumentation* rendering_stats, |
| 225 const RasterTask::Reply& reply, | 159 const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply, |
| 226 Task::Set* dependencies, | 160 internal::WorkerPoolTask::Vector* dependencies, |
| 227 ContextProvider* context_provider); | 161 ContextProvider* context_provider); |
| 228 | 162 |
| 229 static Task CreateImageDecodeTask( | 163 static scoped_refptr<internal::WorkerPoolTask> CreateImageDecodeTask( |
| 230 SkPixelRef* pixel_ref, | 164 SkPixelRef* pixel_ref, |
| 231 int layer_id, | 165 int layer_id, |
| 232 RenderingStatsInstrumentation* rendering_stats, | 166 RenderingStatsInstrumentation* rendering_stats, |
| 233 const Task::Reply& reply); | 167 const base::Callback<void(bool was_canceled)>& reply); |
| 234 | 168 |
| 235 void SetClient(RasterWorkerPoolClient* client); | 169 void SetClient(RasterWorkerPoolClient* client); |
| 236 | 170 |
| 237 // Tells the worker pool to shutdown after canceling all previously | 171 // Tells the worker pool to shutdown after canceling all previously |
| 238 // scheduled tasks. Reply callbacks are still guaranteed to run. | 172 // scheduled tasks. Reply callbacks are still guaranteed to run. |
| 239 virtual void Shutdown(); | 173 virtual void Shutdown(); |
| 240 | 174 |
| 241 // Schedule running of raster tasks in |queue| and all dependencies. | 175 // Schedule running of raster tasks in |queue| and all dependencies. |
| 242 // Previously scheduled tasks that are no longer needed to run | 176 // Previously scheduled tasks that are no longer needed to run |
| 243 // raster tasks in |queue| will be canceled unless already running. | 177 // raster tasks in |queue| will be canceled unless already running. |
| 244 // Once scheduled, reply callbacks are guaranteed to run for all tasks | 178 // Once scheduled, reply callbacks are guaranteed to run for all tasks |
| 245 // even if they later get canceled by another call to ScheduleTasks(). | 179 // even if they later get canceled by another call to ScheduleTasks(). |
| 246 virtual void ScheduleTasks(RasterTask::Queue* queue) = 0; | 180 virtual void ScheduleTasks(RasterTaskQueue* queue) = 0; |
| 247 | 181 |
| 248 // Force a check for completed tasks. | 182 // Force a check for completed tasks. |
| 249 virtual void CheckForCompletedTasks() = 0; | 183 virtual void CheckForCompletedTasks() = 0; |
| 250 | 184 |
| 251 // Returns the target that needs to be used for raster task resources. | 185 // Returns the target that needs to be used for raster task resources. |
| 252 virtual unsigned GetResourceTarget() const = 0; | 186 virtual unsigned GetResourceTarget() const = 0; |
| 253 | 187 |
| 254 // Returns the format that needs to be used for raster task resources. | 188 // Returns the format that needs to be used for raster task resources. |
| 255 virtual ResourceFormat GetResourceFormat() const = 0; | 189 virtual ResourceFormat GetResourceFormat() const = 0; |
| 256 | 190 |
| 257 protected: | 191 protected: |
| 258 class RasterTaskQueueIterator { | 192 class RasterTaskQueueIterator { |
| 259 public: | 193 public: |
| 260 explicit RasterTaskQueueIterator(const RasterTask::Queue* queue) | 194 explicit RasterTaskQueueIterator(const RasterTaskQueue* queue) |
| 261 : tasks_(&queue->tasks_), current_index_(0u) {} | 195 : items_(&queue->items), current_index_(0u) {} |
| 262 ~RasterTaskQueueIterator() {} | 196 ~RasterTaskQueueIterator() {} |
| 263 | 197 |
| 264 bool required_for_activation() const { | 198 bool required_for_activation() const { |
| 265 DCHECK_LT(current_index_, tasks_->size()); | 199 DCHECK_LT(current_index_, items_->size()); |
| 266 return (*tasks_)[current_index_].required_for_activation; | 200 return (*items_)[current_index_].required_for_activation; |
| 267 } | 201 } |
| 268 | 202 |
| 269 internal::RasterWorkerPoolTask* operator->() const { | 203 internal::RasterWorkerPoolTask* operator->() const { |
| 270 DCHECK_LT(current_index_, tasks_->size()); | 204 DCHECK_LT(current_index_, items_->size()); |
| 271 return (*tasks_)[current_index_].task.get(); | 205 return (*items_)[current_index_].task.get(); |
| 272 } | 206 } |
| 273 | 207 |
| 274 internal::RasterWorkerPoolTask* operator*() const { | 208 internal::RasterWorkerPoolTask* operator*() const { |
| 275 DCHECK_LT(current_index_, tasks_->size()); | 209 DCHECK_LT(current_index_, items_->size()); |
| 276 return (*tasks_)[current_index_].task.get(); | 210 return (*items_)[current_index_].task.get(); |
| 277 } | 211 } |
| 278 | 212 |
| 279 RasterTaskQueueIterator& operator++() { | 213 RasterTaskQueueIterator& operator++() { |
| 280 DCHECK_LT(current_index_, tasks_->size()); | 214 DCHECK_LT(current_index_, items_->size()); |
| 281 ++current_index_; | 215 ++current_index_; |
| 282 return *this; | 216 return *this; |
| 283 } | 217 } |
| 284 | 218 |
| 285 operator bool() const { return current_index_ < tasks_->size(); } | 219 operator bool() const { return current_index_ < items_->size(); } |
| 286 | 220 |
| 287 private: | 221 private: |
| 288 const RasterTask::Queue::QueuedTask::Vector* tasks_; | 222 const RasterTaskQueue::Item::Vector* items_; |
| 289 size_t current_index_; | 223 size_t current_index_; |
| 290 }; | 224 }; |
| 291 typedef std::vector<scoped_refptr<internal::WorkerPoolTask> > TaskVector; | 225 typedef std::vector<scoped_refptr<internal::WorkerPoolTask> > TaskVector; |
| 292 typedef std::deque<scoped_refptr<internal::WorkerPoolTask> > TaskDeque; | 226 typedef std::deque<scoped_refptr<internal::WorkerPoolTask> > TaskDeque; |
| 293 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > | 227 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > |
| 294 RasterTaskVector; | 228 RasterTaskVector; |
| 295 | 229 |
| 296 RasterWorkerPool(internal::TaskGraphRunner* task_graph_runner, | 230 RasterWorkerPool(internal::TaskGraphRunner* task_graph_runner, |
| 297 ResourceProvider* resource_provider); | 231 ResourceProvider* resource_provider); |
| 298 | 232 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 352 | 286 |
| 353 scoped_refptr<internal::WorkerPoolTask> raster_finished_task_; | 287 scoped_refptr<internal::WorkerPoolTask> raster_finished_task_; |
| 354 scoped_refptr<internal::WorkerPoolTask> | 288 scoped_refptr<internal::WorkerPoolTask> |
| 355 raster_required_for_activation_finished_task_; | 289 raster_required_for_activation_finished_task_; |
| 356 base::WeakPtrFactory<RasterWorkerPool> weak_ptr_factory_; | 290 base::WeakPtrFactory<RasterWorkerPool> weak_ptr_factory_; |
| 357 }; | 291 }; |
| 358 | 292 |
| 359 } // namespace cc | 293 } // namespace cc |
| 360 | 294 |
| 361 #endif // CC_RESOURCES_RASTER_WORKER_POOL_H_ | 295 #endif // CC_RESOURCES_RASTER_WORKER_POOL_H_ |
| OLD | NEW |