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

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: 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 "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/output/context_provider.h" 8 #include "cc/output/context_provider.h"
9 #include "cc/resources/resource.h" 9 #include "cc/resources/resource.h"
10 #include "cc/resources/resource_provider.h" 10 #include "cc/resources/resource_provider.h"
(...skipping 15 matching lines...) Expand all
26 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, 26 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner,
27 ContextProvider* context_provider, 27 ContextProvider* context_provider,
28 ResourceProvider* resource_provider) 28 ResourceProvider* resource_provider)
29 : task_runner_(task_runner), 29 : task_runner_(task_runner),
30 task_graph_runner_(new TaskGraphRunner), 30 task_graph_runner_(new TaskGraphRunner),
31 namespace_token_(task_graph_runner_->GetNamespaceToken()), 31 namespace_token_(task_graph_runner_->GetNamespaceToken()),
32 context_provider_(context_provider), 32 context_provider_(context_provider),
33 resource_provider_(resource_provider), 33 resource_provider_(resource_provider),
34 run_tasks_on_origin_thread_pending_(false), 34 run_tasks_on_origin_thread_pending_(false),
35 raster_tasks_pending_(false), 35 raster_tasks_pending_(false),
36 raster_tasks_required_for_activation_pending_(false),
37 raster_finished_weak_ptr_factory_(this), 36 raster_finished_weak_ptr_factory_(this),
38 weak_ptr_factory_(this) { 37 weak_ptr_factory_(this) {
39 DCHECK(context_provider_); 38 DCHECK(context_provider_);
40 } 39 }
41 40
42 GpuRasterWorkerPool::~GpuRasterWorkerPool() { 41 GpuRasterWorkerPool::~GpuRasterWorkerPool() {
43 DCHECK_EQ(0u, completed_tasks_.size()); 42 DCHECK_EQ(0u, completed_tasks_.size());
44 } 43 }
45 44
46 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { 45 Rasterizer* GpuRasterWorkerPool::AsRasterizer() {
47 return this; 46 return this;
48 } 47 }
49 48
50 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { 49 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) {
51 client_ = client; 50 client_ = client;
52 } 51 }
53 52
54 void GpuRasterWorkerPool::Shutdown() { 53 void GpuRasterWorkerPool::Shutdown() {
55 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); 54 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown");
56 55
57 TaskGraph empty; 56 TaskGraph empty;
58 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 57 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
59 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 58 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
60 } 59 }
61 60
62 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 61 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
63 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); 62 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks");
64 63
65 DCHECK_EQ(queue->required_for_activation_count, 64 DCHECK(queue->VerifyTaskSetSizes());
66 static_cast<size_t>(
67 std::count_if(queue->items.begin(),
68 queue->items.end(),
69 RasterTaskQueue::Item::IsRequiredForActivation)));
70 65
71 raster_tasks_pending_ = true; 66 raster_tasks_pending_ = true;
72 raster_tasks_required_for_activation_pending_ = true; 67 raster_task_sets_pending_.set();
73 68
74 unsigned priority = kRasterTaskPriorityBase; 69 unsigned priority = kRasterTaskPriorityBase;
75 70
76 graph_.Reset(); 71 graph_.Reset();
77 72
78 // Cancel existing OnRasterFinished callbacks. 73 // Cancel existing OnRasterFinished callbacks.
79 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 74 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
80 75
81 scoped_refptr<RasterizerTask> 76 std::vector<scoped_refptr<RasterizerTask> > new_task_set_finished_tasks(
reveman 2014/09/05 08:38:59 kMaxTaskSet or "kMaxTaskSet + 1"? you'll probably
ernstm 2014/09/05 21:36:10 Done.
82 new_raster_required_for_activation_finished_task( 77 kMaxTaskSet);
83 CreateRasterRequiredForActivationFinishedTask( 78
84 queue->required_for_activation_count, 79 for (TaskSet task_set = 0; task_set < kMaxTaskSet; ++task_set) {
85 task_runner_.get(), 80 base::debug::TraceEventSyntheticDelay* synthetic_delay = NULL;
86 base::Bind( 81 if (queue->task_set_sizes[task_set] > 0)
87 &GpuRasterWorkerPool::OnRasterRequiredForActivationFinished, 82 synthetic_delay = client_->SyntheticDelayForTaskSet(task_set);
88 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 83
84 new_task_set_finished_tasks[task_set] = CreateRasterFinishedTask(
85 task_runner_.get(),
86 base::Bind(&GpuRasterWorkerPool::OnRasterTaskSetFinished,
87 raster_finished_weak_ptr_factory_.GetWeakPtr(),
88 task_set),
89 synthetic_delay);
90 }
91
89 scoped_refptr<RasterizerTask> new_raster_finished_task( 92 scoped_refptr<RasterizerTask> new_raster_finished_task(
90 CreateRasterFinishedTask( 93 CreateRasterFinishedTask(
91 task_runner_.get(), 94 task_runner_.get(),
92 base::Bind(&GpuRasterWorkerPool::OnRasterFinished, 95 base::Bind(&GpuRasterWorkerPool::OnRasterFinished,
93 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 96 raster_finished_weak_ptr_factory_.GetWeakPtr()),
97 NULL));
94 98
95 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 99 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
96 it != queue->items.end(); 100 it != queue->items.end();
97 ++it) { 101 ++it) {
98 const RasterTaskQueue::Item& item = *it; 102 const RasterTaskQueue::Item& item = *it;
99 RasterTask* task = item.task; 103 RasterTask* task = item.task;
100 DCHECK(!task->HasCompleted()); 104 DCHECK(!task->HasCompleted());
101 105
102 if (item.required_for_activation) { 106 for (TaskSet task_set = 0; task_set < kMaxTaskSet; task_set++) {
103 graph_.edges.push_back(TaskGraph::Edge( 107 if (!it->task_sets[task_set])
104 task, new_raster_required_for_activation_finished_task.get())); 108 continue;
109
110 graph_.edges.push_back(
111 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
105 } 112 }
106 113
107 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 114 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
108 115
109 graph_.edges.push_back( 116 graph_.edges.push_back(
110 TaskGraph::Edge(task, new_raster_finished_task.get())); 117 TaskGraph::Edge(task, new_raster_finished_task.get()));
111 } 118 }
112 119
113 InsertNodeForTask(&graph_, 120 for (TaskSet task_set = 0; task_set < kMaxTaskSet; task_set++) {
114 new_raster_required_for_activation_finished_task.get(), 121 InsertNodeForTask(&graph_,
115 kRasterRequiredForActivationFinishedTaskPriority, 122 new_task_set_finished_tasks[task_set],
116 queue->required_for_activation_count); 123 kRasterTaskSetFinishedTaskPriority,
124 queue->task_set_sizes[task_set]);
125 }
126
117 InsertNodeForTask(&graph_, 127 InsertNodeForTask(&graph_,
118 new_raster_finished_task.get(), 128 new_raster_finished_task.get(),
119 kRasterFinishedTaskPriority, 129 kRasterFinishedTaskPriority,
120 queue->items.size()); 130 queue->items.size());
121 131
122 ScheduleTasksOnOriginThread(this, &graph_); 132 ScheduleTasksOnOriginThread(this, &graph_);
123 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 133 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
124 134
125 ScheduleRunTasksOnOriginThread(); 135 ScheduleRunTasksOnOriginThread();
126 136
127 raster_finished_task_ = new_raster_finished_task; 137 raster_finished_task_ = new_raster_finished_task;
128 raster_required_for_activation_finished_task_ = 138 task_set_finished_tasks_ = new_task_set_finished_tasks;
129 new_raster_required_for_activation_finished_task;
130 } 139 }
131 140
132 void GpuRasterWorkerPool::CheckForCompletedTasks() { 141 void GpuRasterWorkerPool::CheckForCompletedTasks() {
133 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); 142 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks");
134 143
135 task_graph_runner_->CollectCompletedTasks(namespace_token_, 144 task_graph_runner_->CollectCompletedTasks(namespace_token_,
136 &completed_tasks_); 145 &completed_tasks_);
137 for (Task::Vector::const_iterator it = completed_tasks_.begin(); 146 for (Task::Vector::const_iterator it = completed_tasks_.begin();
138 it != completed_tasks_.end(); 147 it != completed_tasks_.end();
139 ++it) { 148 ++it) {
(...skipping 17 matching lines...) Expand all
157 } 166 }
158 167
159 void GpuRasterWorkerPool::OnRasterFinished() { 168 void GpuRasterWorkerPool::OnRasterFinished() {
160 TRACE_EVENT0("cc", "GpuRasterWorkerPool::OnRasterFinished"); 169 TRACE_EVENT0("cc", "GpuRasterWorkerPool::OnRasterFinished");
161 170
162 DCHECK(raster_tasks_pending_); 171 DCHECK(raster_tasks_pending_);
163 raster_tasks_pending_ = false; 172 raster_tasks_pending_ = false;
164 client_->DidFinishRunningTasks(); 173 client_->DidFinishRunningTasks();
165 } 174 }
166 175
167 void GpuRasterWorkerPool::OnRasterRequiredForActivationFinished() { 176 void GpuRasterWorkerPool::OnRasterTaskSetFinished(TaskSet task_set) {
168 TRACE_EVENT0("cc", 177 TRACE_EVENT1("cc",
169 "GpuRasterWorkerPool::OnRasterRequiredForActivationFinished"); 178 "GpuRasterWorkerPool::OnRasterTaskSetFinished",
179 "task_set",
180 task_set);
170 181
171 DCHECK(raster_tasks_required_for_activation_pending_); 182 DCHECK(raster_task_sets_pending_[task_set]);
172 raster_tasks_required_for_activation_pending_ = false; 183 raster_task_sets_pending_[task_set] = false;
173 client_->DidFinishRunningTasksRequiredForActivation(); 184 client_->DidFinishRunningTaskSet(task_set);
174 } 185 }
175 186
176 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { 187 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() {
177 if (run_tasks_on_origin_thread_pending_) 188 if (run_tasks_on_origin_thread_pending_)
178 return; 189 return;
179 190
180 task_runner_->PostTask( 191 task_runner_->PostTask(
181 FROM_HERE, 192 FROM_HERE,
182 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, 193 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread,
183 weak_ptr_factory_.GetWeakPtr())); 194 weak_ptr_factory_.GetWeakPtr()));
184 run_tasks_on_origin_thread_pending_ = true; 195 run_tasks_on_origin_thread_pending_ = true;
185 } 196 }
186 197
187 void GpuRasterWorkerPool::RunTasksOnOriginThread() { 198 void GpuRasterWorkerPool::RunTasksOnOriginThread() {
188 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); 199 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread");
189 200
190 DCHECK(run_tasks_on_origin_thread_pending_); 201 DCHECK(run_tasks_on_origin_thread_pending_);
191 run_tasks_on_origin_thread_pending_ = false; 202 run_tasks_on_origin_thread_pending_ = false;
192 203
193 ScopedGpuRaster gpu_raster(context_provider_); 204 ScopedGpuRaster gpu_raster(context_provider_);
194 task_graph_runner_->RunUntilIdle(); 205 task_graph_runner_->RunUntilIdle();
195 } 206 }
196 207
197 } // namespace cc 208 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698