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_TILE_TASK_WORKER_POOL_H_
6 #define CC_RESOURCES_PIXEL_BUFFER_TILE_TASK_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/output/context_provider.h"
15 #include "cc/resources/tile_task_runner.h"
16 #include "cc/resources/tile_task_worker_pool.h"
19 namespace trace_event
{
20 class ConvertableToTraceFormat
;
24 // TODO(ssid): remove these aliases after the tracing clients are moved to the
25 // new trace_event namespace. See crbug.com/451032. ETA: March 2015
27 using ::base::trace_event::ConvertableToTraceFormat
;
28 using ::base::trace_event::TracedValue
;
33 class ResourceProvider
;
35 class CC_EXPORT PixelBufferTileTaskWorkerPool
: public TileTaskWorkerPool
,
36 public TileTaskRunner
,
37 public TileTaskClient
{
39 ~PixelBufferTileTaskWorkerPool() override
;
41 static scoped_ptr
<TileTaskWorkerPool
> Create(
42 base::SequencedTaskRunner
* task_runner
,
43 TaskGraphRunner
* task_graph_runner
,
44 ContextProvider
* context_provider
,
45 ResourceProvider
* resource_provider
,
46 size_t max_transfer_buffer_usage_bytes
);
48 // Overridden from TileTaskWorkerPool:
49 TileTaskRunner
* AsTileTaskRunner() override
;
51 // Overridden from TileTaskRunner:
52 void SetClient(TileTaskRunnerClient
* client
) override
;
53 void Shutdown() override
;
54 void ScheduleTasks(TileTaskQueue
* queue
) override
;
55 void CheckForCompletedTasks() override
;
56 ResourceFormat
GetResourceFormat() override
;
58 // Overridden from TileTaskClient:
59 scoped_ptr
<RasterBuffer
> AcquireBufferForRaster(
60 const Resource
* resource
) override
;
61 void ReleaseBufferForRaster(scoped_ptr
<RasterBuffer
> buffer
) override
;
64 struct RasterTaskState
{
65 class TaskComparator
{
67 explicit TaskComparator(const RasterTask
* task
) : task_(task
) {}
69 bool operator()(const RasterTaskState
& state
) const {
70 return state
.task
== task_
;
74 const RasterTask
* task_
;
77 typedef std::vector
<RasterTaskState
> Vector
;
79 RasterTaskState(RasterTask
* task
, const TaskSetCollection
& task_sets
);
81 enum { UNSCHEDULED
, SCHEDULED
, UPLOADING
, COMPLETED
} type
;
83 TaskSetCollection task_sets
;
86 typedef std::deque
<scoped_refptr
<RasterTask
>> RasterTaskDeque
;
88 PixelBufferTileTaskWorkerPool(base::SequencedTaskRunner
* task_runner
,
89 TaskGraphRunner
* task_graph_runner
,
90 ContextProvider
* context_provider
,
91 ResourceProvider
* resource_provider
,
92 size_t max_transfer_buffer_usage_bytes
);
94 void OnTaskSetFinished(TaskSet task_set
);
96 void CheckForCompletedUploads();
97 void CheckForCompletedRasterTasks();
98 void ScheduleMoreTasks();
99 unsigned PendingRasterTaskCount() const;
100 TaskSetCollection
PendingTasks() const;
101 void CheckForCompletedRasterizerTasks();
103 const char* StateName() const;
104 scoped_refptr
<base::debug::ConvertableToTraceFormat
> StateAsValue() const;
105 void ThrottleStateAsValueInto(base::debug::TracedValue
* throttle_state
) const;
107 scoped_refptr
<base::SequencedTaskRunner
> task_runner_
;
108 TaskGraphRunner
* task_graph_runner_
;
109 const NamespaceToken namespace_token_
;
110 TileTaskRunnerClient
* client_
;
111 ContextProvider
* context_provider_
;
112 ResourceProvider
* resource_provider_
;
116 TileTaskQueue raster_tasks_
;
117 RasterTaskState::Vector raster_task_states_
;
118 RasterTaskDeque raster_tasks_with_pending_upload_
;
119 RasterTask::Vector completed_raster_tasks_
;
120 TileTask::Vector completed_image_decode_tasks_
;
122 size_t scheduled_raster_task_count_
;
123 size_t task_counts_
[kNumberOfTaskSets
];
124 size_t bytes_pending_upload_
;
125 size_t max_bytes_pending_upload_
;
126 bool has_performed_uploads_since_last_flush_
;
128 TaskSetCollection should_notify_client_if_no_tasks_are_pending_
;
129 TaskSetCollection task_set_finished_tasks_pending_
;
131 DelayedUniqueNotifier check_for_completed_raster_task_notifier_
;
133 scoped_refptr
<TileTask
> task_set_finished_tasks_
[kNumberOfTaskSets
];
135 // Task graph used when scheduling tasks and vector used to gather
138 Task::Vector completed_tasks_
;
140 base::WeakPtrFactory
<PixelBufferTileTaskWorkerPool
>
141 task_set_finished_weak_ptr_factory_
;
143 DISALLOW_COPY_AND_ASSIGN(PixelBufferTileTaskWorkerPool
);
148 #endif // CC_RESOURCES_PIXEL_BUFFER_TILE_TASK_WORKER_POOL_H_