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

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: Remove obsolete HasPendingTasks 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_required_for_activation_pending_(false),
33 raster_finished_weak_ptr_factory_(this) {} 32 raster_finished_weak_ptr_factory_(this) {}
34 33
35 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} 34 ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
36 35
37 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; } 36 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; }
38 37
39 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) { 38 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) {
40 client_ = client; 39 client_ = client;
41 } 40 }
42 41
43 void ImageRasterWorkerPool::Shutdown() { 42 void ImageRasterWorkerPool::Shutdown() {
44 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown"); 43 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown");
45 44
46 TaskGraph empty; 45 TaskGraph empty;
47 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 46 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
48 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 47 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
49 } 48 }
50 49
51 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 50 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
52 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); 51 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
53 52
54 DCHECK_EQ(queue->required_for_activation_count, 53 if (raster_task_sets_pending_.none())
55 static_cast<size_t>(
56 std::count_if(queue->items.begin(),
57 queue->items.end(),
58 RasterTaskQueue::Item::IsRequiredForActivation)));
59
60 if (!raster_tasks_pending_)
61 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 54 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
62 55
63 raster_tasks_pending_ = true; 56 raster_task_sets_pending_.set();
64 raster_tasks_required_for_activation_pending_ = true;
65 57
66 unsigned priority = kRasterTaskPriorityBase; 58 unsigned priority = kRasterTaskPriorityBase;
67 59
68 graph_.Reset(); 60 graph_.Reset();
69 61
70 // Cancel existing OnRasterFinished callbacks. 62 // Cancel existing OnRasterFinished callbacks.
71 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 63 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
72 64
73 scoped_refptr<RasterizerTask> 65 scoped_refptr<RasterizerTask> new_task_set_finished_tasks[kNumberOfTaskSets];
74 new_raster_required_for_activation_finished_task( 66
75 CreateRasterRequiredForActivationFinishedTask( 67 TaskSetSizes task_set_sizes(queue);
76 queue->required_for_activation_count, 68
77 task_runner_.get(), 69 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
78 base::Bind( 70 base::debug::TraceEventSyntheticDelay* synthetic_delay = NULL;
79 &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished, 71 if (task_set_sizes[task_set] > 0)
80 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 72 synthetic_delay = client_->SyntheticDelayForTaskSet(task_set);
81 scoped_refptr<RasterizerTask> new_raster_finished_task( 73
82 CreateRasterFinishedTask( 74 new_task_set_finished_tasks[task_set] = CreateRasterFinishedTask(
83 task_runner_.get(), 75 task_runner_.get(),
84 base::Bind(&ImageRasterWorkerPool::OnRasterFinished, 76 base::Bind(&ImageRasterWorkerPool::OnRasterTaskSetFinished,
85 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 77 raster_finished_weak_ptr_factory_.GetWeakPtr(),
78 task_set),
79 synthetic_delay);
80 }
86 81
87 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 82 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
88 it != queue->items.end(); 83 it != queue->items.end();
89 ++it) { 84 ++it) {
90 const RasterTaskQueue::Item& item = *it; 85 const RasterTaskQueue::Item& item = *it;
91 RasterTask* task = item.task; 86 RasterTask* task = item.task;
92 DCHECK(!task->HasCompleted()); 87 DCHECK(!task->HasCompleted());
93 88
94 if (item.required_for_activation) { 89 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
95 graph_.edges.push_back(TaskGraph::Edge( 90 if (!it->task_sets[task_set])
96 task, new_raster_required_for_activation_finished_task.get())); 91 continue;
92
93 graph_.edges.push_back(
94 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
97 } 95 }
98 96
99 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 97 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
100
101 graph_.edges.push_back(
102 TaskGraph::Edge(task, new_raster_finished_task.get()));
103 } 98 }
104 99
105 InsertNodeForTask(&graph_, 100 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
106 new_raster_required_for_activation_finished_task.get(), 101 InsertNodeForTask(&graph_,
107 kRasterRequiredForActivationFinishedTaskPriority, 102 new_task_set_finished_tasks[task_set].get(),
108 queue->required_for_activation_count); 103 kRasterTaskSetFinishedTaskPriority,
109 InsertNodeForTask(&graph_, 104 task_set_sizes[task_set]);
110 new_raster_finished_task.get(), 105 }
111 kRasterFinishedTaskPriority,
112 queue->items.size());
113 106
114 ScheduleTasksOnOriginThread(this, &graph_); 107 ScheduleTasksOnOriginThread(this, &graph_);
115 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 108 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
116 109
117 raster_finished_task_ = new_raster_finished_task; 110 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++)
118 raster_required_for_activation_finished_task_ = 111 task_set_finished_tasks_[task_set] = new_task_set_finished_tasks[task_set];
119 new_raster_required_for_activation_finished_task;
120 112
121 TRACE_EVENT_ASYNC_STEP_INTO1( 113 TRACE_EVENT_ASYNC_STEP_INTO1(
122 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 114 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
123 } 115 }
124 116
125 void ImageRasterWorkerPool::CheckForCompletedTasks() { 117 void ImageRasterWorkerPool::CheckForCompletedTasks() {
126 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); 118 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
127 119
128 task_graph_runner_->CollectCompletedTasks(namespace_token_, 120 task_graph_runner_->CollectCompletedTasks(namespace_token_,
129 &completed_tasks_); 121 &completed_tasks_);
(...skipping 17 matching lines...) Expand all
147 139
148 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 140 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) {
149 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id()); 141 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id());
150 142
151 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used 143 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used
152 // by the GPU. Read lock fences are required to ensure that we're not trying 144 // by the GPU. Read lock fences are required to ensure that we're not trying
153 // to map a resource that is currently in-use by the GPU. 145 // to map a resource that is currently in-use by the GPU.
154 resource_provider_->EnableReadLockFences(task->resource()->id()); 146 resource_provider_->EnableReadLockFences(task->resource()->id());
155 } 147 }
156 148
157 void ImageRasterWorkerPool::OnRasterFinished() { 149 void ImageRasterWorkerPool::OnRasterTaskSetFinished(TaskSet task_set) {
158 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); 150 TRACE_EVENT1("cc",
151 "ImageRasterWorkerPool::OnRasterTaskSetFinished",
152 "task_set",
153 task_set);
159 154
160 DCHECK(raster_tasks_pending_); 155 DCHECK(raster_task_sets_pending_[task_set]);
161 raster_tasks_pending_ = false; 156 raster_task_sets_pending_[task_set] = false;
162 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 157 if (raster_task_sets_pending_.any()) {
163 client_->DidFinishRunningTasks(); 158 TRACE_EVENT_ASYNC_STEP_INTO1(
164 } 159 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
165 160 } else {
166 void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() { 161 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
167 TRACE_EVENT0("cc", 162 }
168 "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished"); 163 client_->DidFinishRunningTaskSet(task_set);
169
170 DCHECK(raster_tasks_required_for_activation_pending_);
171 raster_tasks_required_for_activation_pending_ = false;
172 TRACE_EVENT_ASYNC_STEP_INTO1(
173 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
174 client_->DidFinishRunningTasksRequiredForActivation();
175 } 164 }
176 165
177 scoped_refptr<base::debug::ConvertableToTraceFormat> 166 scoped_refptr<base::debug::ConvertableToTraceFormat>
178 ImageRasterWorkerPool::StateAsValue() const { 167 ImageRasterWorkerPool::StateAsValue() const {
179 scoped_refptr<base::debug::TracedValue> state = 168 scoped_refptr<base::debug::TracedValue> state =
180 new base::debug::TracedValue(); 169 new base::debug::TracedValue();
181 170
182 state->SetBoolean("tasks_required_for_activation_pending", 171 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
183 raster_tasks_required_for_activation_pending_); 172 state->SetBoolean(
173 base::StringPrintf("tasks_in_set_pending_%u",
174 static_cast<unsigned>(task_set)).c_str(),
175 raster_task_sets_pending_[task_set]);
176 }
184 return state; 177 return state;
185 } 178 }
186 179
187 } // namespace cc 180 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698