[go: nahoru, domu]

blob: dd55b94bc625f58bdf448648356347e8fe15d284 [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
vmiuraa30e1ea2014-12-09 19:23:515#include "cc/resources/gpu_tile_task_worker_pool.h"
reveman@chromium.orgb5641b92014-02-15 14:21:586
ernstm69fedbd2014-09-18 01:23:417#include <algorithm>
8
ssid904ce3b2015-01-27 15:20:169#include "base/trace_event/trace_event.h"
vmiura78b69282015-02-14 00:01:1710#include "cc/resources/gpu_rasterizer.h"
reveman47560ab2014-09-18 19:39:2111#include "cc/resources/raster_buffer.h"
vmpstr394e2b52014-10-28 18:38:1012#include "cc/resources/raster_source.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5813#include "cc/resources/resource.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"
hendrikw04cea972014-09-23 20:50:5316#include "third_party/skia/include/core/SkMultiPictureDraw.h"
17#include "third_party/skia/include/core/SkPictureRecorder.h"
reveman47560ab2014-09-18 19:39:2118#include "third_party/skia/include/core/SkSurface.h"
reveman@chromium.orgb5641b92014-02-15 14:21:5819#include "third_party/skia/include/gpu/GrContext.h"
20
21namespace cc {
reveman47560ab2014-09-18 19:39:2122namespace {
23
24class RasterBufferImpl : public RasterBuffer {
25 public:
vmiura78b69282015-02-14 00:01:1726 RasterBufferImpl(GpuRasterizer* rasterizer, const Resource* resource)
27 : rasterizer_(rasterizer),
28 lock_(rasterizer->resource_provider(), resource->id()),
29 resource_(resource) {}
reveman47560ab2014-09-18 19:39:2130
31 // Overridden from RasterBuffer:
vmpstr394e2b52014-10-28 18:38:1032 void Playback(const RasterSource* raster_source,
dcheng716bedf2014-10-21 09:51:0833 const gfx::Rect& rect,
hendrikw9b7f6d982014-11-04 22:28:3534 float scale) override {
vmiura78b69282015-02-14 00:01:1735 TRACE_EVENT0("cc", "RasterBufferImpl::Playback");
36
37 ContextProvider* context_provider = rasterizer_->resource_provider()
38 ->output_surface()
39 ->worker_context_provider();
40
41 // We must hold the context lock while accessing the context on the
42 // worker thread.
43 scoped_ptr<base::AutoLock> scoped_auto_lock;
44 base::Lock* lock = context_provider->GetLock();
45 if (lock)
46 scoped_auto_lock.reset(new base::AutoLock(*lock));
47
48 // Rasterize source into resource.
49 rasterizer_->RasterizeSource(true, &lock_, raster_source, rect, scale);
50
51 // Barrier to sync worker context output to cc context.
52 context_provider->ContextGL()->OrderingBarrierCHROMIUM();
reveman47560ab2014-09-18 19:39:2153 }
54
55 private:
vmiura78b69282015-02-14 00:01:1756 GpuRasterizer* rasterizer_;
57 ResourceProvider::ScopedWriteLockGr lock_;
58 const Resource* resource_;
59
reveman47560ab2014-09-18 19:39:2160 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
61};
62
63} // namespace
vmiura78b69282015-02-14 00:01:1764
reveman@chromium.orgb5641b92014-02-15 14:21:5865// static
vmiuraa30e1ea2014-12-09 19:23:5166scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create(
boliu@chromium.org98805e62014-03-05 01:33:5967 base::SequencedTaskRunner* task_runner,
peterp66304d3c2015-01-27 09:34:0768 TaskGraphRunner* task_graph_runner,
vmiura78b69282015-02-14 00:01:1769 GpuRasterizer* rasterizer) {
vmiuraa30e1ea2014-12-09 19:23:5170 return make_scoped_ptr<TileTaskWorkerPool>(
vmiura78b69282015-02-14 00:01:1771 new GpuTileTaskWorkerPool(task_runner, task_graph_runner, rasterizer));
reveman@chromium.orgb5641b92014-02-15 14:21:5872}
73
vmiuraa30e1ea2014-12-09 19:23:5174GpuTileTaskWorkerPool::GpuTileTaskWorkerPool(
75 base::SequencedTaskRunner* task_runner,
peterp66304d3c2015-01-27 09:34:0776 TaskGraphRunner* task_graph_runner,
vmiura78b69282015-02-14 00:01:1777 GpuRasterizer* rasterizer)
reveman@chromium.orgec7541d2014-04-09 01:23:5378 : task_runner_(task_runner),
hendrikw2f32e4e2015-01-03 00:22:3479 task_graph_runner_(task_graph_runner),
reveman@chromium.orga4c9e7e2014-04-23 06:12:1880 namespace_token_(task_graph_runner_->GetNamespaceToken()),
vmiura78b69282015-02-14 00:01:1781 rasterizer_(rasterizer),
vmiuraa30e1ea2014-12-09 19:23:5182 task_set_finished_weak_ptr_factory_(this),
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1783 weak_ptr_factory_(this) {
vmiura78b69282015-02-14 00:01:1784 // Allow |worker_context_provider| to bind to the worker thread.
85 rasterizer_->resource_provider()
86 ->output_surface()
87 ->worker_context_provider()
88 ->DetachFromThread();
sohan.jyoti@samsung.come1878b52014-07-01 09:21:1789}
reveman@chromium.orgb5641b92014-02-15 14:21:5890
vmiuraa30e1ea2014-12-09 19:23:5191GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() {
reveman@chromium.orgb5641b92014-02-15 14:21:5892 DCHECK_EQ(0u, completed_tasks_.size());
vmiura78b69282015-02-14 00:01:1793 // Allow |worker_context_provider| to bind to the cc thread.
94 rasterizer_->resource_provider()
95 ->output_surface()
96 ->worker_context_provider()
97 ->DetachFromThread();
reveman@chromium.orgec7541d2014-04-09 01:23:5398}
99
vmiuraa30e1ea2014-12-09 19:23:51100TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() {
sohan.jyoti@samsung.come1878b52014-07-01 09:21:17101 return this;
102}
reveman@chromium.org7beac1b52014-04-10 23:09:56103
vmiuraa30e1ea2014-12-09 19:23:51104void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
reveman@chromium.orgec7541d2014-04-09 01:23:53105 client_ = client;
reveman@chromium.orgb5641b92014-02-15 14:21:58106}
107
vmiuraa30e1ea2014-12-09 19:23:51108void GpuTileTaskWorkerPool::Shutdown() {
109 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown");
reveman@chromium.orga4c9e7e2014-04-23 06:12:18110
111 TaskGraph empty;
112 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
113 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
114}
115
vmiuraa30e1ea2014-12-09 19:23:51116void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
117 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks");
reveman@chromium.org13b45f12014-02-19 02:42:04118
ernstm69fedbd2014-09-18 01:23:41119 // Mark all task sets as pending.
vmiuraa30e1ea2014-12-09 19:23:51120 tasks_pending_.set();
reveman@chromium.orga4c9e7e2014-04-23 06:12:18121
vmiuraa30e1ea2014-12-09 19:23:51122 unsigned priority = kTileTaskPriorityBase;
reveman@chromium.orga4c9e7e2014-04-23 06:12:18123
124 graph_.Reset();
reveman@chromium.orgb5641b92014-02-15 14:21:58125
vmiuraa30e1ea2014-12-09 19:23:51126 // Cancel existing OnTaskSetFinished callbacks.
127 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
reveman@chromium.orgec7541d2014-04-09 01:23:53128
vmiuraa30e1ea2014-12-09 19:23:51129 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
ernstm3a2f9032014-09-13 00:54:18130
ernstm69fedbd2014-09-18 01:23:41131 size_t task_count[kNumberOfTaskSets] = {0};
132
133 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
vmiuraa30e1ea2014-12-09 19:23:51134 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
ernstm69fedbd2014-09-18 01:23:41135 task_runner_.get(),
vmiuraa30e1ea2014-12-09 19:23:51136 base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished,
137 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
ernstm69fedbd2014-09-18 01:23:41138 }
reveman@chromium.orgb5641b92014-02-15 14:21:58139
vmiuraa30e1ea2014-12-09 19:23:51140 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
141 it != queue->items.end(); ++it) {
142 const TileTaskQueue::Item& item = *it;
reveman@chromium.orga4c9e7e2014-04-23 06:12:18143 RasterTask* task = item.task;
144 DCHECK(!task->HasCompleted());
reveman@chromium.orgb5641b92014-02-15 14:21:58145
ernstm69fedbd2014-09-18 01:23:41146 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
147 if (!item.task_sets[task_set])
148 continue;
149
150 ++task_count[task_set];
151
152 graph_.edges.push_back(
vmiuraa30e1ea2014-12-09 19:23:51153 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
reveman@chromium.orgb5641b92014-02-15 14:21:58154 }
reveman@chromium.orga4c9e7e2014-04-23 06:12:18155
156 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
reveman@chromium.orgb5641b92014-02-15 14:21:58157 }
158
ernstm69fedbd2014-09-18 01:23:41159 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
vmiuraa30e1ea2014-12-09 19:23:51160 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
jdduked2f00422015-01-30 20:11:48161 kTaskSetFinishedTaskPriorityBase + task_set,
162 task_count[task_set]);
ernstm69fedbd2014-09-18 01:23:41163 }
reveman@chromium.orgb5641b92014-02-15 14:21:58164
reveman@chromium.orga4c9e7e2014-04-23 06:12:18165 ScheduleTasksOnOriginThread(this, &graph_);
vmiura78b69282015-02-14 00:01:17166
167 // Barrier to sync any new resources to the worker context.
168 rasterizer_->resource_provider()
169 ->output_surface()
170 ->context_provider()
171 ->ContextGL()
172 ->OrderingBarrierCHROMIUM();
173
reveman@chromium.orga4c9e7e2014-04-23 06:12:18174 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
175
vmiuraa30e1ea2014-12-09 19:23:51176 std::copy(new_task_set_finished_tasks,
177 new_task_set_finished_tasks + kNumberOfTaskSets,
178 task_set_finished_tasks_);
reveman@chromium.orgb5641b92014-02-15 14:21:58179}
180
vmiuraa30e1ea2014-12-09 19:23:51181void GpuTileTaskWorkerPool::CheckForCompletedTasks() {
182 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks");
reveman@chromium.orgb5641b92014-02-15 14:21:58183
reveman@chromium.orga4c9e7e2014-04-23 06:12:18184 task_graph_runner_->CollectCompletedTasks(namespace_token_,
185 &completed_tasks_);
hendrikw2f32e4e2015-01-03 00:22:34186 CompleteTasks(completed_tasks_);
187 completed_tasks_.clear();
188}
reveman@chromium.orga4c9e7e2014-04-23 06:12:18189
peterp66304d3c2015-01-27 09:34:07190ResourceFormat GpuTileTaskWorkerPool::GetResourceFormat() {
vmiura78b69282015-02-14 00:01:17191 return rasterizer_->resource_provider()->best_texture_format();
peterp66304d3c2015-01-27 09:34:07192}
193
hendrikw2f32e4e2015-01-03 00:22:34194void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) {
195 for (auto& task : tasks) {
196 RasterTask* raster_task = static_cast<RasterTask*>(task.get());
reveman@chromium.orgb5641b92014-02-15 14:21:58197
hendrikw2f32e4e2015-01-03 00:22:34198 raster_task->WillComplete();
199 raster_task->CompleteOnOriginThread(this);
200 raster_task->DidComplete();
201
202 raster_task->RunReplyOnOriginThread();
reveman@chromium.orgb5641b92014-02-15 14:21:58203 }
204 completed_tasks_.clear();
205}
206
vmiuraa30e1ea2014-12-09 19:23:51207scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster(
reveman47560ab2014-09-18 19:39:21208 const Resource* resource) {
vmiura78b69282015-02-14 00:01:17209 return make_scoped_ptr<RasterBuffer>(
210 new RasterBufferImpl(rasterizer_, resource));
reveman@chromium.orgb5641b92014-02-15 14:21:58211}
212
vmiuraa30e1ea2014-12-09 19:23:51213void GpuTileTaskWorkerPool::ReleaseBufferForRaster(
reveman47560ab2014-09-18 19:39:21214 scoped_ptr<RasterBuffer> buffer) {
215 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
reveman@chromium.orgb5641b92014-02-15 14:21:58216}
217
vmiuraa30e1ea2014-12-09 19:23:51218void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
219 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set",
220 task_set);
reveman@chromium.orgec7541d2014-04-09 01:23:53221
vmiuraa30e1ea2014-12-09 19:23:51222 DCHECK(tasks_pending_[task_set]);
223 tasks_pending_[task_set] = false;
224 client_->DidFinishRunningTileTasks(task_set);
reveman@chromium.orgb5641b92014-02-15 14:21:58225}
226
227} // namespace cc