| 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 <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 namespace cc { | 23 namespace cc { |
| 24 class PicturePileImpl; | 24 class PicturePileImpl; |
| 25 class PixelBufferRasterWorkerPool; | 25 class PixelBufferRasterWorkerPool; |
| 26 class Resource; | 26 class Resource; |
| 27 | 27 |
| 28 namespace internal { | 28 namespace internal { |
| 29 | 29 |
| 30 class CC_EXPORT RasterWorkerPoolTask | 30 class CC_EXPORT RasterWorkerPoolTask |
| 31 : public base::RefCounted<RasterWorkerPoolTask> { | 31 : public base::RefCounted<RasterWorkerPoolTask> { |
| 32 public: | 32 public: |
| 33 typedef std::vector<scoped_refptr<RasterWorkerPoolTask> > TaskVector; | 33 typedef std::vector<scoped_refptr<WorkerPoolTask> > TaskVector; |
| 34 | 34 |
| 35 // Returns true if |device| was written to. False indicate that | 35 // Returns true if |device| was written to. False indicate that |
| 36 // the content of |device| is undefined and the resource doesn't | 36 // the content of |device| is undefined and the resource doesn't |
| 37 // need to be initialized. | 37 // need to be initialized. |
| 38 virtual bool RunOnThread(SkDevice* device, unsigned thread_index) = 0; | 38 virtual bool RunOnThread(SkDevice* device, unsigned thread_index) = 0; |
| 39 virtual void DispatchCompletionCallback() = 0; | 39 virtual void DispatchCompletionCallback() = 0; |
| 40 | 40 |
| 41 void DidRun(bool was_canceled); | 41 void DidRun(bool was_canceled); |
| 42 bool HasFinishedRunning() const; | 42 bool HasFinishedRunning() const; |
| 43 bool WasCanceled() const; | 43 bool WasCanceled() const; |
| 44 void DidComplete(); | 44 void DidComplete(); |
| 45 bool HasCompleted() const; | 45 bool HasCompleted() const; |
| 46 | 46 |
| 47 const Resource* resource() const { return resource_; } | 47 const Resource* resource() const { return resource_; } |
| 48 const WorkerPoolTask::TaskVector& dependencies() const { | 48 const TaskVector& dependencies() const { return dependencies_; } |
| 49 return dependencies_; | |
| 50 } | |
| 51 | 49 |
| 52 protected: | 50 protected: |
| 53 friend class base::RefCounted<RasterWorkerPoolTask>; | 51 friend class base::RefCounted<RasterWorkerPoolTask>; |
| 54 | 52 |
| 55 RasterWorkerPoolTask(const Resource* resource, | 53 RasterWorkerPoolTask(const Resource* resource, TaskVector* dependencies); |
| 56 WorkerPoolTask::TaskVector* dependencies); | |
| 57 virtual ~RasterWorkerPoolTask(); | 54 virtual ~RasterWorkerPoolTask(); |
| 58 | 55 |
| 59 private: | 56 private: |
| 60 bool did_run_; | 57 bool did_run_; |
| 61 bool did_complete_; | 58 bool did_complete_; |
| 62 bool was_canceled_; | 59 bool was_canceled_; |
| 63 const Resource* resource_; | 60 const Resource* resource_; |
| 64 WorkerPoolTask::TaskVector dependencies_; | 61 TaskVector dependencies_; |
| 65 }; | 62 }; |
| 66 | 63 |
| 67 } // namespace internal | 64 } // namespace internal |
| 68 } // namespace cc | 65 } // namespace cc |
| 69 | 66 |
| 70 #if defined(COMPILER_GCC) | 67 #if defined(COMPILER_GCC) |
| 71 namespace BASE_HASH_NAMESPACE { | 68 namespace BASE_HASH_NAMESPACE { |
| 72 template <> struct hash<cc::internal::RasterWorkerPoolTask*> { | 69 template <> struct hash<cc::internal::RasterWorkerPoolTask*> { |
| 73 size_t operator()(cc::internal::RasterWorkerPoolTask* ptr) const { | 70 size_t operator()(cc::internal::RasterWorkerPoolTask* ptr) const { |
| 74 return hash<size_t>()(reinterpret_cast<size_t>(ptr)); | 71 return hash<size_t>()(reinterpret_cast<size_t>(ptr)); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 public: | 118 public: |
| 122 Set(); | 119 Set(); |
| 123 ~Set(); | 120 ~Set(); |
| 124 | 121 |
| 125 void Insert(const Task& task); | 122 void Insert(const Task& task); |
| 126 | 123 |
| 127 private: | 124 private: |
| 128 friend class RasterWorkerPool; | 125 friend class RasterWorkerPool; |
| 129 friend class RasterWorkerPoolTest; | 126 friend class RasterWorkerPoolTest; |
| 130 | 127 |
| 131 typedef internal::WorkerPoolTask::TaskVector TaskVector; | 128 typedef internal::RasterWorkerPoolTask::TaskVector TaskVector; |
| 132 TaskVector tasks_; | 129 TaskVector tasks_; |
| 133 }; | 130 }; |
| 134 | 131 |
| 135 Task(); | 132 Task(); |
| 136 ~Task(); | 133 ~Task(); |
| 137 | 134 |
| 138 // Returns true if Task is null (doesn't refer to anything). | 135 // Returns true if Task is null (doesn't refer to anything). |
| 139 bool is_null() const { return !internal_.get(); } | 136 bool is_null() const { return !internal_.get(); } |
| 140 | 137 |
| 141 // Returns the Task into an uninitialized state. | 138 // Returns the Task into an uninitialized state. |
| 142 void Reset(); | 139 void Reset(); |
| 143 | 140 |
| 144 protected: | 141 protected: |
| 145 friend class RasterWorkerPool; | 142 friend class RasterWorkerPool; |
| 146 friend class RasterWorkerPoolTest; | 143 friend class RasterWorkerPoolTest; |
| 147 | 144 |
| 148 explicit Task(internal::WorkerPoolTask* internal); | 145 explicit Task(internal::WorkerPoolTask* internal); |
| 149 | 146 |
| 150 scoped_refptr<internal::WorkerPoolTask> internal_; | 147 scoped_refptr<internal::WorkerPoolTask> internal_; |
| 151 }; | 148 }; |
| 152 | 149 |
| 153 class CC_EXPORT RasterTask { | 150 class CC_EXPORT RasterTask { |
| 154 public: | 151 public: |
| 155 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, | 152 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, |
| 156 bool was_canceled)> Reply; | 153 bool was_canceled)> Reply; |
| 157 | 154 |
| 158 class CC_EXPORT Queue { | 155 class CC_EXPORT Queue { |
| 159 public: | 156 public: |
| 160 typedef internal::RasterWorkerPoolTask::TaskVector TaskVector; | |
| 161 | |
| 162 Queue(); | 157 Queue(); |
| 163 ~Queue(); | 158 ~Queue(); |
| 164 | 159 |
| 165 void Append(const RasterTask& task, bool required_for_activation); | 160 void Append(const RasterTask& task, bool required_for_activation); |
| 166 | 161 |
| 167 private: | 162 private: |
| 168 friend class RasterWorkerPool; | 163 friend class RasterWorkerPool; |
| 169 | 164 |
| 165 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > |
| 166 TaskVector; |
| 170 TaskVector tasks_; | 167 TaskVector tasks_; |
| 171 typedef base::hash_set<internal::RasterWorkerPoolTask*> TaskSet; | 168 typedef base::hash_set<internal::RasterWorkerPoolTask*> TaskSet; |
| 172 TaskSet tasks_required_for_activation_; | 169 TaskSet tasks_required_for_activation_; |
| 173 }; | 170 }; |
| 174 | 171 |
| 175 RasterTask(); | 172 RasterTask(); |
| 176 ~RasterTask(); | 173 ~RasterTask(); |
| 177 | 174 |
| 178 // Returns true if Task is null (doesn't refer to anything). | 175 // Returns true if Task is null (doesn't refer to anything). |
| 179 bool is_null() const { return !internal_.get(); } | 176 bool is_null() const { return !internal_.get(); } |
| 180 | 177 |
| 181 // Returns the Task into an uninitialized state. | 178 // Returns the Task into an uninitialized state. |
| 182 void Reset(); | 179 void Reset(); |
| 183 | 180 |
| 184 protected: | 181 protected: |
| 185 friend class PixelBufferRasterWorkerPool; | |
| 186 friend class RasterWorkerPool; | 182 friend class RasterWorkerPool; |
| 187 friend class RasterWorkerPoolTest; | 183 friend class RasterWorkerPoolTest; |
| 188 | 184 |
| 189 explicit RasterTask(internal::RasterWorkerPoolTask* internal); | 185 explicit RasterTask(internal::RasterWorkerPoolTask* internal); |
| 190 | 186 |
| 191 scoped_refptr<internal::RasterWorkerPoolTask> internal_; | 187 scoped_refptr<internal::RasterWorkerPoolTask> internal_; |
| 192 }; | 188 }; |
| 193 | 189 |
| 194 virtual ~RasterWorkerPool(); | 190 virtual ~RasterWorkerPool(); |
| 195 | 191 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 210 static RasterTask CreateRasterTask( | 206 static RasterTask CreateRasterTask( |
| 211 const Resource* resource, | 207 const Resource* resource, |
| 212 PicturePileImpl* picture_pile, | 208 PicturePileImpl* picture_pile, |
| 213 gfx::Rect content_rect, | 209 gfx::Rect content_rect, |
| 214 float contents_scale, | 210 float contents_scale, |
| 215 RasterMode raster_mode, | 211 RasterMode raster_mode, |
| 216 bool use_color_estimator, | 212 bool use_color_estimator, |
| 217 const RasterTaskMetadata& metadata, | 213 const RasterTaskMetadata& metadata, |
| 218 RenderingStatsInstrumentation* rendering_stats, | 214 RenderingStatsInstrumentation* rendering_stats, |
| 219 const RasterTask::Reply& reply, | 215 const RasterTask::Reply& reply, |
| 220 Task::Set& dependencies); | 216 Task::Set* dependencies); |
| 221 | 217 |
| 222 static Task CreateImageDecodeTask( | 218 static Task CreateImageDecodeTask( |
| 223 skia::LazyPixelRef* pixel_ref, | 219 skia::LazyPixelRef* pixel_ref, |
| 224 int layer_id, | 220 int layer_id, |
| 225 RenderingStatsInstrumentation* stats_instrumentation, | 221 RenderingStatsInstrumentation* stats_instrumentation, |
| 226 const Task::Reply& reply); | 222 const Task::Reply& reply); |
| 227 | 223 |
| 228 protected: | 224 protected: |
| 229 class RootTask { | 225 typedef std::vector<scoped_refptr<internal::WorkerPoolTask> > TaskVector; |
| 230 public: | 226 typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> > |
| 231 RootTask(); | 227 RasterTaskVector; |
| 232 explicit RootTask(internal::WorkerPoolTask::TaskVector* dependencies); | |
| 233 RootTask(const base::Closure& callback, | |
| 234 internal::WorkerPoolTask::TaskVector* dependencies); | |
| 235 ~RootTask(); | |
| 236 | |
| 237 protected: | |
| 238 friend class RasterWorkerPool; | |
| 239 | |
| 240 scoped_refptr<internal::WorkerPoolTask> internal_; | |
| 241 }; | |
| 242 | |
| 243 typedef internal::RasterWorkerPoolTask* TaskMapKey; | 228 typedef internal::RasterWorkerPoolTask* TaskMapKey; |
| 244 typedef base::hash_map<TaskMapKey, | 229 typedef base::hash_map<TaskMapKey, |
| 245 scoped_refptr<internal::WorkerPoolTask> > TaskMap; | 230 scoped_refptr<internal::WorkerPoolTask> > TaskMap; |
| 246 | 231 |
| 232 class CC_EXPORT RasterTaskGraph { |
| 233 public: |
| 234 RasterTaskGraph(); |
| 235 ~RasterTaskGraph(); |
| 236 |
| 237 void InsertRasterTask(internal::WorkerPoolTask* raster_task, |
| 238 const TaskVector& decode_tasks); |
| 239 |
| 240 private: |
| 241 friend class RasterWorkerPool; |
| 242 |
| 243 TaskGraph graph_; |
| 244 scoped_refptr<internal::WorkerPoolTask> raster_finished_task_; |
| 245 scoped_ptr<GraphNode> raster_finished_node_; |
| 246 unsigned next_priority_; |
| 247 |
| 248 DISALLOW_COPY_AND_ASSIGN(RasterTaskGraph); |
| 249 }; |
| 250 |
| 247 RasterWorkerPool(ResourceProvider* resource_provider, size_t num_threads); | 251 RasterWorkerPool(ResourceProvider* resource_provider, size_t num_threads); |
| 248 | 252 |
| 253 virtual void OnRasterTasksFinished() {} |
| 254 |
| 249 void SetRasterTasks(RasterTask::Queue* queue); | 255 void SetRasterTasks(RasterTask::Queue* queue); |
| 250 void ScheduleRasterTasks(const RootTask& root); | 256 void SetRasterTaskGraph(RasterTaskGraph* graph); |
| 251 bool IsRasterTaskRequiredForActivation( | 257 bool IsRasterTaskRequiredForActivation( |
| 252 internal::RasterWorkerPoolTask* task) const; | 258 internal::RasterWorkerPoolTask* task) const; |
| 253 | 259 |
| 254 RasterWorkerPoolClient* client() const { return client_; } | 260 RasterWorkerPoolClient* client() const { return client_; } |
| 255 ResourceProvider* resource_provider() const { return resource_provider_; } | 261 ResourceProvider* resource_provider() const { return resource_provider_; } |
| 256 const RasterTask::Queue::TaskVector& raster_tasks() const { | 262 const RasterTask::Queue::TaskVector& raster_tasks() const { |
| 257 return raster_tasks_; | 263 return raster_tasks_; |
| 258 } | 264 } |
| 259 | 265 |
| 260 private: | 266 private: |
| 267 void OnRasterFinished(int64 schedule_raster_tasks_count); |
| 268 |
| 261 RasterWorkerPoolClient* client_; | 269 RasterWorkerPoolClient* client_; |
| 262 ResourceProvider* resource_provider_; | 270 ResourceProvider* resource_provider_; |
| 263 RasterTask::Queue::TaskVector raster_tasks_; | 271 RasterTask::Queue::TaskVector raster_tasks_; |
| 264 RasterTask::Queue::TaskSet raster_tasks_required_for_activation_; | 272 RasterTask::Queue::TaskSet raster_tasks_required_for_activation_; |
| 265 | 273 |
| 266 // The root task that is a dependent of all other tasks. | 274 base::WeakPtrFactory<RasterWorkerPool> weak_ptr_factory_; |
| 267 scoped_refptr<internal::WorkerPoolTask> root_; | 275 scoped_refptr<internal::WorkerPoolTask> raster_finished_task_; |
| 276 int64 schedule_raster_tasks_count_; |
| 268 }; | 277 }; |
| 269 | 278 |
| 270 } // namespace cc | 279 } // namespace cc |
| 271 | 280 |
| 272 #endif // CC_RESOURCES_RASTER_WORKER_POOL_H_ | 281 #endif // CC_RESOURCES_RASTER_WORKER_POOL_H_ |
| OLD | NEW |