Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: cc/resources/gpu_raster_worker_pool.cc

Issue 523243002: cc: Generalize raster task notifications (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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>
8
7 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
8 #include "cc/output/context_provider.h" 10 #include "cc/output/context_provider.h"
9 #include "cc/resources/resource.h" 11 #include "cc/resources/resource.h"
10 #include "cc/resources/resource_provider.h" 12 #include "cc/resources/resource_provider.h"
11 #include "cc/resources/scoped_gpu_raster.h" 13 #include "cc/resources/scoped_gpu_raster.h"
12 #include "gpu/command_buffer/client/gles2_interface.h" 14 #include "gpu/command_buffer/client/gles2_interface.h"
13 #include "third_party/skia/include/gpu/GrContext.h" 15 #include "third_party/skia/include/gpu/GrContext.h"
14 16
15 namespace cc { 17 namespace cc {
16 18
17 // static 19 // static
18 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( 20 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create(
19 base::SequencedTaskRunner* task_runner, 21 base::SequencedTaskRunner* task_runner,
20 ContextProvider* context_provider, 22 ContextProvider* context_provider,
21 ResourceProvider* resource_provider) { 23 ResourceProvider* resource_provider) {
22 return make_scoped_ptr<RasterWorkerPool>(new GpuRasterWorkerPool( 24 return make_scoped_ptr<RasterWorkerPool>(new GpuRasterWorkerPool(
23 task_runner, context_provider, resource_provider)); 25 task_runner, context_provider, resource_provider));
24 } 26 }
25 27
26 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, 28 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner,
27 ContextProvider* context_provider, 29 ContextProvider* context_provider,
28 ResourceProvider* resource_provider) 30 ResourceProvider* resource_provider)
29 : task_runner_(task_runner), 31 : task_runner_(task_runner),
30 task_graph_runner_(new TaskGraphRunner), 32 task_graph_runner_(new TaskGraphRunner),
31 namespace_token_(task_graph_runner_->GetNamespaceToken()), 33 namespace_token_(task_graph_runner_->GetNamespaceToken()),
32 context_provider_(context_provider), 34 context_provider_(context_provider),
33 resource_provider_(resource_provider), 35 resource_provider_(resource_provider),
34 run_tasks_on_origin_thread_pending_(false), 36 run_tasks_on_origin_thread_pending_(false),
35 raster_tasks_pending_(false),
36 raster_tasks_required_for_activation_pending_(false),
37 raster_finished_weak_ptr_factory_(this), 37 raster_finished_weak_ptr_factory_(this),
38 weak_ptr_factory_(this) { 38 weak_ptr_factory_(this) {
39 DCHECK(context_provider_); 39 DCHECK(context_provider_);
40 } 40 }
41 41
42 GpuRasterWorkerPool::~GpuRasterWorkerPool() { 42 GpuRasterWorkerPool::~GpuRasterWorkerPool() {
43 DCHECK_EQ(0u, completed_tasks_.size()); 43 DCHECK_EQ(0u, completed_tasks_.size());
44 } 44 }
45 45
46 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { 46 Rasterizer* GpuRasterWorkerPool::AsRasterizer() {
47 return this; 47 return this;
48 } 48 }
49 49
50 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { 50 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) {
51 client_ = client; 51 client_ = client;
52 } 52 }
53 53
54 void GpuRasterWorkerPool::Shutdown() { 54 void GpuRasterWorkerPool::Shutdown() {
55 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); 55 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown");
56 56
57 TaskGraph empty; 57 TaskGraph empty;
58 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 58 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
59 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 59 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
60 } 60 }
61 61
62 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 62 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
63 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); 63 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks");
64 64
65 raster_tasks_pending_ = true; 65 // Mark all task sets as pending.
66 raster_tasks_required_for_activation_pending_ = true; 66 raster_pending_.set();
67 67
68 unsigned priority = kRasterTaskPriorityBase; 68 unsigned priority = kRasterTaskPriorityBase;
69 69
70 graph_.Reset(); 70 graph_.Reset();
71 71
72 // Cancel existing OnRasterFinished callbacks. 72 // Cancel existing OnRasterFinished callbacks.
73 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 73 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
74 74
75 scoped_refptr<RasterizerTask> 75 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
76 new_raster_required_for_activation_finished_task(CreateRasterFinishedTask(
77 task_runner_.get(),
78 base::Bind(
79 &GpuRasterWorkerPool::OnRasterRequiredForActivationFinished,
80 raster_finished_weak_ptr_factory_.GetWeakPtr())));
81 scoped_refptr<RasterizerTask> new_raster_finished_task(
82 CreateRasterFinishedTask(
83 task_runner_.get(),
84 base::Bind(&GpuRasterWorkerPool::OnRasterFinished,
85 raster_finished_weak_ptr_factory_.GetWeakPtr())));
86 76
87 size_t required_for_activation_count = 0; 77 size_t task_count[kNumberOfTaskSets] = {0};
78
79 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
80 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
81 task_runner_.get(),
82 base::Bind(&GpuRasterWorkerPool::OnRasterFinished,
83 raster_finished_weak_ptr_factory_.GetWeakPtr(),
84 task_set));
85 }
88 86
89 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 87 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
90 it != queue->items.end(); 88 it != queue->items.end();
91 ++it) { 89 ++it) {
92 const RasterTaskQueue::Item& item = *it; 90 const RasterTaskQueue::Item& item = *it;
93 RasterTask* task = item.task; 91 RasterTask* task = item.task;
94 DCHECK(!task->HasCompleted()); 92 DCHECK(!task->HasCompleted());
95 93
96 if (item.required_for_activation) { 94 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
97 ++required_for_activation_count; 95 if (!item.task_sets[task_set])
98 graph_.edges.push_back(TaskGraph::Edge( 96 continue;
99 task, new_raster_required_for_activation_finished_task.get())); 97
98 ++task_count[task_set];
99
100 graph_.edges.push_back(
101 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
100 } 102 }
101 103
102 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 104 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
103
104 graph_.edges.push_back(
105 TaskGraph::Edge(task, new_raster_finished_task.get()));
106 } 105 }
107 106
108 InsertNodeForTask(&graph_, 107 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
109 new_raster_required_for_activation_finished_task.get(), 108 InsertNodeForTask(&graph_,
110 kRasterRequiredForActivationFinishedTaskPriority, 109 new_raster_finished_tasks[task_set].get(),
111 required_for_activation_count); 110 kRasterFinishedTaskPriority,
112 InsertNodeForTask(&graph_, 111 task_count[task_set]);
113 new_raster_finished_task.get(), 112 }
114 kRasterFinishedTaskPriority,
115 queue->items.size());
116 113
117 ScheduleTasksOnOriginThread(this, &graph_); 114 ScheduleTasksOnOriginThread(this, &graph_);
118 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 115 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
119 116
120 ScheduleRunTasksOnOriginThread(); 117 ScheduleRunTasksOnOriginThread();
121 118
122 raster_finished_task_ = new_raster_finished_task; 119 std::copy(new_raster_finished_tasks,
123 raster_required_for_activation_finished_task_ = 120 new_raster_finished_tasks + kNumberOfTaskSets,
124 new_raster_required_for_activation_finished_task; 121 raster_finished_tasks_);
125 } 122 }
126 123
127 void GpuRasterWorkerPool::CheckForCompletedTasks() { 124 void GpuRasterWorkerPool::CheckForCompletedTasks() {
128 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); 125 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks");
129 126
130 task_graph_runner_->CollectCompletedTasks(namespace_token_, 127 task_graph_runner_->CollectCompletedTasks(namespace_token_,
131 &completed_tasks_); 128 &completed_tasks_);
132 for (Task::Vector::const_iterator it = completed_tasks_.begin(); 129 for (Task::Vector::const_iterator it = completed_tasks_.begin();
133 it != completed_tasks_.end(); 130 it != completed_tasks_.end();
134 ++it) { 131 ++it) {
135 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); 132 RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
136 133
137 task->WillComplete(); 134 task->WillComplete();
138 task->CompleteOnOriginThread(this); 135 task->CompleteOnOriginThread(this);
139 task->DidComplete(); 136 task->DidComplete();
140 137
141 task->RunReplyOnOriginThread(); 138 task->RunReplyOnOriginThread();
142 } 139 }
143 completed_tasks_.clear(); 140 completed_tasks_.clear();
144 } 141 }
145 142
146 RasterBuffer* GpuRasterWorkerPool::AcquireBufferForRaster(RasterTask* task) { 143 RasterBuffer* GpuRasterWorkerPool::AcquireBufferForRaster(RasterTask* task) {
147 return resource_provider_->AcquireGpuRasterBuffer(task->resource()->id()); 144 return resource_provider_->AcquireGpuRasterBuffer(task->resource()->id());
148 } 145 }
149 146
150 void GpuRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 147 void GpuRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) {
151 resource_provider_->ReleaseGpuRasterBuffer(task->resource()->id()); 148 resource_provider_->ReleaseGpuRasterBuffer(task->resource()->id());
152 } 149 }
153 150
154 void GpuRasterWorkerPool::OnRasterFinished() { 151 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
155 TRACE_EVENT0("cc", "GpuRasterWorkerPool::OnRasterFinished"); 152 TRACE_EVENT1(
153 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set);
156 154
157 DCHECK(raster_tasks_pending_); 155 DCHECK(raster_pending_[task_set]);
158 raster_tasks_pending_ = false; 156 raster_pending_[task_set] = false;
159 client_->DidFinishRunningTasks(); 157 client_->DidFinishRunningTasks(task_set);
160 }
161
162 void GpuRasterWorkerPool::OnRasterRequiredForActivationFinished() {
163 TRACE_EVENT0("cc",
164 "GpuRasterWorkerPool::OnRasterRequiredForActivationFinished");
165
166 DCHECK(raster_tasks_required_for_activation_pending_);
167 raster_tasks_required_for_activation_pending_ = false;
168 client_->DidFinishRunningTasksRequiredForActivation();
169 } 158 }
170 159
171 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { 160 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() {
172 if (run_tasks_on_origin_thread_pending_) 161 if (run_tasks_on_origin_thread_pending_)
173 return; 162 return;
174 163
175 task_runner_->PostTask( 164 task_runner_->PostTask(
176 FROM_HERE, 165 FROM_HERE,
177 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, 166 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread,
178 weak_ptr_factory_.GetWeakPtr())); 167 weak_ptr_factory_.GetWeakPtr()));
179 run_tasks_on_origin_thread_pending_ = true; 168 run_tasks_on_origin_thread_pending_ = true;
180 } 169 }
181 170
182 void GpuRasterWorkerPool::RunTasksOnOriginThread() { 171 void GpuRasterWorkerPool::RunTasksOnOriginThread() {
183 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); 172 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread");
184 173
185 DCHECK(run_tasks_on_origin_thread_pending_); 174 DCHECK(run_tasks_on_origin_thread_pending_);
186 run_tasks_on_origin_thread_pending_ = false; 175 run_tasks_on_origin_thread_pending_ = false;
187 176
188 ScopedGpuRaster gpu_raster(context_provider_); 177 ScopedGpuRaster gpu_raster(context_provider_);
189 task_graph_runner_->RunUntilIdle(); 178 task_graph_runner_->RunUntilIdle();
190 } 179 }
191 180
192 } // namespace cc 181 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698