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

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: Renaming 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 <algorithm>
8
7 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
8 #include "base/debug/trace_event_argument.h" 10 #include "base/debug/trace_event_argument.h"
11 #include "base/strings/stringprintf.h"
9 #include "cc/debug/traced_value.h" 12 #include "cc/debug/traced_value.h"
10 #include "cc/resources/resource.h" 13 #include "cc/resources/resource.h"
11 14
12 namespace cc { 15 namespace cc {
13 16
14 // static 17 // static
15 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( 18 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create(
16 base::SequencedTaskRunner* task_runner, 19 base::SequencedTaskRunner* task_runner,
17 TaskGraphRunner* task_graph_runner, 20 TaskGraphRunner* task_graph_runner,
18 ResourceProvider* resource_provider) { 21 ResourceProvider* resource_provider) {
19 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool( 22 return make_scoped_ptr<RasterWorkerPool>(new ImageRasterWorkerPool(
20 task_runner, task_graph_runner, resource_provider)); 23 task_runner, task_graph_runner, resource_provider));
21 } 24 }
22 25
23 ImageRasterWorkerPool::ImageRasterWorkerPool( 26 ImageRasterWorkerPool::ImageRasterWorkerPool(
24 base::SequencedTaskRunner* task_runner, 27 base::SequencedTaskRunner* task_runner,
25 TaskGraphRunner* task_graph_runner, 28 TaskGraphRunner* task_graph_runner,
26 ResourceProvider* resource_provider) 29 ResourceProvider* resource_provider)
27 : task_runner_(task_runner), 30 : task_runner_(task_runner),
28 task_graph_runner_(task_graph_runner), 31 task_graph_runner_(task_graph_runner),
29 namespace_token_(task_graph_runner->GetNamespaceToken()), 32 namespace_token_(task_graph_runner->GetNamespaceToken()),
30 resource_provider_(resource_provider), 33 resource_provider_(resource_provider),
31 raster_tasks_pending_(false),
32 raster_tasks_required_for_activation_pending_(false),
33 raster_finished_weak_ptr_factory_(this) {} 34 raster_finished_weak_ptr_factory_(this) {}
34 35
35 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} 36 ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
36 37
37 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; } 38 Rasterizer* ImageRasterWorkerPool::AsRasterizer() { return this; }
38 39
39 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) { 40 void ImageRasterWorkerPool::SetClient(RasterizerClient* client) {
40 client_ = client; 41 client_ = client;
41 } 42 }
42 43
43 void ImageRasterWorkerPool::Shutdown() { 44 void ImageRasterWorkerPool::Shutdown() {
44 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown"); 45 TRACE_EVENT0("cc", "ImageRasterWorkerPool::Shutdown");
45 46
46 TaskGraph empty; 47 TaskGraph empty;
47 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 48 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
48 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 49 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
49 } 50 }
50 51
51 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 52 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
52 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); 53 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
53 54
54 DCHECK_EQ(queue->required_for_activation_count, 55 if (raster_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); 56 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
62 57
63 raster_tasks_pending_ = true; 58 // Mark all task sets as pending.
64 raster_tasks_required_for_activation_pending_ = true; 59 raster_pending_.set();
65 60
66 unsigned priority = kRasterTaskPriorityBase; 61 unsigned priority = kRasterTaskPriorityBase;
67 62
68 graph_.Reset(); 63 graph_.Reset();
69 64
70 // Cancel existing OnRasterFinished callbacks. 65 // Cancel existing OnRasterFinished callbacks.
71 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 66 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
72 67
73 scoped_refptr<RasterizerTask> 68 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
74 new_raster_required_for_activation_finished_task( 69
75 CreateRasterRequiredForActivationFinishedTask( 70 TaskSetSizes task_set_sizes(queue);
76 queue->required_for_activation_count, 71
77 task_runner_.get(), 72 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
78 base::Bind( 73 base::debug::TraceEventSyntheticDelay* synthetic_delay = NULL;
79 &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished, 74 if (task_set_sizes[task_set] > 0)
80 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 75 synthetic_delay = client_->SyntheticDelayForTasks(task_set);
81 scoped_refptr<RasterizerTask> new_raster_finished_task( 76
82 CreateRasterFinishedTask( 77 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
83 task_runner_.get(), 78 task_runner_.get(),
84 base::Bind(&ImageRasterWorkerPool::OnRasterFinished, 79 base::Bind(&ImageRasterWorkerPool::OnRasterFinished,
85 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 80 raster_finished_weak_ptr_factory_.GetWeakPtr(),
81 task_set),
82 synthetic_delay);
83 }
86 84
87 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 85 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
88 it != queue->items.end(); 86 it != queue->items.end();
89 ++it) { 87 ++it) {
90 const RasterTaskQueue::Item& item = *it; 88 const RasterTaskQueue::Item& item = *it;
91 RasterTask* task = item.task; 89 RasterTask* task = item.task;
92 DCHECK(!task->HasCompleted()); 90 DCHECK(!task->HasCompleted());
93 91
94 if (item.required_for_activation) { 92 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
95 graph_.edges.push_back(TaskGraph::Edge( 93 if (!item.task_sets[task_set])
96 task, new_raster_required_for_activation_finished_task.get())); 94 continue;
95
96 graph_.edges.push_back(
97 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
97 } 98 }
98 99
99 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 100 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
100
101 graph_.edges.push_back(
102 TaskGraph::Edge(task, new_raster_finished_task.get()));
103 } 101 }
104 102
105 InsertNodeForTask(&graph_, 103 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
106 new_raster_required_for_activation_finished_task.get(), 104 InsertNodeForTask(&graph_,
107 kRasterRequiredForActivationFinishedTaskPriority, 105 new_raster_finished_tasks[task_set].get(),
108 queue->required_for_activation_count); 106 kRasterFinishedTaskPriority,
109 InsertNodeForTask(&graph_, 107 task_set_sizes[task_set]);
110 new_raster_finished_task.get(), 108 }
111 kRasterFinishedTaskPriority,
112 queue->items.size());
113 109
114 ScheduleTasksOnOriginThread(this, &graph_); 110 ScheduleTasksOnOriginThread(this, &graph_);
115 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 111 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
116 112
117 raster_finished_task_ = new_raster_finished_task; 113 std::copy(new_raster_finished_tasks,
118 raster_required_for_activation_finished_task_ = 114 new_raster_finished_tasks + kNumberOfTaskSets,
119 new_raster_required_for_activation_finished_task; 115 raster_finished_tasks_);
120 116
121 TRACE_EVENT_ASYNC_STEP_INTO1( 117 TRACE_EVENT_ASYNC_STEP_INTO1(
122 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 118 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
123 } 119 }
124 120
125 void ImageRasterWorkerPool::CheckForCompletedTasks() { 121 void ImageRasterWorkerPool::CheckForCompletedTasks() {
126 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); 122 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
127 123
128 task_graph_runner_->CollectCompletedTasks(namespace_token_, 124 task_graph_runner_->CollectCompletedTasks(namespace_token_,
129 &completed_tasks_); 125 &completed_tasks_);
(...skipping 17 matching lines...) Expand all
147 143
148 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 144 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) {
149 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id()); 145 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id());
150 146
151 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used 147 // 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 148 // 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. 149 // to map a resource that is currently in-use by the GPU.
154 resource_provider_->EnableReadLockFences(task->resource()->id()); 150 resource_provider_->EnableReadLockFences(task->resource()->id());
155 } 151 }
156 152
157 void ImageRasterWorkerPool::OnRasterFinished() { 153 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
158 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); 154 TRACE_EVENT1(
155 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set);
159 156
160 DCHECK(raster_tasks_pending_); 157 DCHECK(raster_pending_[task_set]);
161 raster_tasks_pending_ = false; 158 raster_pending_[task_set] = false;
162 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 159 if (raster_pending_.any()) {
163 client_->DidFinishRunningTasks(); 160 TRACE_EVENT_ASYNC_STEP_INTO1(
164 } 161 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
165 162 } else {
166 void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() { 163 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
167 TRACE_EVENT0("cc", 164 }
168 "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished"); 165 client_->DidFinishRunningTasks(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 } 166 }
176 167
177 scoped_refptr<base::debug::ConvertableToTraceFormat> 168 scoped_refptr<base::debug::ConvertableToTraceFormat>
178 ImageRasterWorkerPool::StateAsValue() const { 169 ImageRasterWorkerPool::StateAsValue() const {
179 scoped_refptr<base::debug::TracedValue> state = 170 scoped_refptr<base::debug::TracedValue> state =
180 new base::debug::TracedValue(); 171 new base::debug::TracedValue();
181 172
182 state->SetBoolean("tasks_required_for_activation_pending", 173 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; task_set++) {
183 raster_tasks_required_for_activation_pending_); 174 state->SetBoolean(
175 base::StringPrintf("tasks_in_set_pending_%u",
176 static_cast<unsigned>(task_set)).c_str(),
177 raster_pending_[task_set]);
178 }
184 return state; 179 return state;
185 } 180 }
186 181
187 } // namespace cc 182 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698