OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ | 5 #ifndef CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ |
6 #define CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ | 6 #define CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ |
7 | 7 |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/synchronization/lock.h" |
9 #include "base/values.h" | 10 #include "base/values.h" |
| 11 #include "cc/base/scoped_ptr_deque.h" |
10 #include "cc/output/context_provider.h" | 12 #include "cc/output/context_provider.h" |
11 #include "cc/resources/raster_worker_pool.h" | 13 #include "cc/resources/raster_worker_pool.h" |
12 #include "cc/resources/rasterizer.h" | 14 #include "cc/resources/rasterizer.h" |
| 15 #include "cc/resources/resource_provider.h" |
13 | 16 |
14 namespace base { | 17 namespace base { |
15 namespace debug { | 18 namespace debug { |
16 class ConvertableToTraceFormat; | 19 class ConvertableToTraceFormat; |
17 class TracedValue; | 20 class TracedValue; |
18 } | 21 } |
19 } | 22 } |
20 | 23 |
21 namespace cc { | 24 namespace cc { |
22 class ResourcePool; | 25 class ResourcePool; |
23 class ResourceProvider; | 26 class ResourceProvider; |
24 class ScopedResource; | 27 |
| 28 typedef int64 CopySequenceNumber; |
25 | 29 |
26 class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, | 30 class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, |
27 public Rasterizer, | 31 public Rasterizer, |
28 public RasterizerTaskClient { | 32 public RasterizerTaskClient { |
29 public: | 33 public: |
30 ~OneCopyRasterWorkerPool() override; | 34 ~OneCopyRasterWorkerPool() override; |
31 | 35 |
32 static scoped_ptr<RasterWorkerPool> Create( | 36 static scoped_ptr<RasterWorkerPool> Create( |
33 base::SequencedTaskRunner* task_runner, | 37 base::SequencedTaskRunner* task_runner, |
34 TaskGraphRunner* task_graph_runner, | 38 TaskGraphRunner* task_graph_runner, |
35 ContextProvider* context_provider, | 39 ContextProvider* context_provider, |
36 ResourceProvider* resource_provider, | 40 ResourceProvider* resource_provider, |
37 ResourcePool* resource_pool); | 41 ResourcePool* resource_pool); |
38 | 42 |
39 // Overridden from RasterWorkerPool: | 43 // Overridden from RasterWorkerPool: |
40 Rasterizer* AsRasterizer() override; | 44 Rasterizer* AsRasterizer() override; |
41 | 45 |
42 // Overridden from Rasterizer: | 46 // Overridden from Rasterizer: |
43 void SetClient(RasterizerClient* client) override; | 47 void SetClient(RasterizerClient* client) override; |
44 void Shutdown() override; | 48 void Shutdown() override; |
45 void ScheduleTasks(RasterTaskQueue* queue) override; | 49 void ScheduleTasks(RasterTaskQueue* queue) override; |
46 void CheckForCompletedTasks() override; | 50 void CheckForCompletedTasks() override; |
47 | 51 |
48 // Overridden from RasterizerTaskClient: | 52 // Overridden from RasterizerTaskClient: |
49 scoped_ptr<RasterBuffer> AcquireBufferForRaster( | 53 scoped_ptr<RasterBuffer> AcquireBufferForRaster( |
50 const Resource* resource) override; | 54 const Resource* resource) override; |
51 void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override; | 55 void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override; |
52 | 56 |
| 57 // Schedule copy of |src| resource to |dst| resource. Returns a non-zero |
| 58 // sequence number for this copy operation. |
| 59 CopySequenceNumber ScheduleCopyOnWorkerThread( |
| 60 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, |
| 61 const Resource* src, |
| 62 const Resource* dst); |
| 63 |
| 64 // Issues copy operations until |sequence| has been processed. This will |
| 65 // return immediately if |sequence| has already been processed. |
| 66 void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence); |
| 67 |
53 protected: | 68 protected: |
54 OneCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner, | 69 OneCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner, |
55 TaskGraphRunner* task_graph_runner, | 70 TaskGraphRunner* task_graph_runner, |
56 ContextProvider* context_provider, | 71 ContextProvider* context_provider, |
57 ResourceProvider* resource_provider, | 72 ResourceProvider* resource_provider, |
58 ResourcePool* resource_pool); | 73 ResourcePool* resource_pool); |
59 | 74 |
60 private: | 75 private: |
| 76 struct CopyOperation { |
| 77 typedef ScopedPtrDeque<CopyOperation> Deque; |
| 78 |
| 79 CopyOperation( |
| 80 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, |
| 81 ResourceProvider::ResourceId src, |
| 82 ResourceProvider::ResourceId dst); |
| 83 ~CopyOperation(); |
| 84 |
| 85 scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock; |
| 86 ResourceProvider::ResourceId src; |
| 87 ResourceProvider::ResourceId dst; |
| 88 }; |
| 89 |
61 void OnRasterFinished(TaskSet task_set); | 90 void OnRasterFinished(TaskSet task_set); |
| 91 void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence); |
| 92 void IssueCopyOperations(int64 count); |
62 scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const; | 93 scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const; |
63 void StagingStateAsValueInto(base::debug::TracedValue* staging_state) const; | 94 void StagingStateAsValueInto(base::debug::TracedValue* staging_state) const; |
64 | 95 |
65 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 96 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
66 TaskGraphRunner* task_graph_runner_; | 97 TaskGraphRunner* task_graph_runner_; |
67 const NamespaceToken namespace_token_; | 98 const NamespaceToken namespace_token_; |
68 RasterizerClient* client_; | 99 RasterizerClient* client_; |
69 ContextProvider* context_provider_; | 100 ContextProvider* context_provider_; |
70 ResourceProvider* resource_provider_; | 101 ResourceProvider* resource_provider_; |
71 ResourcePool* resource_pool_; | 102 ResourcePool* resource_pool_; |
72 TaskSetCollection raster_pending_; | 103 TaskSetCollection raster_pending_; |
73 scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets]; | 104 scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets]; |
| 105 CopySequenceNumber last_issued_copy_operation_; |
| 106 CopySequenceNumber last_flushed_copy_operation_; |
74 | 107 |
75 // Task graph used when scheduling tasks and vector used to gather | 108 // Task graph used when scheduling tasks and vector used to gather |
76 // completed tasks. | 109 // completed tasks. |
77 TaskGraph graph_; | 110 TaskGraph graph_; |
78 Task::Vector completed_tasks_; | 111 Task::Vector completed_tasks_; |
79 | 112 |
| 113 base::Lock lock_; |
| 114 // |lock_| must be acquired when accessing the following members. |
| 115 CopyOperation::Deque pending_copy_operations_; |
| 116 CopySequenceNumber next_copy_operation_sequence_; |
| 117 |
| 118 base::WeakPtrFactory<OneCopyRasterWorkerPool> weak_ptr_factory_; |
| 119 // "raster finished" tasks need their own factory as they need to be |
| 120 // canceled when ScheduleTasks() is called. |
80 base::WeakPtrFactory<OneCopyRasterWorkerPool> | 121 base::WeakPtrFactory<OneCopyRasterWorkerPool> |
81 raster_finished_weak_ptr_factory_; | 122 raster_finished_weak_ptr_factory_; |
82 | 123 |
83 DISALLOW_COPY_AND_ASSIGN(OneCopyRasterWorkerPool); | 124 DISALLOW_COPY_AND_ASSIGN(OneCopyRasterWorkerPool); |
84 }; | 125 }; |
85 | 126 |
86 } // namespace cc | 127 } // namespace cc |
87 | 128 |
88 #endif // CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ | 129 #endif // CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ |
OLD | NEW |