Index: cc/resources/rasterizer.h |
diff --git a/cc/resources/rasterizer.h b/cc/resources/rasterizer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d53e400b4f81ff09731d7bee2e1a132480c685de |
--- /dev/null |
+++ b/cc/resources/rasterizer.h |
@@ -0,0 +1,177 @@ |
+// Copyright 2014 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_RASTERIZER_H_ |
+#define CC_RESOURCES_RASTERIZER_H_ |
+ |
+#include <vector> |
+ |
+#include "base/callback.h" |
+#include "cc/resources/resource_format.h" |
+#include "cc/resources/task_graph_runner.h" |
+ |
+class SkCanvas; |
+ |
+namespace cc { |
+class Resource; |
+ |
+namespace internal { |
+class RasterTask; |
+ |
+class CC_EXPORT RasterizerTaskClient { |
+ public: |
+ virtual SkCanvas* AcquireCanvasForRaster(RasterTask* task) = 0; |
+ virtual void ReleaseCanvasForRaster(RasterTask* task) = 0; |
+ |
+ protected: |
+ virtual ~RasterizerTaskClient() {} |
+}; |
+ |
+class ImageDecodeTask; |
+ |
+class CC_EXPORT RasterizerTask : public Task { |
+ public: |
+ typedef std::vector<scoped_refptr<RasterizerTask> > Vector; |
+ |
+ virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) = 0; |
+ virtual void RunOnOriginThread() = 0; |
+ virtual void CompleteOnOriginThread(RasterizerTaskClient* client) = 0; |
+ virtual void RunReplyOnOriginThread() = 0; |
+ |
+ // Type-checking downcast routines. |
+ virtual ImageDecodeTask* AsImageDecodeTask(); |
+ virtual RasterTask* AsRasterTask(); |
+ |
+ void WillSchedule(); |
+ void DidSchedule(); |
+ bool HasBeenScheduled() const; |
+ |
+ void WillComplete(); |
+ void DidComplete(); |
+ bool HasCompleted() const; |
+ |
+ protected: |
+ RasterizerTask(); |
+ virtual ~RasterizerTask(); |
+ |
+ bool did_schedule_; |
+ bool did_complete_; |
+}; |
+ |
+class CC_EXPORT ImageDecodeTask : public RasterizerTask { |
+ public: |
+ typedef std::vector<scoped_refptr<ImageDecodeTask> > Vector; |
+ |
+ // Overridden from RasterizerTask: |
+ virtual ImageDecodeTask* AsImageDecodeTask() OVERRIDE; |
+ |
+ protected: |
+ ImageDecodeTask(); |
+ virtual ~ImageDecodeTask(); |
+}; |
+ |
+class CC_EXPORT RasterTask : public RasterizerTask { |
+ public: |
+ typedef std::vector<scoped_refptr<RasterTask> > Vector; |
+ |
+ // Overridden from RasterizerTask: |
+ virtual RasterTask* AsRasterTask() OVERRIDE; |
+ |
+ const Resource* resource() const { return resource_; } |
+ const ImageDecodeTask::Vector& dependencies() const { return dependencies_; } |
+ |
+ protected: |
+ RasterTask(const Resource* resource, ImageDecodeTask::Vector* dependencies); |
+ virtual ~RasterTask(); |
+ |
+ private: |
+ const Resource* resource_; |
+ ImageDecodeTask::Vector dependencies_; |
+}; |
+ |
+} // namespace internal |
+ |
+class CC_EXPORT RasterizerClient { |
+ public: |
+ virtual bool ShouldForceTasksRequiredForActivationToComplete() const = 0; |
+ virtual void DidFinishRunningTasks() = 0; |
+ virtual void DidFinishRunningTasksRequiredForActivation() = 0; |
+ |
+ protected: |
+ virtual ~RasterizerClient() {} |
+}; |
+ |
+struct CC_EXPORT RasterTaskQueue { |
+ struct CC_EXPORT Item { |
+ class TaskComparator { |
+ public: |
+ explicit TaskComparator(const internal::RasterTask* task) : task_(task) {} |
+ |
+ bool operator()(const Item& item) const { return item.task == task_; } |
+ |
+ private: |
+ const internal::RasterTask* task_; |
+ }; |
+ |
+ typedef std::vector<Item> Vector; |
+ |
+ Item(internal::RasterTask* task, bool required_for_activation); |
+ ~Item(); |
+ |
+ static bool IsRequiredForActivation(const Item& item) { |
+ return item.required_for_activation; |
+ } |
+ |
+ internal::RasterTask* task; |
+ bool required_for_activation; |
+ }; |
+ |
+ RasterTaskQueue(); |
+ ~RasterTaskQueue(); |
+ |
+ void Swap(RasterTaskQueue* other); |
+ void Reset(); |
+ |
+ Item::Vector items; |
+ size_t required_for_activation_count; |
+}; |
+ |
+// This interface can be used to schedule and run raster tasks. The client will |
+// be notified asynchronously when the set of tasks marked as "required for |
+// activation" have finished running and when all scheduled tasks have finished |
+// running. The client can call CheckForCompletedTasks() at any time to dispatch |
+// pending completion callbacks for all tasks that have finished running. |
+class CC_EXPORT Rasterizer { |
+ public: |
+ // Set the client instance to be notified when finished running tasks. |
+ virtual void SetClient(RasterizerClient* client) = 0; |
+ |
+ // Tells the worker pool to shutdown after canceling all previously scheduled |
+ // tasks. Reply callbacks are still guaranteed to run when |
+ // CheckForCompletedTasks() is called. |
+ virtual void Shutdown() = 0; |
+ |
+ // Schedule running of raster tasks in |queue| and all dependencies. |
+ // Previously scheduled tasks that are not 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(RasterTaskQueue* queue) = 0; |
+ |
+ // Check for completed tasks and dispatch reply callbacks. |
+ virtual void CheckForCompletedTasks() = 0; |
+ |
+ // Returns the target that needs to be used for raster task resources. |
+ virtual unsigned GetResourceTarget() const = 0; |
+ |
+ // Returns the format that needs to be used for raster task resources. |
+ virtual ResourceFormat GetResourceFormat() const = 0; |
+ |
+ protected: |
+ virtual ~Rasterizer() {} |
+}; |
+ |
+} // namespace cc |
+ |
+#endif // CC_RESOURCES_RASTERIZER_H_ |