[go: nahoru, domu]

blob: d0f97219c713c9039e750972784e9838780cabda [file] [log] [blame]
reveman@chromium.orgb5641b92014-02-15 14:21:581// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
sohan.jyoti@samsung.come1878b52014-07-01 09:21:175#include "cc/resources/gpu_raster_worker_pool.h"
reveman@chromium.orgb5641b92014-02-15 14:21:586
ernstm69fedbd2014-09-18 01:23:417#include <algorithm>
8
reveman@chromium.org7084c1d2014-03-25 23:16:059#include "base/debug/trace_event.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5810#include "cc/output/context_provider.h"
reveman47560ab2014-09-18 19:39:2111#include "cc/resources/raster_buffer.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5812#include "cc/resources/resource.h"
13#include "cc/resources/resource_provider.h"
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:4714#include "cc/resources/scoped_gpu_raster.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5815#include "gpu/command_buffer/client/gles2_interface.h"
reveman47560ab2014-09-18 19:39:2116#include "third_party/skia/include/core/SkSurface.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5817#include "third_party/skia/include/gpu/GrContext.h"
reveman47560ab2014-09-18 19:39:2118#include "third_party/skia/include/utils/SkNullCanvas.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5819
20namespace cc {
reveman47560ab2014-09-18 19:39:2121namespace {
22
23class 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
reveman@chromium.orgb5641b92014-02-15 14:21:5859
60// static
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1761scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create(
boliu@chromium.org98805e62014-03-05 01:33:5962 base::SequencedTaskRunner* task_runner,
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:4763 ContextProvider* context_provider,
sohan.jyoti@samsung.com2ea1a582014-07-03 08:50:1164 ResourceProvider* resource_provider) {
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:4765 return make_scoped_ptr<RasterWorkerPool>(new GpuRasterWorkerPool(
66 task_runner, context_provider, resource_provider));
reveman@chromium.orgb5641b92014-02-15 14:21:5867}
68
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1769GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner,
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:4770 ContextProvider* context_provider,
sohan.jyoti@samsung.com2ea1a582014-07-03 08:50:1171 ResourceProvider* resource_provider)
reveman@chromium.orgec7541d2014-04-09 01:23:5372 : task_runner_(task_runner),
reveman@chromium.orga4c9e7e2014-04-23 06:12:1873 task_graph_runner_(new TaskGraphRunner),
74 namespace_token_(task_graph_runner_->GetNamespaceToken()),
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:4775 context_provider_(context_provider),
reveman@chromium.orgec7541d2014-04-09 01:23:5376 resource_provider_(resource_provider),
reveman@chromium.orgb5641b92014-02-15 14:21:5877 run_tasks_on_origin_thread_pending_(false),
reveman@chromium.orgec7541d2014-04-09 01:23:5378 raster_finished_weak_ptr_factory_(this),
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1779 weak_ptr_factory_(this) {
boliu@chromium.org555f4fc22014-07-29 09:46:4280 DCHECK(context_provider_);
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1781}
reveman@chromium.orgb5641b92014-02-15 14:21:5882
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1783GpuRasterWorkerPool::~GpuRasterWorkerPool() {
reveman@chromium.orgb5641b92014-02-15 14:21:5884 DCHECK_EQ(0u, completed_tasks_.size());
reveman@chromium.orgec7541d2014-04-09 01:23:5385}
86
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1787Rasterizer* GpuRasterWorkerPool::AsRasterizer() {
88 return this;
89}
reveman@chromium.org7beac1b52014-04-10 23:09:5690
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1791void GpuRasterWorkerPool::SetClient(RasterizerClient* client) {
reveman@chromium.orgec7541d2014-04-09 01:23:5392 client_ = client;
reveman@chromium.orgb5641b92014-02-15 14:21:5893}
94
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1795void GpuRasterWorkerPool::Shutdown() {
96 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown");
reveman@chromium.orga4c9e7e2014-04-23 06:12:1897
98 TaskGraph empty;
99 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
100 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
101}
102
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17103void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
104 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks");
reveman@chromium.org13b45f12014-02-19 02:42:04105
ernstm69fedbd2014-09-18 01:23:41106 // Mark all task sets as pending.
107 raster_pending_.set();
reveman@chromium.orga4c9e7e2014-04-23 06:12:18108
109 unsigned priority = kRasterTaskPriorityBase;
110
111 graph_.Reset();
reveman@chromium.orgb5641b92014-02-15 14:21:58112
reveman@chromium.orgec7541d2014-04-09 01:23:53113 // Cancel existing OnRasterFinished callbacks.
114 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
115
ernstm69fedbd2014-09-18 01:23:41116 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
ernstm3a2f9032014-09-13 00:54:18117
ernstm69fedbd2014-09-18 01:23:41118 size_t task_count[kNumberOfTaskSets] = {0};
119
120 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
121 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
122 task_runner_.get(),
123 base::Bind(&GpuRasterWorkerPool::OnRasterFinished,
124 raster_finished_weak_ptr_factory_.GetWeakPtr(),
125 task_set));
126 }
reveman@chromium.orgb5641b92014-02-15 14:21:58127
reveman@chromium.orga4c9e7e2014-04-23 06:12:18128 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
129 it != queue->items.end();
130 ++it) {
131 const RasterTaskQueue::Item& item = *it;
132 RasterTask* task = item.task;
133 DCHECK(!task->HasCompleted());
reveman@chromium.orgb5641b92014-02-15 14:21:58134
ernstm69fedbd2014-09-18 01:23:41135 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
136 if (!item.task_sets[task_set])
137 continue;
138
139 ++task_count[task_set];
140
141 graph_.edges.push_back(
142 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
reveman@chromium.orgb5641b92014-02-15 14:21:58143 }
reveman@chromium.orga4c9e7e2014-04-23 06:12:18144
145 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
reveman@chromium.orgb5641b92014-02-15 14:21:58146 }
147
ernstm69fedbd2014-09-18 01:23:41148 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
149 InsertNodeForTask(&graph_,
150 new_raster_finished_tasks[task_set].get(),
151 kRasterFinishedTaskPriority,
152 task_count[task_set]);
153 }
reveman@chromium.orgb5641b92014-02-15 14:21:58154
reveman@chromium.orga4c9e7e2014-04-23 06:12:18155 ScheduleTasksOnOriginThread(this, &graph_);
156 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
157
158 ScheduleRunTasksOnOriginThread();
reveman@chromium.orgb5641b92014-02-15 14:21:58159
ernstm69fedbd2014-09-18 01:23:41160 std::copy(new_raster_finished_tasks,
161 new_raster_finished_tasks + kNumberOfTaskSets,
162 raster_finished_tasks_);
reveman@chromium.orgb5641b92014-02-15 14:21:58163}
164
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17165void GpuRasterWorkerPool::CheckForCompletedTasks() {
166 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks");
reveman@chromium.orgb5641b92014-02-15 14:21:58167
reveman@chromium.orga4c9e7e2014-04-23 06:12:18168 task_graph_runner_->CollectCompletedTasks(namespace_token_,
169 &completed_tasks_);
170 for (Task::Vector::const_iterator it = completed_tasks_.begin();
reveman@chromium.orgb5641b92014-02-15 14:21:58171 it != completed_tasks_.end();
172 ++it) {
reveman@chromium.orga4c9e7e2014-04-23 06:12:18173 RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
174
175 task->WillComplete();
176 task->CompleteOnOriginThread(this);
177 task->DidComplete();
reveman@chromium.orgb5641b92014-02-15 14:21:58178
179 task->RunReplyOnOriginThread();
180 }
181 completed_tasks_.clear();
182}
183
reveman47560ab2014-09-18 19:39:21184scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster(
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));
reveman@chromium.orgb5641b92014-02-15 14:21:58192}
193
reveman47560ab2014-09-18 19:39:21194void GpuRasterWorkerPool::ReleaseBufferForRaster(
195 scoped_ptr<RasterBuffer> buffer) {
196 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
reveman@chromium.orgb5641b92014-02-15 14:21:58197}
198
ernstm69fedbd2014-09-18 01:23:41199void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
200 TRACE_EVENT1(
201 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set);
reveman@chromium.orgec7541d2014-04-09 01:23:53202
ernstm69fedbd2014-09-18 01:23:41203 DCHECK(raster_pending_[task_set]);
204 raster_pending_[task_set] = false;
205 client_->DidFinishRunningTasks(task_set);
reveman@chromium.orgb5641b92014-02-15 14:21:58206}
207
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17208void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() {
reveman@chromium.orgb5641b92014-02-15 14:21:58209 if (run_tasks_on_origin_thread_pending_)
210 return;
211
reveman@chromium.orgec7541d2014-04-09 01:23:53212 task_runner_->PostTask(
reveman@chromium.orgb5641b92014-02-15 14:21:58213 FROM_HERE,
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17214 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread,
reveman@chromium.orgec7541d2014-04-09 01:23:53215 weak_ptr_factory_.GetWeakPtr()));
reveman@chromium.orgb5641b92014-02-15 14:21:58216 run_tasks_on_origin_thread_pending_ = true;
217}
218
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17219void GpuRasterWorkerPool::RunTasksOnOriginThread() {
220 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread");
alokp@chromium.org60c5096b2014-02-25 09:51:32221
reveman@chromium.orgb5641b92014-02-15 14:21:58222 DCHECK(run_tasks_on_origin_thread_pending_);
223 run_tasks_on_origin_thread_pending_ = false;
224
sohan.jyoti@samsung.com110fcc0e2014-07-16 15:52:47225 ScopedGpuRaster gpu_raster(context_provider_);
reveman@chromium.orga4c9e7e2014-04-23 06:12:18226 task_graph_runner_->RunUntilIdle();
reveman@chromium.orgb5641b92014-02-15 14:21:58227}
228
229} // namespace cc