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

Side by Side Diff: cc/resources/image_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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/image_raster_worker_pool.h" 5 #include "cc/resources/image_raster_worker_pool.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/debug/trace_event_argument.h" 8 #include "base/debug/trace_event_argument.h"
9 #include "base/strings/stringprintf.h"
9 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
10 #include "cc/resources/resource.h" 11 #include "cc/resources/resource.h"
11 12
12 namespace cc { 13 namespace cc {
13 14
14 // static 15 // static
15 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( 16 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create(
16 base::SequencedTaskRunner* task_runner, 17 base::SequencedTaskRunner* task_runner,
17 TaskGraphRunner* task_graph_runner, 18 TaskGraphRunner* task_graph_runner,
18 ResourceProvider* resource_provider) { 19 ResourceProvider* resource_provider) {
19 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( 20 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool(
20 task_runner, task_graph_runner, resource_provider)); 21 task_runner, task_graph_runner, resource_provider));
21 } 22 }
22 23
23 ImageRasterWorkerPool::ImageRasterWorkerPool( 24 ImageRasterWorkerPool::ImageRasterWorkerPool(
24 base::SequencedTaskRunner* task_runner, 25 base::SequencedTaskRunner* task_runner,
25 TaskGraphRunner* task_graph_runner, 26 TaskGraphRunner* task_graph_runner,
26 ResourceProvider* resource_provider) 27 ResourceProvider* resource_provider)
27 : task_runner_(task_runner), 28 : task_runner_(task_runner),
28 task_graph_runner_(task_graph_runner), 29 task_graph_runner_(task_graph_runner),
29 namespace_token_(task_graph_runner->GetNamespaceToken()), 30 namespace_token_(task_graph_runner->GetNamespaceToken()),
30 resource_provider_(resource_provider), 31 resource_provider_(resource_provider),
31 raster_tasks_pending_(false), 32 raster_tasks_pending_(false),
32 raster_tasks_required_for_activation_pending_(false),
33 raster_finished_weak_ptr_factory_(this) {} 33 raster_finished_weak_ptr_factory_(this) {}
34 34
35 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} 35 ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
36 36
37 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; } 37 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; }
38 38
39 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) { 39 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) {
40 client_ = client; 40 client_ = client;
41 } 41 }
42 42
43 void ImageRasterWorkerPool::Shutdown() { 43 void ImageRasterWorkerPool::Shutdown() {
44 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown"); 44 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown");
45 45
46 TaskGraph empty; 46 TaskGraph empty;
47 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 47 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
48 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 48 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
49 } 49 }
50 50
51 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 51 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
52 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); 52 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
53 53
54 DCHECK_EQ(queue->required_for_activation_count, 54 DCHECK(queue->VerifyTaskSetSizes());
55 static_cast<size_t>(
56 std::count_if(queue->items.begin(),
57 queue->items.end(),
58 RasterTaskQueue::Item::IsRequiredForActivation)));
59 55
60 if (!raster_tasks_pending_) 56 if (!raster_tasks_pending_)
61 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 57 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
62 58
63 raster_tasks_pending_ = true; 59 raster_tasks_pending_ = true;
64 raster_tasks_required_for_activation_pending_ = true; 60 raster_task_sets_pending_.set();
65 61
66 unsigned priority = kRasterTaskPriorityBase; 62 unsigned priority = kRasterTaskPriorityBase;
67 63
68 graph_.Reset(); 64 graph_.Reset();
69 65
70 // Cancel existing OnRasterFinished callbacks. 66 // Cancel existing OnRasterFinished callbacks.
71 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 67 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
72 68
73 scoped_refptr<RasterizerTask> 69 std::vector<scoped_refptr<RasterizerTask> > new_task_set_finished_tasks(
74 new_raster_required_for_activation_finished_task( 70 kMaxTaskSet);
reveman 2014/09/05 08:38:59 array. kMaxTaskSet + 1?
ernstm 2014/09/05 21:36:10 Done.
75 CreateRasterRequiredForActivationFinishedTask( 71
76 queue->required_for_activation_count, 72 for (TaskSet task_set = 0; task_set < kMaxTaskSet; ++task_set) {
77 task_runner_.get(), 73 base::debug::TraceEventSyntheticDelay* synthetic_delay = NULL;
78 base::Bind( 74 if (queue->task_set_sizes[task_set] > 0)
79 &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished, 75 synthetic_delay = client_->SyntheticDelayForTaskSet(task_set);
80 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 76
77 new_task_set_finished_tasks[task_set] = CreateRasterFinishedTask(
78 task_runner_.get(),
79 base::Bind(&ImageRasterWorkerPool::OnRasterTaskSetFinished,
80 raster_finished_weak_ptr_factory_.GetWeakPtr(),
81 task_set),
82 synthetic_delay);
83 }
84
81 scoped_refptr<RasterizerTask> new_raster_finished_task( 85 scoped_refptr<RasterizerTask> new_raster_finished_task(
82 CreateRasterFinishedTask( 86 CreateRasterFinishedTask(
83 task_runner_.get(), 87 task_runner_.get(),
84 base::Bind(&ImageRasterWorkerPool::OnRasterFinished, 88 base::Bind(&ImageRasterWorkerPool::OnRasterFinished,
85 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 89 raster_finished_weak_ptr_factory_.GetWeakPtr()),
90 NULL));
86 91
87 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 92 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
88 it != queue->items.end(); 93 it != queue->items.end();
89 ++it) { 94 ++it) {
90 const RasterTaskQueue::Item& item = *it; 95 const RasterTaskQueue::Item& item = *it;
91 RasterTask* task = item.task; 96 RasterTask* task = item.task;
92 DCHECK(!task->HasCompleted()); 97 DCHECK(!task->HasCompleted());
93 98
94 if (item.required_for_activation) { 99 for (TaskSet task_set = 0; task_set < kMaxTaskSet; task_set++) {
95 graph_.edges.push_back(TaskGraph::Edge( 100 if (!it->task_sets[task_set])
96 task, new_raster_required_for_activation_finished_task.get())); 101 continue;
102
103 graph_.edges.push_back(
104 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
97 } 105 }
98 106
99 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 107 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
100 108
101 graph_.edges.push_back( 109 graph_.edges.push_back(
102 TaskGraph::Edge(task, new_raster_finished_task.get())); 110 TaskGraph::Edge(task, new_raster_finished_task.get()));
103 } 111 }
104 112
105 InsertNodeForTask(&graph_, 113 for (TaskSet task_set = 0; task_set < kMaxTaskSet; task_set++) {
106 new_raster_required_for_activation_finished_task.get(), 114 InsertNodeForTask(&graph_,
107 kRasterRequiredForActivationFinishedTaskPriority, 115 new_task_set_finished_tasks[task_set],
108 queue->required_for_activation_count); 116 kRasterTaskSetFinishedTaskPriority,
117 queue->task_set_sizes[task_set]);
118 }
119
109 InsertNodeForTask(&graph_, 120 InsertNodeForTask(&graph_,
110 new_raster_finished_task.get(), 121 new_raster_finished_task.get(),
111 kRasterFinishedTaskPriority, 122 kRasterFinishedTaskPriority,
112 queue->items.size()); 123 queue->items.size());
113 124
114 ScheduleTasksOnOriginThread(this, &graph_); 125 ScheduleTasksOnOriginThread(this, &graph_);
115 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 126 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
116 127
117 raster_finished_task_ = new_raster_finished_task; 128 raster_finished_task_ = new_raster_finished_task;
118 raster_required_for_activation_finished_task_ = 129 task_set_finished_tasks_ = new_task_set_finished_tasks;
119 new_raster_required_for_activation_finished_task;
120 130
121 TRACE_EVENT_ASYNC_STEP_INTO1( 131 TRACE_EVENT_ASYNC_STEP_INTO1(
122 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 132 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
123 } 133 }
124 134
125 void ImageRasterWorkerPool::CheckForCompletedTasks() { 135 void ImageRasterWorkerPool::CheckForCompletedTasks() {
126 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); 136 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
127 137
128 task_graph_runner_->CollectCompletedTasks(namespace_token_, 138 task_graph_runner_->CollectCompletedTasks(namespace_token_,
129 &completed_tasks_); 139 &completed_tasks_);
(...skipping 26 matching lines...) Expand all
156 166
157 void ImageRasterWorkerPool::OnRasterFinished() { 167 void ImageRasterWorkerPool::OnRasterFinished() {
158 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); 168 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished");
159 169
160 DCHECK(raster_tasks_pending_); 170 DCHECK(raster_tasks_pending_);
161 raster_tasks_pending_ = false; 171 raster_tasks_pending_ = false;
162 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 172 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
163 client_->DidFinishRunningTasks(); 173 client_->DidFinishRunningTasks();
164 } 174 }
165 175
166 void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() { 176 void ImageRasterWorkerPool::OnRasterTaskSetFinished(TaskSet task_set) {
167 TRACE_EVENT0("cc", 177 TRACE_EVENT1("cc",
168 "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished"); 178 "ImageRasterWorkerPool::OnRasterTaskSetFinished",
179 "task_set",
180 task_set);
169 181
170 DCHECK(raster_tasks_required_for_activation_pending_); 182 DCHECK(raster_task_sets_pending_[task_set]);
171 raster_tasks_required_for_activation_pending_ = false; 183 raster_task_sets_pending_[task_set] = false;
172 TRACE_EVENT_ASYNC_STEP_INTO1( 184 TRACE_EVENT_ASYNC_STEP_INTO1(
173 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 185 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
174 client_->DidFinishRunningTasksRequiredForActivation(); 186 client_->DidFinishRunningTaskSet(task_set);
175 } 187 }
176 188
177 scoped_refptr<base::debug::ConvertableToTraceFormat> 189 scoped_refptr<base::debug::ConvertableToTraceFormat>
178 ImageRasterWorkerPool::StateAsValue() const { 190 ImageRasterWorkerPool::StateAsValue() const {
179 scoped_refptr<base::debug::TracedValue> state = 191 scoped_refptr<base::debug::TracedValue> state =
180 new base::debug::TracedValue(); 192 new base::debug::TracedValue();
181 193
182 state->SetBoolean("tasks_required_for_activation_pending", 194 for (TaskSet task_set = 0; task_set < kMaxTaskSet; task_set++) {
183 raster_tasks_required_for_activation_pending_); 195 state->SetBoolean(
196 base::StringPrintf("tasks_in_set_pending_%u",
197 static_cast<unsigned>(task_set)).c_str(),
198 raster_task_sets_pending_[task_set]);
199 }
184 return state; 200 return state;
185 } 201 }
186 202
187 } // namespace cc 203 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698