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_ONE_COPY_TILE_TASK_WORKER_POOL_H_
6 #define CC_RESOURCES_ONE_COPY_TILE_TASK_WORKER_POOL_H_
8 #include "base/memory/weak_ptr.h"
9 #include "base/synchronization/lock.h"
10 #include "base/values.h"
11 #include "cc/base/scoped_ptr_deque.h"
12 #include "cc/output/context_provider.h"
13 #include "cc/resources/resource_provider.h"
14 #include "cc/resources/tile_task_runner.h"
15 #include "cc/resources/tile_task_worker_pool.h"
18 namespace trace_event
{
19 class ConvertableToTraceFormat
;
23 // TODO(ssid): remove these aliases after the tracing clients are moved to the
24 // new trace_event namespace. See crbug.com/451032. ETA: March 2015
26 using ::base::trace_event::ConvertableToTraceFormat
;
27 using ::base::trace_event::TracedValue
;
35 typedef int64 CopySequenceNumber
;
37 class CC_EXPORT OneCopyTileTaskWorkerPool
: public TileTaskWorkerPool
,
38 public TileTaskRunner
,
39 public TileTaskClient
{
41 ~OneCopyTileTaskWorkerPool() override
;
43 static scoped_ptr
<TileTaskWorkerPool
> Create(
44 base::SequencedTaskRunner
* task_runner
,
45 TaskGraphRunner
* task_graph_runner
,
46 ContextProvider
* context_provider
,
47 ResourceProvider
* resource_provider
,
48 ResourcePool
* resource_pool
);
50 // Overridden from TileTaskWorkerPool:
51 TileTaskRunner
* AsTileTaskRunner() override
;
53 // Overridden from TileTaskRunner:
54 void SetClient(TileTaskRunnerClient
* client
) override
;
55 void Shutdown() override
;
56 void ScheduleTasks(TileTaskQueue
* queue
) override
;
57 void CheckForCompletedTasks() override
;
58 ResourceFormat
GetResourceFormat() override
;
60 // Overridden from TileTaskClient:
61 scoped_ptr
<RasterBuffer
> AcquireBufferForRaster(
62 const Resource
* resource
) override
;
63 void ReleaseBufferForRaster(scoped_ptr
<RasterBuffer
> buffer
) override
;
65 // Playback raster source and schedule copy of |src| resource to |dst|
66 // resource. Returns a non-zero sequence number for this copy operation.
67 CopySequenceNumber
PlaybackAndScheduleCopyOnWorkerThread(
68 scoped_ptr
<ResourceProvider::ScopedWriteLockGpuMemoryBuffer
> write_lock
,
69 scoped_ptr
<ScopedResource
> src
,
71 const RasterSource
* raster_source
,
72 const gfx::Rect
& rect
,
75 // Issues copy operations until |sequence| has been processed. This will
76 // return immediately if |sequence| has already been processed.
77 void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence
);
80 OneCopyTileTaskWorkerPool(base::SequencedTaskRunner
* task_runner
,
81 TaskGraphRunner
* task_graph_runner
,
82 ContextProvider
* context_provider
,
83 ResourceProvider
* resource_provider
,
84 ResourcePool
* resource_pool
);
87 struct CopyOperation
{
88 typedef ScopedPtrDeque
<CopyOperation
> Deque
;
91 scoped_ptr
<ResourceProvider::ScopedWriteLockGpuMemoryBuffer
> write_lock
,
92 scoped_ptr
<ScopedResource
> src
,
96 scoped_ptr
<ResourceProvider::ScopedWriteLockGpuMemoryBuffer
> write_lock
;
97 scoped_ptr
<ScopedResource
> src
;
101 void OnTaskSetFinished(TaskSet task_set
);
102 void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence
);
103 void IssueCopyOperations(int64 count
);
104 void ScheduleCheckForCompletedCopyOperationsWithLockAcquired(
105 bool wait_if_needed
);
106 void CheckForCompletedCopyOperations(bool wait_if_needed
);
107 scoped_refptr
<base::debug::ConvertableToTraceFormat
> StateAsValue() const;
108 void StagingStateAsValueInto(base::debug::TracedValue
* staging_state
) const;
110 scoped_refptr
<base::SequencedTaskRunner
> task_runner_
;
111 TaskGraphRunner
* task_graph_runner_
;
112 const NamespaceToken namespace_token_
;
113 TileTaskRunnerClient
* client_
;
114 ContextProvider
* context_provider_
;
115 ResourceProvider
* resource_provider_
;
116 ResourcePool
* resource_pool_
;
117 TaskSetCollection tasks_pending_
;
118 scoped_refptr
<TileTask
> task_set_finished_tasks_
[kNumberOfTaskSets
];
119 CopySequenceNumber last_issued_copy_operation_
;
120 CopySequenceNumber last_flushed_copy_operation_
;
122 // Task graph used when scheduling tasks and vector used to gather
125 Task::Vector completed_tasks_
;
128 // |lock_| must be acquired when accessing the following members.
129 base::ConditionVariable copy_operation_count_cv_
;
130 size_t scheduled_copy_operation_count_
;
131 size_t issued_copy_operation_count_
;
132 CopyOperation::Deque pending_copy_operations_
;
133 CopySequenceNumber next_copy_operation_sequence_
;
134 bool check_for_completed_copy_operations_pending_
;
135 base::TimeTicks last_check_for_completed_copy_operations_time_
;
138 base::WeakPtrFactory
<OneCopyTileTaskWorkerPool
> weak_ptr_factory_
;
139 // "raster finished" tasks need their own factory as they need to be
140 // canceled when ScheduleTasks() is called.
141 base::WeakPtrFactory
<OneCopyTileTaskWorkerPool
>
142 task_set_finished_weak_ptr_factory_
;
144 DISALLOW_COPY_AND_ASSIGN(OneCopyTileTaskWorkerPool
);
149 #endif // CC_RESOURCES_ONE_COPY_TILE_TASK_WORKER_POOL_H_