summaryrefslogtreecommitdiff
path: root/chromium/cc/resources/raster_worker_pool.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/resources/raster_worker_pool.h')
-rw-r--r--chromium/cc/resources/raster_worker_pool.h278
1 files changed, 278 insertions, 0 deletions
diff --git a/chromium/cc/resources/raster_worker_pool.h b/chromium/cc/resources/raster_worker_pool.h
new file mode 100644
index 00000000000..d0e1e7c0de0
--- /dev/null
+++ b/chromium/cc/resources/raster_worker_pool.h
@@ -0,0 +1,278 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RESOURCES_RASTER_WORKER_POOL_H_
+#define CC_RESOURCES_RASTER_WORKER_POOL_H_
+
+#include <vector>
+
+#include "base/containers/hash_tables.h"
+#include "cc/debug/rendering_stats_instrumentation.h"
+#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/raster_mode.h"
+#include "cc/resources/tile_priority.h"
+#include "cc/resources/worker_pool.h"
+
+class SkDevice;
+
+namespace skia {
+class LazyPixelRef;
+}
+
+namespace cc {
+class PicturePileImpl;
+class PixelBufferRasterWorkerPool;
+class Resource;
+class ResourceProvider;
+
+namespace internal {
+
+class CC_EXPORT RasterWorkerPoolTask
+ : public base::RefCounted<RasterWorkerPoolTask> {
+ public:
+ typedef std::vector<scoped_refptr<WorkerPoolTask> > TaskVector;
+
+ // Returns true if |device| was written to. False indicate that
+ // the content of |device| is undefined and the resource doesn't
+ // need to be initialized.
+ virtual bool RunOnWorkerThread(SkDevice* device, unsigned thread_index) = 0;
+ virtual void CompleteOnOriginThread() = 0;
+
+ void DidRun(bool was_canceled);
+ bool HasFinishedRunning() const;
+ bool WasCanceled() const;
+ void WillComplete();
+ void DidComplete();
+ bool HasCompleted() const;
+
+ const Resource* resource() const { return resource_; }
+ const TaskVector& dependencies() const { return dependencies_; }
+
+ protected:
+ friend class base::RefCounted<RasterWorkerPoolTask>;
+
+ RasterWorkerPoolTask(const Resource* resource, TaskVector* dependencies);
+ virtual ~RasterWorkerPoolTask();
+
+ private:
+ bool did_run_;
+ bool did_complete_;
+ bool was_canceled_;
+ const Resource* resource_;
+ TaskVector dependencies_;
+};
+
+} // namespace internal
+} // namespace cc
+
+#if defined(COMPILER_GCC)
+namespace BASE_HASH_NAMESPACE {
+template <> struct hash<cc::internal::RasterWorkerPoolTask*> {
+ size_t operator()(cc::internal::RasterWorkerPoolTask* ptr) const {
+ return hash<size_t>()(reinterpret_cast<size_t>(ptr));
+ }
+};
+} // namespace BASE_HASH_NAMESPACE
+#endif // COMPILER
+
+namespace cc {
+
+class CC_EXPORT RasterWorkerPoolClient {
+ public:
+ virtual bool ShouldForceTasksRequiredForActivationToComplete() const = 0;
+ virtual void DidFinishRunningTasks() = 0;
+ virtual void DidFinishRunningTasksRequiredForActivation() = 0;
+
+ protected:
+ virtual ~RasterWorkerPoolClient() {}
+};
+
+// A worker thread pool that runs raster tasks.
+class CC_EXPORT RasterWorkerPool : public WorkerPool {
+ public:
+ class CC_EXPORT Task {
+ public:
+ typedef base::Callback<void(bool was_canceled)> Reply;
+
+ class CC_EXPORT Set {
+ public:
+ Set();
+ ~Set();
+
+ void Insert(const Task& task);
+
+ private:
+ friend class RasterWorkerPool;
+ friend class RasterWorkerPoolTest;
+
+ typedef internal::RasterWorkerPoolTask::TaskVector TaskVector;
+ TaskVector tasks_;
+ };
+
+ Task();
+ ~Task();
+
+ // Returns true if Task is null (doesn't refer to anything).
+ bool is_null() const { return !internal_.get(); }
+
+ // Returns the Task into an uninitialized state.
+ void Reset();
+
+ protected:
+ friend class RasterWorkerPool;
+ friend class RasterWorkerPoolTest;
+
+ explicit Task(internal::WorkerPoolTask* internal);
+
+ scoped_refptr<internal::WorkerPoolTask> internal_;
+ };
+
+ class CC_EXPORT RasterTask {
+ public:
+ typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
+ bool was_canceled)> Reply;
+
+ class CC_EXPORT Queue {
+ public:
+ Queue();
+ ~Queue();
+
+ void Append(const RasterTask& task, bool required_for_activation);
+
+ private:
+ friend class RasterWorkerPool;
+
+ typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> >
+ TaskVector;
+ TaskVector tasks_;
+ typedef base::hash_set<internal::RasterWorkerPoolTask*> TaskSet;
+ TaskSet tasks_required_for_activation_;
+ };
+
+ RasterTask();
+ ~RasterTask();
+
+ // Returns true if Task is null (doesn't refer to anything).
+ bool is_null() const { return !internal_.get(); }
+
+ // Returns the Task into an uninitialized state.
+ void Reset();
+
+ protected:
+ friend class RasterWorkerPool;
+ friend class RasterWorkerPoolTest;
+
+ explicit RasterTask(internal::RasterWorkerPoolTask* internal);
+
+ scoped_refptr<internal::RasterWorkerPoolTask> internal_;
+ };
+
+ virtual ~RasterWorkerPool();
+
+ void SetClient(RasterWorkerPoolClient* client);
+
+ // Tells the worker pool to shutdown after canceling all previously
+ // scheduled tasks. Reply callbacks are still guaranteed to run.
+ virtual void Shutdown() OVERRIDE;
+
+ // Schedule running of raster tasks in |queue| and all dependencies.
+ // Previously scheduled tasks that are no longer needed to run
+ // raster tasks in |queue| will be canceled unless already running.
+ // Once scheduled, reply callbacks are guaranteed to run for all tasks
+ // even if they later get canceled by another call to ScheduleTasks().
+ virtual void ScheduleTasks(RasterTask::Queue* queue) = 0;
+
+ // TODO(vmpstr): Figure out an elegant way to not pass this many parameters.
+ static RasterTask CreateRasterTask(
+ const Resource* resource,
+ PicturePileImpl* picture_pile,
+ gfx::Rect content_rect,
+ float contents_scale,
+ RasterMode raster_mode,
+ bool is_tile_in_pending_tree_now_bin,
+ TileResolution tile_resolution,
+ int layer_id,
+ const void* tile_id,
+ int source_frame_number,
+ RenderingStatsInstrumentation* rendering_stats,
+ const RasterTask::Reply& reply,
+ Task::Set* dependencies);
+
+ static Task CreateImageDecodeTask(
+ skia::LazyPixelRef* pixel_ref,
+ int layer_id,
+ RenderingStatsInstrumentation* stats_instrumentation,
+ const Task::Reply& reply);
+
+ protected:
+ typedef std::vector<scoped_refptr<internal::WorkerPoolTask> > TaskVector;
+ typedef std::vector<scoped_refptr<internal::RasterWorkerPoolTask> >
+ RasterTaskVector;
+ typedef base::hash_set<internal::RasterWorkerPoolTask*> RasterTaskSet;
+ typedef internal::RasterWorkerPoolTask* TaskMapKey;
+ typedef base::hash_map<TaskMapKey,
+ scoped_refptr<internal::WorkerPoolTask> > TaskMap;
+
+ RasterWorkerPool(ResourceProvider* resource_provider, size_t num_threads);
+
+ virtual void OnRasterTasksFinished() = 0;
+ virtual void OnRasterTasksRequiredForActivationFinished() = 0;
+
+ void SetRasterTasks(RasterTask::Queue* queue);
+ bool IsRasterTaskRequiredForActivation(
+ internal::RasterWorkerPoolTask* task) const;
+
+ RasterWorkerPoolClient* client() const { return client_; }
+ ResourceProvider* resource_provider() const { return resource_provider_; }
+ const RasterTaskVector& raster_tasks() const { return raster_tasks_; }
+ const RasterTaskSet& raster_tasks_required_for_activation() const {
+ return raster_tasks_required_for_activation_;
+ }
+ void set_raster_finished_task(
+ scoped_refptr<internal::WorkerPoolTask> raster_finished_task) {
+ raster_finished_task_ = raster_finished_task;
+ }
+ void set_raster_required_for_activation_finished_task(
+ scoped_refptr<internal::WorkerPoolTask>
+ raster_required_for_activation_finished_task) {
+ raster_required_for_activation_finished_task_ =
+ raster_required_for_activation_finished_task;
+ }
+
+ scoped_refptr<internal::WorkerPoolTask> CreateRasterFinishedTask();
+ scoped_refptr<internal::WorkerPoolTask>
+ CreateRasterRequiredForActivationFinishedTask();
+
+ scoped_ptr<base::Value> ScheduledStateAsValue() const;
+
+ static internal::GraphNode* CreateGraphNodeForTask(
+ internal::WorkerPoolTask* task,
+ unsigned priority,
+ TaskGraph* graph);
+
+ static internal::GraphNode* CreateGraphNodeForRasterTask(
+ internal::WorkerPoolTask* raster_task,
+ const TaskVector& decode_tasks,
+ unsigned priority,
+ TaskGraph* graph);
+
+ private:
+ void OnRasterFinished(const internal::WorkerPoolTask* source);
+ void OnRasterRequiredForActivationFinished(
+ const internal::WorkerPoolTask* source);
+
+ RasterWorkerPoolClient* client_;
+ ResourceProvider* resource_provider_;
+ RasterTask::Queue::TaskVector raster_tasks_;
+ RasterTask::Queue::TaskSet raster_tasks_required_for_activation_;
+
+ base::WeakPtrFactory<RasterWorkerPool> weak_ptr_factory_;
+ scoped_refptr<internal::WorkerPoolTask> raster_finished_task_;
+ scoped_refptr<internal::WorkerPoolTask>
+ raster_required_for_activation_finished_task_;
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_RASTER_WORKER_POOL_H_