OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 #include "cc/resources/zero_copy_raster_worker_pool.h" | 5 #include "cc/resources/zero_copy_tile_task_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
13 #include "cc/resources/raster_buffer.h" | 13 #include "cc/resources/raster_buffer.h" |
14 #include "cc/resources/resource.h" | 14 #include "cc/resources/resource.h" |
15 #include "ui/gfx/gpu_memory_buffer.h" | 15 #include "ui/gfx/gpu_memory_buffer.h" |
16 | 16 |
17 namespace cc { | 17 namespace cc { |
18 namespace { | 18 namespace { |
19 | 19 |
20 class RasterBufferImpl : public RasterBuffer { | 20 class RasterBufferImpl : public RasterBuffer { |
21 public: | 21 public: |
22 RasterBufferImpl(ResourceProvider* resource_provider, | 22 RasterBufferImpl(ResourceProvider* resource_provider, |
23 const Resource* resource) | 23 const Resource* resource) |
24 : lock_(resource_provider, resource->id()), resource_(resource) {} | 24 : lock_(resource_provider, resource->id()), resource_(resource) {} |
25 | 25 |
26 // Overridden from RasterBuffer: | 26 // Overridden from RasterBuffer: |
27 void Playback(const RasterSource* raster_source, | 27 void Playback(const RasterSource* raster_source, |
28 const gfx::Rect& rect, | 28 const gfx::Rect& rect, |
29 float scale) override { | 29 float scale) override { |
30 gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.GetGpuMemoryBuffer(); | 30 gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.GetGpuMemoryBuffer(); |
31 if (!gpu_memory_buffer) | 31 if (!gpu_memory_buffer) |
32 return; | 32 return; |
33 | 33 |
34 RasterWorkerPool::PlaybackToMemory( | 34 TileTaskWorkerPool::PlaybackToMemory( |
35 gpu_memory_buffer->Map(), resource_->format(), resource_->size(), | 35 gpu_memory_buffer->Map(), resource_->format(), resource_->size(), |
36 gpu_memory_buffer->GetStride(), raster_source, rect, scale); | 36 gpu_memory_buffer->GetStride(), raster_source, rect, scale); |
37 gpu_memory_buffer->Unmap(); | 37 gpu_memory_buffer->Unmap(); |
38 } | 38 } |
39 | 39 |
40 private: | 40 private: |
41 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_; | 41 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_; |
42 const Resource* resource_; | 42 const Resource* resource_; |
43 | 43 |
44 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 44 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
45 }; | 45 }; |
46 | 46 |
47 } // namespace | 47 } // namespace |
48 | 48 |
49 // static | 49 // static |
50 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( | 50 scoped_ptr<TileTaskWorkerPool> ZeroCopyTileTaskWorkerPool::Create( |
51 base::SequencedTaskRunner* task_runner, | 51 base::SequencedTaskRunner* task_runner, |
52 TaskGraphRunner* task_graph_runner, | 52 TaskGraphRunner* task_graph_runner, |
53 ResourceProvider* resource_provider) { | 53 ResourceProvider* resource_provider) { |
54 return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool( | 54 return make_scoped_ptr<TileTaskWorkerPool>(new ZeroCopyTileTaskWorkerPool( |
55 task_runner, task_graph_runner, resource_provider)); | 55 task_runner, task_graph_runner, resource_provider)); |
56 } | 56 } |
57 | 57 |
58 ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool( | 58 ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool( |
59 base::SequencedTaskRunner* task_runner, | 59 base::SequencedTaskRunner* task_runner, |
60 TaskGraphRunner* task_graph_runner, | 60 TaskGraphRunner* task_graph_runner, |
61 ResourceProvider* resource_provider) | 61 ResourceProvider* resource_provider) |
62 : task_runner_(task_runner), | 62 : task_runner_(task_runner), |
63 task_graph_runner_(task_graph_runner), | 63 task_graph_runner_(task_graph_runner), |
64 namespace_token_(task_graph_runner->GetNamespaceToken()), | 64 namespace_token_(task_graph_runner->GetNamespaceToken()), |
65 resource_provider_(resource_provider), | 65 resource_provider_(resource_provider), |
66 raster_finished_weak_ptr_factory_(this) { | 66 task_set_finished_weak_ptr_factory_(this) { |
67 } | 67 } |
68 | 68 |
69 ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() { | 69 ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() { |
70 } | 70 } |
71 | 71 |
72 Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() { | 72 TileTaskRunner* ZeroCopyTileTaskWorkerPool::AsTileTaskRunner() { |
73 return this; | 73 return this; |
74 } | 74 } |
75 | 75 |
76 void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) { | 76 void ZeroCopyTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { |
77 client_ = client; | 77 client_ = client; |
78 } | 78 } |
79 | 79 |
80 void ZeroCopyRasterWorkerPool::Shutdown() { | 80 void ZeroCopyTileTaskWorkerPool::Shutdown() { |
81 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown"); | 81 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::Shutdown"); |
82 | 82 |
83 TaskGraph empty; | 83 TaskGraph empty; |
84 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 84 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
85 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 85 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
86 } | 86 } |
87 | 87 |
88 void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 88 void ZeroCopyTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { |
89 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks"); | 89 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::ScheduleTasks"); |
90 | 90 |
91 if (raster_pending_.none()) | 91 if (tasks_pending_.none()) |
92 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 92 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
93 | 93 |
94 // Mark all task sets as pending. | 94 // Mark all task sets as pending. |
95 raster_pending_.set(); | 95 tasks_pending_.set(); |
96 | 96 |
97 unsigned priority = kRasterTaskPriorityBase; | 97 unsigned priority = kTileTaskPriorityBase; |
98 | 98 |
99 graph_.Reset(); | 99 graph_.Reset(); |
100 | 100 |
101 // Cancel existing OnRasterFinished callbacks. | 101 // Cancel existing OnTaskSetFinished callbacks. |
102 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 102 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
103 | 103 |
104 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 104 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; |
105 | 105 |
106 size_t task_count[kNumberOfTaskSets] = {0}; | 106 size_t task_count[kNumberOfTaskSets] = {0}; |
107 | 107 |
108 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 108 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
109 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 109 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( |
110 task_runner_.get(), | 110 task_runner_.get(), |
111 base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished, | 111 base::Bind(&ZeroCopyTileTaskWorkerPool::OnTaskSetFinished, |
112 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 112 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); |
113 task_set)); | |
114 } | 113 } |
115 | 114 |
116 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 115 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
117 it != queue->items.end(); | 116 it != queue->items.end(); ++it) { |
118 ++it) { | 117 const TileTaskQueue::Item& item = *it; |
119 const RasterTaskQueue::Item& item = *it; | |
120 RasterTask* task = item.task; | 118 RasterTask* task = item.task; |
121 DCHECK(!task->HasCompleted()); | 119 DCHECK(!task->HasCompleted()); |
122 | 120 |
123 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 121 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
124 if (!item.task_sets[task_set]) | 122 if (!item.task_sets[task_set]) |
125 continue; | 123 continue; |
126 | 124 |
127 ++task_count[task_set]; | 125 ++task_count[task_set]; |
128 | 126 |
129 graph_.edges.push_back( | 127 graph_.edges.push_back( |
130 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get())); | 128 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); |
131 } | 129 } |
132 | 130 |
133 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | 131 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); |
134 } | 132 } |
135 | 133 |
136 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 134 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
137 InsertNodeForTask(&graph_, | 135 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), |
138 new_raster_finished_tasks[task_set].get(), | 136 kTaskSetFinishedTaskPriority, task_count[task_set]); |
139 kRasterFinishedTaskPriority, | |
140 task_count[task_set]); | |
141 } | 137 } |
142 | 138 |
143 ScheduleTasksOnOriginThread(this, &graph_); | 139 ScheduleTasksOnOriginThread(this, &graph_); |
144 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 140 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
145 | 141 |
146 std::copy(new_raster_finished_tasks, | 142 std::copy(new_task_set_finished_tasks, |
147 new_raster_finished_tasks + kNumberOfTaskSets, | 143 new_task_set_finished_tasks + kNumberOfTaskSets, |
148 raster_finished_tasks_); | 144 task_set_finished_tasks_); |
149 | 145 |
150 TRACE_EVENT_ASYNC_STEP_INTO1( | 146 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
151 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 147 StateAsValue()); |
152 } | 148 } |
153 | 149 |
154 void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() { | 150 void ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks() { |
155 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks"); | 151 TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks"); |
156 | 152 |
157 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 153 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
158 &completed_tasks_); | 154 &completed_tasks_); |
159 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 155 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
160 it != completed_tasks_.end(); | 156 it != completed_tasks_.end(); ++it) { |
161 ++it) { | 157 TileTask* task = static_cast<TileTask*>(it->get()); |
162 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | |
163 | 158 |
164 task->WillComplete(); | 159 task->WillComplete(); |
165 task->CompleteOnOriginThread(this); | 160 task->CompleteOnOriginThread(this); |
166 task->DidComplete(); | 161 task->DidComplete(); |
167 | 162 |
168 task->RunReplyOnOriginThread(); | 163 task->RunReplyOnOriginThread(); |
169 } | 164 } |
170 completed_tasks_.clear(); | 165 completed_tasks_.clear(); |
171 } | 166 } |
172 | 167 |
173 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( | 168 scoped_ptr<RasterBuffer> ZeroCopyTileTaskWorkerPool::AcquireBufferForRaster( |
174 const Resource* resource) { | 169 const Resource* resource) { |
175 return make_scoped_ptr<RasterBuffer>( | 170 return make_scoped_ptr<RasterBuffer>( |
176 new RasterBufferImpl(resource_provider_, resource)); | 171 new RasterBufferImpl(resource_provider_, resource)); |
177 } | 172 } |
178 | 173 |
179 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( | 174 void ZeroCopyTileTaskWorkerPool::ReleaseBufferForRaster( |
180 scoped_ptr<RasterBuffer> buffer) { | 175 scoped_ptr<RasterBuffer> buffer) { |
181 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 176 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
182 } | 177 } |
183 | 178 |
184 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 179 void ZeroCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
185 TRACE_EVENT1( | 180 TRACE_EVENT1("cc", "ZeroCopyTileTaskWorkerPool::OnTaskSetFinished", |
186 "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 181 "task_set", task_set); |
187 | 182 |
188 DCHECK(raster_pending_[task_set]); | 183 DCHECK(tasks_pending_[task_set]); |
189 raster_pending_[task_set] = false; | 184 tasks_pending_[task_set] = false; |
190 if (raster_pending_.any()) { | 185 if (tasks_pending_.any()) { |
191 TRACE_EVENT_ASYNC_STEP_INTO1( | 186 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", |
192 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 187 "state", StateAsValue()); |
193 } else { | 188 } else { |
194 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 189 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
195 } | 190 } |
196 client_->DidFinishRunningTasks(task_set); | 191 client_->DidFinishRunningTileTasks(task_set); |
197 } | 192 } |
198 | 193 |
199 scoped_refptr<base::debug::ConvertableToTraceFormat> | 194 scoped_refptr<base::debug::ConvertableToTraceFormat> |
200 ZeroCopyRasterWorkerPool::StateAsValue() const { | 195 ZeroCopyTileTaskWorkerPool::StateAsValue() const { |
201 scoped_refptr<base::debug::TracedValue> state = | 196 scoped_refptr<base::debug::TracedValue> state = |
202 new base::debug::TracedValue(); | 197 new base::debug::TracedValue(); |
203 | 198 |
204 state->BeginArray("tasks_pending"); | 199 state->BeginArray("tasks_pending"); |
205 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 200 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
206 state->AppendBoolean(raster_pending_[task_set]); | 201 state->AppendBoolean(tasks_pending_[task_set]); |
207 state->EndArray(); | 202 state->EndArray(); |
208 return state; | 203 return state; |
209 } | 204 } |
210 | 205 |
211 } // namespace cc | 206 } // namespace cc |
OLD | NEW |