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
3 // found in the LICENSE file.
5 #ifndef CC_RESOURCES_RASTERIZER_H_
6 #define CC_RESOURCES_RASTERIZER_H_
10 #include "base/callback.h"
11 #include "cc/resources/resource_format.h"
12 #include "cc/resources/task_graph_runner.h"
17 class ImageDecodeTask
;
21 class CC_EXPORT RasterizerTaskClient
{
23 virtual SkCanvas
* AcquireCanvasForRaster(RasterTask
* task
) = 0;
24 virtual void ReleaseCanvasForRaster(RasterTask
* task
) = 0;
27 virtual ~RasterizerTaskClient() {}
30 class CC_EXPORT RasterizerTask
: public Task
{
32 typedef std::vector
<scoped_refptr
<RasterizerTask
> > Vector
;
34 virtual void ScheduleOnOriginThread(RasterizerTaskClient
* client
) = 0;
35 virtual void CompleteOnOriginThread(RasterizerTaskClient
* client
) = 0;
36 virtual void RunReplyOnOriginThread() = 0;
38 // Type-checking downcast routines.
39 virtual ImageDecodeTask
* AsImageDecodeTask();
40 virtual RasterTask
* AsRasterTask();
44 bool HasBeenScheduled() const;
48 bool HasCompleted() const;
52 virtual ~RasterizerTask();
58 class CC_EXPORT ImageDecodeTask
: public RasterizerTask
{
60 typedef std::vector
<scoped_refptr
<ImageDecodeTask
> > Vector
;
62 // Overridden from RasterizerTask:
63 virtual ImageDecodeTask
* AsImageDecodeTask() OVERRIDE
;
67 virtual ~ImageDecodeTask();
70 class CC_EXPORT RasterTask
: public RasterizerTask
{
72 typedef std::vector
<scoped_refptr
<RasterTask
> > Vector
;
74 // Overridden from RasterizerTask:
75 virtual RasterTask
* AsRasterTask() OVERRIDE
;
77 const Resource
* resource() const { return resource_
; }
78 const ImageDecodeTask::Vector
& dependencies() const { return dependencies_
; }
81 RasterTask(const Resource
* resource
, ImageDecodeTask::Vector
* dependencies
);
82 virtual ~RasterTask();
85 const Resource
* resource_
;
86 ImageDecodeTask::Vector dependencies_
;
89 class CC_EXPORT RasterizerClient
{
91 virtual bool ShouldForceTasksRequiredForActivationToComplete() const = 0;
92 virtual void DidFinishRunningTasks() = 0;
93 virtual void DidFinishRunningTasksRequiredForActivation() = 0;
96 virtual ~RasterizerClient() {}
99 struct CC_EXPORT RasterTaskQueue
{
100 struct CC_EXPORT Item
{
101 class TaskComparator
{
103 explicit TaskComparator(const RasterTask
* task
) : task_(task
) {}
105 bool operator()(const Item
& item
) const { return item
.task
== task_
; }
108 const RasterTask
* task_
;
111 typedef std::vector
<Item
> Vector
;
113 Item(RasterTask
* task
, bool required_for_activation
);
116 static bool IsRequiredForActivation(const Item
& item
) {
117 return item
.required_for_activation
;
121 bool required_for_activation
;
127 void Swap(RasterTaskQueue
* other
);
131 size_t required_for_activation_count
;
134 // This interface can be used to schedule and run raster tasks. The client will
135 // be notified asynchronously when the set of tasks marked as "required for
136 // activation" have finished running and when all scheduled tasks have finished
137 // running. The client can call CheckForCompletedTasks() at any time to dispatch
138 // pending completion callbacks for all tasks that have finished running.
139 class CC_EXPORT Rasterizer
{
141 // Set the client instance to be notified when finished running tasks.
142 virtual void SetClient(RasterizerClient
* client
) = 0;
144 // Tells the worker pool to shutdown after canceling all previously scheduled
145 // tasks. Reply callbacks are still guaranteed to run when
146 // CheckForCompletedTasks() is called.
147 virtual void Shutdown() = 0;
149 // Schedule running of raster tasks in |queue| and all dependencies.
150 // Previously scheduled tasks that are not in |queue| will be canceled unless
151 // already running. Once scheduled, reply callbacks are guaranteed to run for
152 // all tasks even if they later get canceled by another call to
154 virtual void ScheduleTasks(RasterTaskQueue
* queue
) = 0;
156 // Check for completed tasks and dispatch reply callbacks.
157 virtual void CheckForCompletedTasks() = 0;
160 virtual ~Rasterizer() {}
165 #endif // CC_RESOURCES_RASTERIZER_H_