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/gpu_raster_worker_pool.h" | 5 #include "cc/resources/gpu_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 "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
| 11 #include "cc/resources/raster_buffer.h" |
11 #include "cc/resources/resource.h" | 12 #include "cc/resources/resource.h" |
12 #include "cc/resources/resource_provider.h" | 13 #include "cc/resources/resource_provider.h" |
13 #include "cc/resources/scoped_gpu_raster.h" | 14 #include "cc/resources/scoped_gpu_raster.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/core/SkSurface.h" |
15 #include "third_party/skia/include/gpu/GrContext.h" | 17 #include "third_party/skia/include/gpu/GrContext.h" |
| 18 #include "third_party/skia/include/utils/SkNullCanvas.h" |
16 | 19 |
17 namespace cc { | 20 namespace cc { |
| 21 namespace { |
| 22 |
| 23 class RasterBufferImpl : public RasterBuffer { |
| 24 public: |
| 25 RasterBufferImpl(ResourceProvider* resource_provider, |
| 26 const Resource* resource) |
| 27 : resource_provider_(resource_provider), |
| 28 resource_(resource), |
| 29 surface_(resource_provider->LockForWriteToSkSurface(resource->id())) {} |
| 30 virtual ~RasterBufferImpl() { |
| 31 resource_provider_->UnlockForWriteToSkSurface(resource_->id()); |
| 32 } |
| 33 |
| 34 // Overridden from RasterBuffer: |
| 35 virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
| 36 skia::RefPtr<SkCanvas> canvas = surface_ |
| 37 ? skia::SharePtr(surface_->getCanvas()) |
| 38 : skia::AdoptRef(SkCreateNullCanvas()); |
| 39 |
| 40 // Balanced with restore() call in ReleaseSkCanvas. save()/restore() calls |
| 41 // are needed to ensure that canvas returns to its previous state after use. |
| 42 canvas->save(); |
| 43 return canvas; |
| 44 } |
| 45 virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { |
| 46 // Balanced with save() call in AcquireSkCanvas. |
| 47 canvas->restore(); |
| 48 } |
| 49 |
| 50 private: |
| 51 ResourceProvider* resource_provider_; |
| 52 const Resource* resource_; |
| 53 SkSurface* surface_; |
| 54 |
| 55 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 56 }; |
| 57 |
| 58 } // namespace |
18 | 59 |
19 // static | 60 // static |
20 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( | 61 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( |
21 base::SequencedTaskRunner* task_runner, | 62 base::SequencedTaskRunner* task_runner, |
22 ContextProvider* context_provider, | 63 ContextProvider* context_provider, |
23 ResourceProvider* resource_provider) { | 64 ResourceProvider* resource_provider) { |
24 return make_scoped_ptr<RasterWorkerPool>(new GpuRasterWorkerPool( | 65 return make_scoped_ptr<RasterWorkerPool>(new GpuRasterWorkerPool( |
25 task_runner, context_provider, resource_provider)); | 66 task_runner, context_provider, resource_provider)); |
26 } | 67 } |
27 | 68 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 | 174 |
134 task->WillComplete(); | 175 task->WillComplete(); |
135 task->CompleteOnOriginThread(this); | 176 task->CompleteOnOriginThread(this); |
136 task->DidComplete(); | 177 task->DidComplete(); |
137 | 178 |
138 task->RunReplyOnOriginThread(); | 179 task->RunReplyOnOriginThread(); |
139 } | 180 } |
140 completed_tasks_.clear(); | 181 completed_tasks_.clear(); |
141 } | 182 } |
142 | 183 |
143 RasterBuffer* GpuRasterWorkerPool::AcquireBufferForRaster(RasterTask* task) { | 184 scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( |
144 return resource_provider_->AcquireGpuRasterBuffer(task->resource()->id()); | 185 const Resource* resource) { |
| 186 // RasterBuffer implementation depends on a SkSurface having been acquired for |
| 187 // the resource. |
| 188 resource_provider_->AcquireSkSurface(resource->id()); |
| 189 |
| 190 return make_scoped_ptr<RasterBuffer>( |
| 191 new RasterBufferImpl(resource_provider_, resource)); |
145 } | 192 } |
146 | 193 |
147 void GpuRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { | 194 void GpuRasterWorkerPool::ReleaseBufferForRaster( |
148 resource_provider_->ReleaseGpuRasterBuffer(task->resource()->id()); | 195 scoped_ptr<RasterBuffer> buffer) { |
| 196 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
149 } | 197 } |
150 | 198 |
151 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 199 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { |
152 TRACE_EVENT1( | 200 TRACE_EVENT1( |
153 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 201 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); |
154 | 202 |
155 DCHECK(raster_pending_[task_set]); | 203 DCHECK(raster_pending_[task_set]); |
156 raster_pending_[task_set] = false; | 204 raster_pending_[task_set] = false; |
157 client_->DidFinishRunningTasks(task_set); | 205 client_->DidFinishRunningTasks(task_set); |
158 } | 206 } |
(...skipping 13 matching lines...) Expand all Loading... |
172 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); | 220 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); |
173 | 221 |
174 DCHECK(run_tasks_on_origin_thread_pending_); | 222 DCHECK(run_tasks_on_origin_thread_pending_); |
175 run_tasks_on_origin_thread_pending_ = false; | 223 run_tasks_on_origin_thread_pending_ = false; |
176 | 224 |
177 ScopedGpuRaster gpu_raster(context_provider_); | 225 ScopedGpuRaster gpu_raster(context_provider_); |
178 task_graph_runner_->RunUntilIdle(); | 226 task_graph_runner_->RunUntilIdle(); |
179 } | 227 } |
180 | 228 |
181 } // namespace cc | 229 } // namespace cc |
OLD | NEW |