| 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 |