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
3 // found in the LICENSE file.
5 #ifndef CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
6 #define CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
11 #include "base/memory/weak_ptr.h"
12 #include "base/values.h"
13 #include "cc/base/delayed_unique_notifier.h"
14 #include "cc/resources/raster_worker_pool.h"
15 #include "cc/resources/rasterizer.h"
18 class ResourceProvider
;
20 class CC_EXPORT PixelBufferRasterWorkerPool
: public RasterWorkerPool
,
22 public RasterizerTaskClient
{
24 virtual ~PixelBufferRasterWorkerPool();
26 static scoped_ptr
<RasterWorkerPool
> Create(
27 base::SequencedTaskRunner
* task_runner
,
28 TaskGraphRunner
* task_graph_runner
,
29 ResourceProvider
* resource_provider
,
30 size_t max_transfer_buffer_usage_bytes
);
32 // Overridden from RasterWorkerPool:
33 virtual Rasterizer
* AsRasterizer() OVERRIDE
;
35 // Overridden from Rasterizer:
36 virtual void SetClient(RasterizerClient
* client
) OVERRIDE
;
37 virtual void Shutdown() OVERRIDE
;
38 virtual void ScheduleTasks(RasterTaskQueue
* queue
) OVERRIDE
;
39 virtual void CheckForCompletedTasks() OVERRIDE
;
41 // Overridden from RasterizerTaskClient:
42 virtual SkCanvas
* AcquireCanvasForRaster(RasterTask
* task
) OVERRIDE
;
43 virtual void ReleaseCanvasForRaster(RasterTask
* task
) OVERRIDE
;
46 struct RasterTaskState
{
47 class TaskComparator
{
49 explicit TaskComparator(const RasterTask
* task
) : task_(task
) {}
51 bool operator()(const RasterTaskState
& state
) const {
52 return state
.task
== task_
;
56 const RasterTask
* task_
;
59 typedef std::vector
<RasterTaskState
> Vector
;
61 RasterTaskState(RasterTask
* task
, bool required_for_activation
)
64 required_for_activation(required_for_activation
) {}
66 enum { UNSCHEDULED
, SCHEDULED
, UPLOADING
, COMPLETED
} type
;
68 bool required_for_activation
;
71 typedef std::deque
<scoped_refptr
<RasterTask
> > RasterTaskDeque
;
73 PixelBufferRasterWorkerPool(base::SequencedTaskRunner
* task_runner
,
74 TaskGraphRunner
* task_graph_runner
,
75 ResourceProvider
* resource_provider
,
76 size_t max_transfer_buffer_usage_bytes
);
78 void OnRasterFinished();
79 void OnRasterRequiredForActivationFinished();
81 void CheckForCompletedUploads();
82 void CheckForCompletedRasterTasks();
83 void ScheduleMoreTasks();
84 unsigned PendingRasterTaskCount() const;
85 bool HasPendingTasks() const;
86 bool HasPendingTasksRequiredForActivation() const;
87 void CheckForCompletedRasterizerTasks();
89 const char* StateName() const;
90 scoped_ptr
<base::Value
> StateAsValue() const;
91 scoped_ptr
<base::Value
> ThrottleStateAsValue() const;
93 scoped_refptr
<base::SequencedTaskRunner
> task_runner_
;
94 TaskGraphRunner
* task_graph_runner_
;
95 const NamespaceToken namespace_token_
;
96 RasterizerClient
* client_
;
97 ResourceProvider
* resource_provider_
;
101 RasterTaskQueue raster_tasks_
;
102 RasterTaskState::Vector raster_task_states_
;
103 RasterTaskDeque raster_tasks_with_pending_upload_
;
104 RasterTask::Vector completed_raster_tasks_
;
105 RasterizerTask::Vector completed_image_decode_tasks_
;
107 size_t scheduled_raster_task_count_
;
108 size_t raster_tasks_required_for_activation_count_
;
109 size_t bytes_pending_upload_
;
110 size_t max_bytes_pending_upload_
;
111 bool has_performed_uploads_since_last_flush_
;
113 bool should_notify_client_if_no_tasks_are_pending_
;
114 bool should_notify_client_if_no_tasks_required_for_activation_are_pending_
;
115 bool raster_finished_task_pending_
;
116 bool raster_required_for_activation_finished_task_pending_
;
118 DelayedUniqueNotifier check_for_completed_raster_task_notifier_
;
120 base::WeakPtrFactory
<PixelBufferRasterWorkerPool
>
121 raster_finished_weak_ptr_factory_
;
123 scoped_refptr
<RasterizerTask
> raster_finished_task_
;
124 scoped_refptr
<RasterizerTask
> raster_required_for_activation_finished_task_
;
126 // Task graph used when scheduling tasks and vector used to gather
129 Task::Vector completed_tasks_
;
131 DISALLOW_COPY_AND_ASSIGN(PixelBufferRasterWorkerPool
);
136 #endif // CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_