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 #include "cc/resources/image_copy_raster_worker_pool.h" | 5 #include "cc/resources/image_copy_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 "cc/debug/traced_value.h" | 11 #include "cc/debug/traced_value.h" |
12 #include "cc/resources/raster_buffer.h" | |
12 #include "cc/resources/resource_pool.h" | 13 #include "cc/resources/resource_pool.h" |
13 #include "cc/resources/scoped_resource.h" | 14 #include "cc/resources/scoped_resource.h" |
14 #include "gpu/command_buffer/client/gles2_interface.h" | 15 #include "gpu/command_buffer/client/gles2_interface.h" |
16 #include "third_party/skia/include/utils/SkNullCanvas.h" | |
15 | 17 |
16 namespace cc { | 18 namespace cc { |
19 namespace { | |
20 | |
21 class RasterBufferImpl : public RasterBuffer { | |
22 public: | |
23 RasterBufferImpl(ResourceProvider* resource_provider, | |
24 ResourcePool* resource_pool, | |
25 const Resource* resource) | |
26 : resource_provider_(resource_provider), | |
27 resource_pool_(resource_pool), | |
28 resource_(resource), | |
29 raster_resource_(resource_pool->AcquireResource(resource->size())), | |
30 buffer_(NULL), | |
31 stride_(0) { | |
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(raster_resource_->id()); | |
36 | |
37 // Acquire and map image for raster resource. | |
38 resource_provider_->AcquireImage(raster_resource_->id()); | |
39 buffer_ = resource_provider_->MapImage(raster_resource_->id(), &stride_); | |
40 } | |
41 | |
42 virtual ~RasterBufferImpl() { | |
43 // First unmap image for raster resource. | |
44 resource_provider_->UnmapImage(raster_resource_->id()); | |
45 | |
46 // Copy contents of raster resource to |resource_|. | |
47 resource_provider_->CopyResource(raster_resource_->id(), resource_->id()); | |
48 | |
49 // Return raster resource to pool so it can be used by another RasterBuffer | |
50 // instance. | |
51 resource_pool_->ReleaseResource(raster_resource_.Pass()); | |
52 } | |
53 | |
54 // Overridden from RasterBuffer: | |
55 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { | |
56 if (!buffer_) | |
57 return skia::AdoptRef(SkCreateNullCanvas()); | |
58 | |
59 RasterWorkerPool::AcquireBitmapForBuffer( | |
60 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); | |
61 return skia::AdoptRef(new SkCanvas(bitmap_)); | |
62 } | |
63 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { | |
64 if (!buffer_) | |
65 return; | |
66 | |
67 RasterWorkerPool::ReleaseBitmapForBuffer( | |
68 &bitmap_, buffer_, resource_->format()); | |
69 } | |
70 | |
71 private: | |
72 ResourceProvider* resource_provider_; | |
73 ResourcePool* resource_pool_; | |
74 const Resource* resource_; | |
75 scoped_ptr<ScopedResource> raster_resource_; | |
76 uint8_t* buffer_; | |
77 int stride_; | |
78 SkBitmap bitmap_; | |
79 | |
80 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | |
81 }; | |
82 | |
83 } // namespace | |
17 | 84 |
18 // static | 85 // static |
19 scoped_ptr<RasterWorkerPool> ImageCopyRasterWorkerPool::Create( | 86 scoped_ptr<RasterWorkerPool> ImageCopyRasterWorkerPool::Create( |
20 base::SequencedTaskRunner* task_runner, | 87 base::SequencedTaskRunner* task_runner, |
21 TaskGraphRunner* task_graph_runner, | 88 TaskGraphRunner* task_graph_runner, |
22 ContextProvider* context_provider, | 89 ContextProvider* context_provider, |
23 ResourceProvider* resource_provider, | 90 ResourceProvider* resource_provider, |
24 ResourcePool* resource_pool) { | 91 ResourcePool* resource_pool) { |
25 return make_scoped_ptr<RasterWorkerPool>( | 92 return make_scoped_ptr<RasterWorkerPool>( |
26 new ImageCopyRasterWorkerPool(task_runner, | 93 new ImageCopyRasterWorkerPool(task_runner, |
27 task_graph_runner, | 94 task_graph_runner, |
28 context_provider, | 95 context_provider, |
29 resource_provider, | 96 resource_provider, |
30 resource_pool)); | 97 resource_pool)); |
31 } | 98 } |
32 | 99 |
33 ImageCopyRasterWorkerPool::ImageCopyRasterWorkerPool( | 100 ImageCopyRasterWorkerPool::ImageCopyRasterWorkerPool( |
34 base::SequencedTaskRunner* task_runner, | 101 base::SequencedTaskRunner* task_runner, |
35 TaskGraphRunner* task_graph_runner, | 102 TaskGraphRunner* task_graph_runner, |
36 ContextProvider* context_provider, | 103 ContextProvider* context_provider, |
37 ResourceProvider* resource_provider, | 104 ResourceProvider* resource_provider, |
38 ResourcePool* resource_pool) | 105 ResourcePool* resource_pool) |
39 : task_runner_(task_runner), | 106 : task_runner_(task_runner), |
40 task_graph_runner_(task_graph_runner), | 107 task_graph_runner_(task_graph_runner), |
41 namespace_token_(task_graph_runner->GetNamespaceToken()), | 108 namespace_token_(task_graph_runner->GetNamespaceToken()), |
42 context_provider_(context_provider), | 109 context_provider_(context_provider), |
43 resource_provider_(resource_provider), | 110 resource_provider_(resource_provider), |
44 resource_pool_(resource_pool), | 111 resource_pool_(resource_pool), |
45 has_performed_copy_since_last_flush_(false), | |
46 raster_tasks_pending_(false), | 112 raster_tasks_pending_(false), |
47 raster_tasks_required_for_activation_pending_(false), | 113 raster_tasks_required_for_activation_pending_(false), |
48 raster_finished_weak_ptr_factory_(this) { | 114 raster_finished_weak_ptr_factory_(this) { |
49 DCHECK(context_provider_); | 115 DCHECK(context_provider_); |
50 } | 116 } |
51 | 117 |
52 ImageCopyRasterWorkerPool::~ImageCopyRasterWorkerPool() { | 118 ImageCopyRasterWorkerPool::~ImageCopyRasterWorkerPool() { |
53 DCHECK_EQ(0u, raster_task_states_.size()); | |
54 } | 119 } |
55 | 120 |
56 Rasterizer* ImageCopyRasterWorkerPool::AsRasterizer() { return this; } | 121 Rasterizer* ImageCopyRasterWorkerPool::AsRasterizer() { return this; } |
57 | 122 |
58 void ImageCopyRasterWorkerPool::SetClient(RasterizerClient* client) { | 123 void ImageCopyRasterWorkerPool::SetClient(RasterizerClient* client) { |
59 client_ = client; | 124 client_ = client; |
60 } | 125 } |
61 | 126 |
62 void ImageCopyRasterWorkerPool::Shutdown() { | 127 void ImageCopyRasterWorkerPool::Shutdown() { |
63 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::Shutdown"); | 128 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::Shutdown"); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 216 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); |
152 | 217 |
153 task->WillComplete(); | 218 task->WillComplete(); |
154 task->CompleteOnOriginThread(this); | 219 task->CompleteOnOriginThread(this); |
155 task->DidComplete(); | 220 task->DidComplete(); |
156 | 221 |
157 task->RunReplyOnOriginThread(); | 222 task->RunReplyOnOriginThread(); |
158 } | 223 } |
159 completed_tasks_.clear(); | 224 completed_tasks_.clear(); |
160 | 225 |
161 FlushCopies(); | 226 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); |
162 } | 227 } |
163 | 228 |
164 RasterBuffer* ImageCopyRasterWorkerPool::AcquireBufferForRaster( | 229 scoped_ptr<RasterBuffer> ImageCopyRasterWorkerPool::AcquireBufferForRaster( |
165 RasterTask* task) { | 230 const Resource* resource) { |
166 DCHECK_EQ(task->resource()->format(), resource_pool_->resource_format()); | 231 DCHECK_EQ(resource->format(), resource_pool_->resource_format()); |
167 scoped_ptr<ScopedResource> resource( | 232 return make_scoped_ptr<RasterBuffer>( |
168 resource_pool_->AcquireResource(task->resource()->size())); | 233 new RasterBufferImpl(resource_provider_, resource_pool_, resource)); |
169 RasterBuffer* raster_buffer = | |
170 resource_provider_->AcquireImageRasterBuffer(resource->id()); | |
171 DCHECK(std::find_if(raster_task_states_.begin(), | |
172 raster_task_states_.end(), | |
173 RasterTaskState::TaskComparator(task)) == | |
174 raster_task_states_.end()); | |
175 raster_task_states_.push_back(RasterTaskState(task, resource.release())); | |
176 return raster_buffer; | |
177 } | 234 } |
178 | 235 |
179 void ImageCopyRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { | 236 void ImageCopyRasterWorkerPool::ReleaseBufferForRaster( |
180 RasterTaskState::Vector::iterator it = | 237 scoped_ptr<RasterBuffer> buffer) { |
181 std::find_if(raster_task_states_.begin(), | 238 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
182 raster_task_states_.end(), | |
183 RasterTaskState::TaskComparator(task)); | |
184 DCHECK(it != raster_task_states_.end()); | |
185 scoped_ptr<ScopedResource> resource(it->resource); | |
186 std::swap(*it, raster_task_states_.back()); | |
187 raster_task_states_.pop_back(); | |
188 | |
189 bool content_has_changed = | |
190 resource_provider_->ReleaseImageRasterBuffer(resource->id()); | |
191 | |
192 // |content_has_changed| can be false as result of task being canceled or | |
193 // task implementation deciding not to modify bitmap (ie. analysis of raster | |
194 // commands detected content as a solid color). | |
195 if (content_has_changed) { | |
196 resource_provider_->CopyResource(resource->id(), task->resource()->id()); | |
197 has_performed_copy_since_last_flush_ = true; | |
198 } | |
199 | |
200 resource_pool_->ReleaseResource(resource.Pass()); | |
201 } | 239 } |
202 | 240 |
203 void ImageCopyRasterWorkerPool::OnRasterFinished() { | 241 void ImageCopyRasterWorkerPool::OnRasterFinished() { |
204 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::OnRasterFinished"); | 242 TRACE_EVENT0("cc", "ImageCopyRasterWorkerPool::OnRasterFinished"); |
205 | 243 |
206 DCHECK(raster_tasks_pending_); | 244 DCHECK(raster_tasks_pending_); |
207 raster_tasks_pending_ = false; | 245 raster_tasks_pending_ = false; |
208 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 246 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
209 client_->DidFinishRunningTasks(); | 247 client_->DidFinishRunningTasks(); |
210 } | 248 } |
211 | 249 |
212 void ImageCopyRasterWorkerPool::OnRasterRequiredForActivationFinished() { | 250 void ImageCopyRasterWorkerPool::OnRasterRequiredForActivationFinished() { |
213 TRACE_EVENT0( | 251 TRACE_EVENT0( |
214 "cc", "ImageCopyRasterWorkerPool::OnRasterRequiredForActivationFinished"); | 252 "cc", "ImageCopyRasterWorkerPool::OnRasterRequiredForActivationFinished"); |
215 | 253 |
216 DCHECK(raster_tasks_required_for_activation_pending_); | 254 DCHECK(raster_tasks_required_for_activation_pending_); |
217 raster_tasks_required_for_activation_pending_ = false; | 255 raster_tasks_required_for_activation_pending_ = false; |
218 TRACE_EVENT_ASYNC_STEP_INTO1( | 256 TRACE_EVENT_ASYNC_STEP_INTO1( |
219 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); | 257 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); |
220 client_->DidFinishRunningTasksRequiredForActivation(); | 258 client_->DidFinishRunningTasksRequiredForActivation(); |
221 } | 259 } |
222 | 260 |
223 void ImageCopyRasterWorkerPool::FlushCopies() { | |
224 if (!has_performed_copy_since_last_flush_) | |
225 return; | |
226 | |
227 context_provider_->ContextGL()->ShallowFlushCHROMIUM(); | |
228 has_performed_copy_since_last_flush_ = false; | |
229 } | |
230 | |
231 scoped_refptr<base::debug::ConvertableToTraceFormat> | 261 scoped_refptr<base::debug::ConvertableToTraceFormat> |
232 ImageCopyRasterWorkerPool::StateAsValue() const { | 262 ImageCopyRasterWorkerPool::StateAsValue() const { |
233 scoped_refptr<base::debug::TracedValue> state = | 263 scoped_refptr<base::debug::TracedValue> state = |
234 new base::debug::TracedValue(); | 264 new base::debug::TracedValue(); |
235 | 265 |
236 state->SetInteger("pending_count", raster_task_states_.size()); | |
vmpstr
2014/09/17 15:53:02
We still have a boolean that indicates that we hav
reveman
2014/09/17 16:22:54
Done.
| |
237 state->SetBoolean("tasks_required_for_activation_pending", | 266 state->SetBoolean("tasks_required_for_activation_pending", |
238 raster_tasks_required_for_activation_pending_); | 267 raster_tasks_required_for_activation_pending_); |
239 state->BeginDictionary("staging_state"); | 268 state->BeginDictionary("staging_state"); |
240 StagingStateAsValueInto(state.get()); | 269 StagingStateAsValueInto(state.get()); |
241 state->EndDictionary(); | 270 state->EndDictionary(); |
242 | 271 |
243 return state; | 272 return state; |
244 } | 273 } |
245 void ImageCopyRasterWorkerPool::StagingStateAsValueInto( | 274 void ImageCopyRasterWorkerPool::StagingStateAsValueInto( |
246 base::debug::TracedValue* staging_state) const { | 275 base::debug::TracedValue* staging_state) const { |
247 staging_state->SetInteger("staging_resource_count", | 276 staging_state->SetInteger("staging_resource_count", |
248 resource_pool_->total_resource_count()); | 277 resource_pool_->total_resource_count()); |
249 staging_state->SetInteger("bytes_used_for_staging_resources", | 278 staging_state->SetInteger("bytes_used_for_staging_resources", |
250 resource_pool_->total_memory_usage_bytes()); | 279 resource_pool_->total_memory_usage_bytes()); |
251 staging_state->SetInteger("pending_copy_count", | 280 staging_state->SetInteger("pending_copy_count", |
252 resource_pool_->total_resource_count() - | 281 resource_pool_->total_resource_count() - |
253 resource_pool_->acquired_resource_count()); | 282 resource_pool_->acquired_resource_count()); |
254 staging_state->SetInteger("bytes_pending_copy", | 283 staging_state->SetInteger("bytes_pending_copy", |
255 resource_pool_->total_memory_usage_bytes() - | 284 resource_pool_->total_memory_usage_bytes() - |
256 resource_pool_->acquired_memory_usage_bytes()); | 285 resource_pool_->acquired_memory_usage_bytes()); |
257 } | 286 } |
258 | 287 |
259 } // namespace cc | 288 } // namespace cc |
OLD | NEW |