| 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/zero_copy_raster_worker_pool.h" | 5 #include "cc/resources/zero_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 "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" | 15 #include "third_party/skia/include/utils/SkNullCanvas.h" |
| 16 | 16 |
| 17 namespace cc { | 17 namespace cc { |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 class RasterBufferImpl : public RasterBuffer { | 20 class RasterBufferImpl : public RasterBuffer { |
| 21 public: | 21 public: |
| 22 RasterBufferImpl(ResourceProvider* resource_provider, | 22 RasterBufferImpl(ResourceProvider* resource_provider, |
| 23 const Resource* resource) | 23 const Resource* resource) |
| 24 : resource_provider_(resource_provider), | 24 : lock_(resource_provider, resource->id()), |
| 25 resource_(resource), | 25 resource_(resource), |
| 26 stride_(0), | 26 buffer_(NULL) {} |
| 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 | 27 |
| 38 // Overridden from RasterBuffer: | 28 // Overridden from RasterBuffer: |
| 39 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() override { | 29 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() override { |
| 30 buffer_ = lock_.gpu_memory_buffer(); |
| 40 if (!buffer_) | 31 if (!buffer_) |
| 41 return skia::AdoptRef(SkCreateNullCanvas()); | 32 return skia::AdoptRef(SkCreateNullCanvas()); |
| 42 | 33 |
| 43 RasterWorkerPool::AcquireBitmapForBuffer( | 34 RasterWorkerPool::AcquireBitmapForBuffer(&bitmap_, |
| 44 &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); | 35 buffer_, |
| 36 resource_->format(), |
| 37 resource_->size(), |
| 38 lock_.stride()); |
| 45 return skia::AdoptRef(new SkCanvas(bitmap_)); | 39 return skia::AdoptRef(new SkCanvas(bitmap_)); |
| 46 } | 40 } |
| 47 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) override { | 41 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) override { |
| 48 if (!buffer_) | 42 if (!buffer_) |
| 49 return; | 43 return; |
| 50 | 44 |
| 51 RasterWorkerPool::ReleaseBitmapForBuffer( | 45 RasterWorkerPool::ReleaseBitmapForBuffer( |
| 52 &bitmap_, buffer_, resource_->format()); | 46 &bitmap_, buffer_, resource_->format()); |
| 53 } | 47 } |
| 54 | 48 |
| 55 private: | 49 private: |
| 56 ResourceProvider* resource_provider_; | 50 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_; |
| 57 const Resource* resource_; | 51 const Resource* resource_; |
| 58 int stride_; | 52 void* buffer_; |
| 59 uint8_t* buffer_; | |
| 60 SkBitmap bitmap_; | 53 SkBitmap bitmap_; |
| 61 | 54 |
| 62 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 55 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 63 }; | 56 }; |
| 64 | 57 |
| 65 } // namespace | 58 } // namespace |
| 66 | 59 |
| 67 // static | 60 // static |
| 68 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( | 61 scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create( |
| 69 base::SequencedTaskRunner* task_runner, | 62 base::SequencedTaskRunner* task_runner, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 task->CompleteOnOriginThread(this); | 176 task->CompleteOnOriginThread(this); |
| 184 task->DidComplete(); | 177 task->DidComplete(); |
| 185 | 178 |
| 186 task->RunReplyOnOriginThread(); | 179 task->RunReplyOnOriginThread(); |
| 187 } | 180 } |
| 188 completed_tasks_.clear(); | 181 completed_tasks_.clear(); |
| 189 } | 182 } |
| 190 | 183 |
| 191 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( | 184 scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster( |
| 192 const Resource* resource) { | 185 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>( | 186 return make_scoped_ptr<RasterBuffer>( |
| 198 new RasterBufferImpl(resource_provider_, resource)); | 187 new RasterBufferImpl(resource_provider_, resource)); |
| 199 } | 188 } |
| 200 | 189 |
| 201 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( | 190 void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster( |
| 202 scoped_ptr<RasterBuffer> buffer) { | 191 scoped_ptr<RasterBuffer> buffer) { |
| 203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 192 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
| 204 } | 193 } |
| 205 | 194 |
| 206 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 195 void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 224 new base::debug::TracedValue(); | 213 new base::debug::TracedValue(); |
| 225 | 214 |
| 226 state->BeginArray("tasks_pending"); | 215 state->BeginArray("tasks_pending"); |
| 227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | 216 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) |
| 228 state->AppendBoolean(raster_pending_[task_set]); | 217 state->AppendBoolean(raster_pending_[task_set]); |
| 229 state->EndArray(); | 218 state->EndArray(); |
| 230 return state; | 219 return state; |
| 231 } | 220 } |
| 232 | 221 |
| 233 } // namespace cc | 222 } // namespace cc |
| OLD | NEW |