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 <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/resource.h" | 14 #include "cc/resources/resource.h" |
| 15 #include "third_party/skia/include/utils/SkNullCanvas.h" |
14 | 16 |
15 namespace cc { | 17 namespace cc { |
| 18 namespace { |
| 19 |
| 20 class RasterBufferImpl : public RasterBuffer { |
| 21 public: |
| 22 RasterBufferImpl(ResourceProvider* resource_provider, |
| 23 const Resource* resource) |
| 24 : resource_provider_(resource_provider), |
| 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 |
| 38 // Overridden from RasterBuffer: |
| 39 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
| 40 if (!buffer_) |
| 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 } |
| 47 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 |
| 55 private: |
| 56 ResourceProvider* resource_provider_; |
| 57 const Resource* resource_; |
| 58 int stride_; |
| 59 uint8_t* buffer_; |
| 60 SkBitmap bitmap_; |
| 61 |
| 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 63 }; |
| 64 |
| 65 } // namespace |
16 | 66 |
17 // static | 67 // static |
18 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( | 68 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( |
19 base::SequencedTaskRunner* task_runner, | 69 base::SequencedTaskRunner* task_runner, |
20 TaskGraphRunner* task_graph_runner, | 70 TaskGraphRunner* task_graph_runner, |
21 ResourceProvider* resource_provider) { | 71 ResourceProvider* resource_provider) { |
22 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( | 72 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( |
23 task_runner, task_graph_runner, resource_provider)); | 73 task_runner, task_graph_runner, resource_provider)); |
24 } | 74 } |
25 | 75 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 177 |
128 task->WillComplete(); | 178 task->WillComplete(); |
129 task->CompleteOnOriginThread(this); | 179 task->CompleteOnOriginThread(this); |
130 task->DidComplete(); | 180 task->DidComplete(); |
131 | 181 |
132 task->RunReplyOnOriginThread(); | 182 task->RunReplyOnOriginThread(); |
133 } | 183 } |
134 completed_tasks_.clear(); | 184 completed_tasks_.clear(); |
135 } | 185 } |
136 | 186 |
137 RasterBuffer* ImageRasterWorkerPool::AcquireBufferForRaster(RasterTask* task) { | 187 scoped_ptr<RasterBuffer> ImageRasterWorkerPool::AcquireBufferForRaster( |
138 return resource_provider_->AcquireImageRasterBuffer(task->resource()->id()); | 188 const Resource* resource) { |
| 189 // RasterBuffer implementation depends on an image having been acquired for |
| 190 // the resource. |
| 191 resource_provider_->AcquireImage(resource->id()); |
| 192 |
| 193 return make_scoped_ptr<RasterBuffer>( |
| 194 new RasterBufferImpl(resource_provider_, resource)); |
139 } | 195 } |
140 | 196 |
141 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { | 197 void ImageRasterWorkerPool::ReleaseBufferForRaster( |
142 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id()); | 198 scoped_ptr<RasterBuffer> buffer) { |
143 | 199 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
144 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used | |
145 // by the GPU. Read lock fences are required to ensure that we're not trying | |
146 // to map a resource that is currently in-use by the GPU. | |
147 resource_provider_->EnableReadLockFences(task->resource()->id()); | |
148 } | 200 } |
149 | 201 |
150 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 202 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
151 TRACE_EVENT1( | 203 TRACE_EVENT1( |
152 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 204 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
153 | 205 |
154 DCHECK(raster_pending_[task_set]); | 206 DCHECK(raster_pending_[task_set]); |
155 raster_pending_[task_set] = false; | 207 raster_pending_[task_set] = false; |
156 if (raster_pending_.any()) { | 208 if (raster_pending_.any()) { |
157 TRACE_EVENT_ASYNC_STEP_INTO1( | 209 TRACE_EVENT_ASYNC_STEP_INTO1( |
(...skipping 10 matching lines...) Expand all Loading... |
168 new base::debug::TracedValue(); | 220 new base::debug::TracedValue(); |
169 | 221 |
170 state->BeginArray("tasks_pending"); | 222 state->BeginArray("tasks_pending"); |
171 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 223 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
172 state->AppendBoolean(raster_pending_[task_set]); | 224 state->AppendBoolean(raster_pending_[task_set]); |
173 state->EndArray(); | 225 state->EndArray(); |
174 return state; | 226 return state; |
175 } | 227 } |
176 | 228 |
177 } // namespace cc | 229 } // namespace cc |
OLD | NEW |