OLD | NEW |
1 // Copyright 2013 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 #include "cc/resources/zero_copy_raster_worker_pool.h" | 5 #include "cc/resources/bitmap_raster_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 "third_party/skia/include/utils/SkNullCanvas.h" | |
16 | 15 |
17 namespace cc { | 16 namespace cc { |
18 namespace { | 17 namespace { |
19 | 18 |
20 class RasterBufferImpl : public RasterBuffer { | 19 class RasterBufferImpl : public RasterBuffer { |
21 public: | 20 public: |
22 RasterBufferImpl(ResourceProvider* resource_provider, | 21 RasterBufferImpl(ResourceProvider* resource_provider, |
23 const Resource* resource) | 22 const Resource* resource) |
24 : resource_provider_(resource_provider), | 23 : lock_(resource_provider, resource->id()) {} |
25 resource_(resource), | |
26 stride_(0), | |
27 buffer_(resource_provider->MapImage(resource->id(), &stride_)) {} | |
28 | |
29 virtual ~RasterBufferImpl() { | |
30 resource_provider_->UnmapImage(resource_->id()); | |
31 | |
32 // This RasterBuffer implementation provides direct access to the memory | |
33 // used by the GPU. Read lock fences are required to ensure that we're not | |
34 // trying to map a resource that is currently in-use by the GPU. | |
35 resource_provider_->EnableReadLockFences(resource_->id()); | |
36 } | |
37 | 24 |
38 // Overridden from RasterBuffer: | 25 // Overridden from RasterBuffer: |
39 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { | 26 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
40 if (!buffer_) | 27 return skia::SharePtr(lock_.sk_canvas()); |
41 return skia::AdoptRef(SkCreateNullCanvas()); | |
42 | |
43 RasterWorkerPool::AcquireBitmapForBuffer( | |
44 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); | |
45 return skia::AdoptRef(new SkCanvas(bitmap_)); | |
46 } | 28 } |
47 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { | 29 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE {} |
48 if (!buffer_) | |
49 return; | |
50 | |
51 RasterWorkerPool::ReleaseBitmapForBuffer( | |
52 &bitmap_, buffer_, resource_->format()); | |
53 } | |
54 | 30 |
55 private: | 31 private: |
56 ResourceProvider* resource_provider_; | 32 ResourceProvider::ScopedWriteLockSoftware lock_; |
57 const Resource* resource_; | |
58 int stride_; | |
59 uint8_t* buffer_; | |
60 SkBitmap bitmap_; | |
61 | 33 |
62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 34 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
63 }; | 35 }; |
64 | 36 |
65 } // namespace | 37 } // namespace |
66 | 38 |
67 // static | 39 // static |
68 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( | 40 scoped_ptr<RasterWorkerPool> BitmapRasterWorkerPool::Create( |
69 base::SequencedTaskRunner* task_runner, | 41 base::SequencedTaskRunner* task_runner, |
70 TaskGraphRunner* task_graph_runner, | 42 TaskGraphRunner* task_graph_runner, |
71 ResourceProvider* resource_provider) { | 43 ResourceProvider* resource_provider) { |
72 return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool( | 44 return make_scoped_ptr<RasterWorkerPool>(new BitmapRasterWorkerPool( |
73 task_runner, task_graph_runner, resource_provider)); | 45 task_runner, task_graph_runner, resource_provider)); |
74 } | 46 } |
75 | 47 |
76 ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool( | 48 BitmapRasterWorkerPool::BitmapRasterWorkerPool( |
77 base::SequencedTaskRunner* task_runner, | 49 base::SequencedTaskRunner* task_runner, |
78 TaskGraphRunner* task_graph_runner, | 50 TaskGraphRunner* task_graph_runner, |
79 ResourceProvider* resource_provider) | 51 ResourceProvider* resource_provider) |
80 : task_runner_(task_runner), | 52 : task_runner_(task_runner), |
81 task_graph_runner_(task_graph_runner), | 53 task_graph_runner_(task_graph_runner), |
82 namespace_token_(task_graph_runner->GetNamespaceToken()), | 54 namespace_token_(task_graph_runner->GetNamespaceToken()), |
83 resource_provider_(resource_provider), | 55 resource_provider_(resource_provider), |
84 raster_finished_weak_ptr_factory_(this) { | 56 raster_finished_weak_ptr_factory_(this) { |
85 } | 57 } |
86 | 58 |
87 ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() { | 59 BitmapRasterWorkerPool::~BitmapRasterWorkerPool() { |
88 } | 60 } |
89 | 61 |
90 Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() { | 62 Rasterizer* BitmapRasterWorkerPool::AsRasterizer() { |
91 return this; | 63 return this; |
92 } | 64 } |
93 | 65 |
94 void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) { | 66 void BitmapRasterWorkerPool::SetClient(RasterizerClient* client) { |
95 client_ = client; | 67 client_ = client; |
96 } | 68 } |
97 | 69 |
98 void ZeroCopyRasterWorkerPool::Shutdown() { | 70 void BitmapRasterWorkerPool::Shutdown() { |
99 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown"); | 71 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::Shutdown"); |
100 | 72 |
101 TaskGraph empty; | 73 TaskGraph empty; |
102 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 74 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
103 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 75 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
104 } | 76 } |
105 | 77 |
106 void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 78 void BitmapRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { |
107 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks"); | 79 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::ScheduleTasks"); |
108 | 80 |
109 if (raster_pending_.none()) | 81 if (raster_pending_.none()) |
110 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 82 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
111 | 83 |
112 // Mark all task sets as pending. | 84 // Mark all task sets as pending. |
113 raster_pending_.set(); | 85 raster_pending_.set(); |
114 | 86 |
115 unsigned priority = kRasterTaskPriorityBase; | 87 unsigned priority = kRasterTaskPriorityBase; |
116 | 88 |
117 graph_.Reset(); | 89 graph_.Reset(); |
118 | 90 |
119 // Cancel existing OnRasterFinished callbacks. | 91 // Cancel existing OnRasterFinished callbacks. |
120 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 92 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
121 | 93 |
122 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 94 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; |
123 | 95 |
124 size_t task_count[kNumberOfTaskSets] = {0}; | 96 size_t task_count[kNumberOfTaskSets] = {0}; |
125 | 97 |
126 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 98 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
127 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 99 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( |
128 task_runner_.get(), | 100 task_runner_.get(), |
129 base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished, | 101 base::Bind(&BitmapRasterWorkerPool::OnRasterFinished, |
130 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 102 raster_finished_weak_ptr_factory_.GetWeakPtr(), |
131 task_set)); | 103 task_set)); |
132 } | 104 } |
133 | 105 |
134 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 106 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
135 it != queue->items.end(); | 107 it != queue->items.end(); |
136 ++it) { | 108 ++it) { |
137 const RasterTaskQueue::Item& item = *it; | 109 const RasterTaskQueue::Item& item = *it; |
138 RasterTask* task = item.task; | 110 RasterTask* task = item.task; |
139 DCHECK(!task->HasCompleted()); | 111 DCHECK(!task->HasCompleted()); |
(...skipping 22 matching lines...) Expand all Loading... |
162 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 134 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
163 | 135 |
164 std::copy(new_raster_finished_tasks, | 136 std::copy(new_raster_finished_tasks, |
165 new_raster_finished_tasks + kNumberOfTaskSets, | 137 new_raster_finished_tasks + kNumberOfTaskSets, |
166 raster_finished_tasks_); | 138 raster_finished_tasks_); |
167 | 139 |
168 TRACE_EVENT_ASYNC_STEP_INTO1( | 140 TRACE_EVENT_ASYNC_STEP_INTO1( |
169 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 141 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
170 } | 142 } |
171 | 143 |
172 void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() { | 144 void BitmapRasterWorkerPool::CheckForCompletedTasks() { |
173 TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks"); | 145 TRACE_EVENT0("cc", "BitmapRasterWorkerPool::CheckForCompletedTasks"); |
174 | 146 |
175 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 147 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
176 &completed_tasks_); | 148 &completed_tasks_); |
177 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 149 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
178 it != completed_tasks_.end(); | 150 it != completed_tasks_.end(); |
179 ++it) { | 151 ++it) { |
180 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 152 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
181 | 153 |
182 task->WillComplete(); | 154 task->WillComplete(); |
183 task->CompleteOnOriginThread(this); | 155 task->CompleteOnOriginThread(this); |
184 task->DidComplete(); | 156 task->DidComplete(); |
185 | 157 |
186 task->RunReplyOnOriginThread(); | 158 task->RunReplyOnOriginThread(); |
187 } | 159 } |
188 completed_tasks_.clear(); | 160 completed_tasks_.clear(); |
189 } | 161 } |
190 | 162 |
191 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( | 163 scoped_ptr<RasterBuffer> BitmapRasterWorkerPool::AcquireBufferForRaster( |
192 const Resource* resource) { | 164 const Resource* resource) { |
193 // RasterBuffer implementation depends on an image having been acquired for | |
194 // the resource. | |
195 resource_provider_->AcquireImage(resource->id()); | |
196 | |
197 return make_scoped_ptr<RasterBuffer>( | 165 return make_scoped_ptr<RasterBuffer>( |
198 new RasterBufferImpl(resource_provider_, resource)); | 166 new RasterBufferImpl(resource_provider_, resource)); |
199 } | 167 } |
200 | 168 |
201 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( | 169 void BitmapRasterWorkerPool::ReleaseBufferForRaster( |
202 scoped_ptr<RasterBuffer> buffer) { | 170 scoped_ptr<RasterBuffer> buffer) { |
203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 171 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
204 } | 172 } |
205 | 173 |
206 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 174 void BitmapRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
207 TRACE_EVENT1( | 175 TRACE_EVENT1( |
208 "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 176 "cc", "BitmapRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
209 | 177 |
210 DCHECK(raster_pending_[task_set]); | 178 DCHECK(raster_pending_[task_set]); |
211 raster_pending_[task_set] = false; | 179 raster_pending_[task_set] = false; |
212 if (raster_pending_.any()) { | 180 if (raster_pending_.any()) { |
213 TRACE_EVENT_ASYNC_STEP_INTO1( | 181 TRACE_EVENT_ASYNC_STEP_INTO1( |
214 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 182 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
215 } else { | 183 } else { |
216 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 184 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
217 } | 185 } |
218 client_->DidFinishRunningTasks(task_set); | 186 client_->DidFinishRunningTasks(task_set); |
219 } | 187 } |
220 | 188 |
221 scoped_refptr<base::debug::ConvertableToTraceFormat> | 189 scoped_refptr<base::debug::ConvertableToTraceFormat> |
222 ZeroCopyRasterWorkerPool::StateAsValue() const { | 190 BitmapRasterWorkerPool::StateAsValue() const { |
223 scoped_refptr<base::debug::TracedValue> state = | 191 scoped_refptr<base::debug::TracedValue> state = |
224 new base::debug::TracedValue(); | 192 new base::debug::TracedValue(); |
225 | 193 |
226 state->BeginArray("tasks_pending"); | 194 state->BeginArray("tasks_pending"); |
227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 195 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
228 state->AppendBoolean(raster_pending_[task_set]); | 196 state->AppendBoolean(raster_pending_[task_set]); |
229 state->EndArray(); | 197 state->EndArray(); |
230 return state; | 198 return state; |
231 } | 199 } |
232 | 200 |
233 } // namespace cc | 201 } // namespace cc |
OLD | NEW |