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/image_raster_worker_pool.h" | 5 #include "cc/resources/image_raster_worker_pool.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/debug/trace_event_argument.h" | 8 #include "base/debug/trace_event_argument.h" |
9 #include "cc/debug/traced_value.h" | 9 #include "cc/debug/traced_value.h" |
| 10 #include "cc/resources/raster_buffer.h" |
10 #include "cc/resources/resource.h" | 11 #include "cc/resources/resource.h" |
| 12 #include "third_party/skia/include/utils/SkNullCanvas.h" |
11 | 13 |
12 namespace cc { | 14 namespace cc { |
| 15 namespace { |
| 16 |
| 17 class RasterBufferImpl : public RasterBuffer { |
| 18 public: |
| 19 RasterBufferImpl(ResourceProvider* resource_provider, |
| 20 const Resource* resource) |
| 21 : resource_provider_(resource_provider), |
| 22 resource_(resource), |
| 23 buffer_(NULL), |
| 24 stride_(0) { |
| 25 // This RasterBuffer implementation provides direct access to the memory |
| 26 // used by the GPU. Read lock fences are required to ensure that we're not |
| 27 // trying to map a resource that is currently in-use by the GPU. |
| 28 resource_provider_->EnableReadLockFences(resource_->id()); |
| 29 |
| 30 // Acquire and map image. |
| 31 resource_provider_->AcquireImage(resource_->id()); |
| 32 buffer_ = resource_provider_->MapImage(resource_->id(), &stride_); |
| 33 } |
| 34 |
| 35 virtual ~RasterBufferImpl() { |
| 36 resource_provider_->UnmapImage(resource_->id()); |
| 37 } |
| 38 |
| 39 // Overridden from RasterBuffer: |
| 40 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
| 41 if (!buffer_) |
| 42 return skia::AdoptRef(SkCreateNullCanvas()); |
| 43 |
| 44 RasterWorkerPool::AcquireBitmapForBuffer( |
| 45 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); |
| 46 return skia::AdoptRef(new SkCanvas(bitmap_)); |
| 47 } |
| 48 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { |
| 49 if (!buffer_) |
| 50 return; |
| 51 |
| 52 RasterWorkerPool::ReleaseBitmapForBuffer( |
| 53 &bitmap_, buffer_, resource_->format()); |
| 54 } |
| 55 |
| 56 private: |
| 57 ResourceProvider* resource_provider_; |
| 58 const Resource* resource_; |
| 59 uint8_t* buffer_; |
| 60 int stride_; |
| 61 SkBitmap bitmap_; |
| 62 |
| 63 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 64 }; |
| 65 |
| 66 } // namespace |
13 | 67 |
14 // static | 68 // static |
15 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( | 69 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( |
16 base::SequencedTaskRunner* task_runner, | 70 base::SequencedTaskRunner* task_runner, |
17 TaskGraphRunner* task_graph_runner, | 71 TaskGraphRunner* task_graph_runner, |
18 ResourceProvider* resource_provider) { | 72 ResourceProvider* resource_provider) { |
19 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( | 73 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( |
20 task_runner, task_graph_runner, resource_provider)); | 74 task_runner, task_graph_runner, resource_provider)); |
21 } | 75 } |
22 | 76 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 183 |
130 task->WillComplete(); | 184 task->WillComplete(); |
131 task->CompleteOnOriginThread(this); | 185 task->CompleteOnOriginThread(this); |
132 task->DidComplete(); | 186 task->DidComplete(); |
133 | 187 |
134 task->RunReplyOnOriginThread(); | 188 task->RunReplyOnOriginThread(); |
135 } | 189 } |
136 completed_tasks_.clear(); | 190 completed_tasks_.clear(); |
137 } | 191 } |
138 | 192 |
139 RasterBuffer* ImageRasterWorkerPool::AcquireBufferForRaster(RasterTask* task) { | 193 scoped_ptr<RasterBuffer> ImageRasterWorkerPool::AcquireBufferForRaster( |
140 return resource_provider_->AcquireImageRasterBuffer(task->resource()->id()); | 194 const Resource* resource) { |
| 195 return make_scoped_ptr<RasterBuffer>( |
| 196 new RasterBufferImpl(resource_provider_, resource)); |
141 } | 197 } |
142 | 198 |
143 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { | 199 void ImageRasterWorkerPool::ReleaseBufferForRaster( |
144 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id()); | 200 scoped_ptr<RasterBuffer> buffer) { |
145 | 201 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
146 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used | |
147 // by the GPU. Read lock fences are required to ensure that we're not trying | |
148 // to map a resource that is currently in-use by the GPU. | |
149 resource_provider_->EnableReadLockFences(task->resource()->id()); | |
150 } | 202 } |
151 | 203 |
152 void ImageRasterWorkerPool::OnRasterFinished() { | 204 void ImageRasterWorkerPool::OnRasterFinished() { |
153 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); | 205 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); |
154 | 206 |
155 DCHECK(raster_tasks_pending_); | 207 DCHECK(raster_tasks_pending_); |
156 raster_tasks_pending_ = false; | 208 raster_tasks_pending_ = false; |
157 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | 209 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
158 client_->DidFinishRunningTasks(); | 210 client_->DidFinishRunningTasks(); |
159 } | 211 } |
(...skipping 13 matching lines...) Expand all Loading... |
173 ImageRasterWorkerPool::StateAsValue() const { | 225 ImageRasterWorkerPool::StateAsValue() const { |
174 scoped_refptr<base::debug::TracedValue> state = | 226 scoped_refptr<base::debug::TracedValue> state = |
175 new base::debug::TracedValue(); | 227 new base::debug::TracedValue(); |
176 | 228 |
177 state->SetBoolean("tasks_required_for_activation_pending", | 229 state->SetBoolean("tasks_required_for_activation_pending", |
178 raster_tasks_required_for_activation_pending_); | 230 raster_tasks_required_for_activation_pending_); |
179 return state; | 231 return state; |
180 } | 232 } |
181 | 233 |
182 } // namespace cc | 234 } // namespace cc |
OLD | NEW |