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

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: 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 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 if (!raster_tasks_pending_) 55 if (raster_pending_.none())
55 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 56 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
56 57
57 raster_tasks_pending_ = true; 58 // Mark all task sets as pending.
58 raster_tasks_required_for_activation_pending_ = true; 59 raster_pending_.set();
59 60
60 unsigned priority = kRasterTaskPriorityBase; 61 unsigned priority = kRasterTaskPriorityBase;
61 62
62 graph_.Reset(); 63 graph_.Reset();
63 64
64 // Cancel existing OnRasterFinished callbacks. 65 // Cancel existing OnRasterFinished callbacks.
65 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 66 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
66 67
67 scoped_refptr<RasterizerTask> 68 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
68 new_raster_required_for_activation_finished_task(CreateRasterFinishedTask(
69 task_runner_.get(),
70 base::Bind(
71 &ImageRasterWorkerPool::OnRasterRequiredForActivationFinished,
72 raster_finished_weak_ptr_factory_.GetWeakPtr())));
73 scoped_refptr<RasterizerTask> new_raster_finished_task(
74 CreateRasterFinishedTask(
75 task_runner_.get(),
76 base::Bind(&ImageRasterWorkerPool::OnRasterFinished,
77 raster_finished_weak_ptr_factory_.GetWeakPtr())));
78 69
79 size_t required_for_activation_count = 0; 70 size_t task_count[kNumberOfTaskSets] = {0};
71
72 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
73 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
74 task_runner_.get(),
75 base::Bind(&ImageRasterWorkerPool::OnRasterFinished,
76 raster_finished_weak_ptr_factory_.GetWeakPtr(),
77 task_set));
78 }
80 79
81 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 80 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
82 it != queue->items.end(); 81 it != queue->items.end();
83 ++it) { 82 ++it) {
84 const RasterTaskQueue::Item& item = *it; 83 const RasterTaskQueue::Item& item = *it;
85 RasterTask* task = item.task; 84 RasterTask* task = item.task;
86 DCHECK(!task->HasCompleted()); 85 DCHECK(!task->HasCompleted());
87 86
88 if (item.required_for_activation) { 87 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
89 ++required_for_activation_count; 88 if (!item.task_sets[task_set])
90 graph_.edges.push_back(TaskGraph::Edge( 89 continue;
91 task, new_raster_required_for_activation_finished_task.get())); 90
91 ++task_count[task_set];
92
93 graph_.edges.push_back(
94 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
92 } 95 }
93 96
94 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 97 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
95
96 graph_.edges.push_back(
97 TaskGraph::Edge(task, new_raster_finished_task.get()));
98 } 98 }
99 99
100 InsertNodeForTask(&graph_, 100 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
101 new_raster_required_for_activation_finished_task.get(), 101 InsertNodeForTask(&graph_,
102 kRasterRequiredForActivationFinishedTaskPriority, 102 new_raster_finished_tasks[task_set].get(),
103 required_for_activation_count); 103 kRasterFinishedTaskPriority,
104 InsertNodeForTask(&graph_, 104 task_count[task_set]);
105 new_raster_finished_task.get(), 105 }
106 kRasterFinishedTaskPriority,
107 queue->items.size());
108 106
109 ScheduleTasksOnOriginThread(this, &graph_); 107 ScheduleTasksOnOriginThread(this, &graph_);
110 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 108 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
111 109
112 raster_finished_task_ = new_raster_finished_task; 110 std::copy(new_raster_finished_tasks,
113 raster_required_for_activation_finished_task_ = 111 new_raster_finished_tasks + kNumberOfTaskSets,
114 new_raster_required_for_activation_finished_task; 112 raster_finished_tasks_);
115 113
116 TRACE_EVENT_ASYNC_STEP_INTO1( 114 TRACE_EVENT_ASYNC_STEP_INTO1(
117 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue()); 115 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
118 } 116 }
119 117
120 void ImageRasterWorkerPool::CheckForCompletedTasks() { 118 void ImageRasterWorkerPool::CheckForCompletedTasks() {
121 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks"); 119 TRACE_EVENT0("cc", "ImageRasterWorkerPool::CheckForCompletedTasks");
122 120
123 task_graph_runner_->CollectCompletedTasks(namespace_token_, 121 task_graph_runner_->CollectCompletedTasks(namespace_token_,
124 &completed_tasks_); 122 &completed_tasks_);
(...skipping 17 matching lines...) Expand all
142 140
143 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { 141 void ImageRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) {
144 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id()); 142 resource_provider_->ReleaseImageRasterBuffer(task->resource()->id());
145 143
146 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used 144 // Acquire/ReleaseImageRasterBuffer provides direct access to the memory used
147 // by the GPU. Read lock fences are required to ensure that we're not trying 145 // by the GPU. Read lock fences are required to ensure that we're not trying
148 // to map a resource that is currently in-use by the GPU. 146 // to map a resource that is currently in-use by the GPU.
149 resource_provider_->EnableReadLockFences(task->resource()->id()); 147 resource_provider_->EnableReadLockFences(task->resource()->id());
150 } 148 }
151 149
152 void ImageRasterWorkerPool::OnRasterFinished() { 150 void ImageRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
153 TRACE_EVENT0("cc", "ImageRasterWorkerPool::OnRasterFinished"); 151 TRACE_EVENT1(
152 "cc", "ImageRasterWorkerPool::OnRasterFinished", "task_set", task_set);
154 153
155 DCHECK(raster_tasks_pending_); 154 DCHECK(raster_pending_[task_set]);
156 raster_tasks_pending_ = false; 155 raster_pending_[task_set] = false;
157 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 156 if (raster_pending_.any()) {
158 client_->DidFinishRunningTasks(); 157 TRACE_EVENT_ASYNC_STEP_INTO1(
159 } 158 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
160 159 } else {
161 void ImageRasterWorkerPool::OnRasterRequiredForActivationFinished() { 160 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
162 TRACE_EVENT0("cc", 161 }
163 "ImageRasterWorkerPool::OnRasterRequiredForActivationFinished"); 162 client_->DidFinishRunningTasks(task_set);
164
165 DCHECK(raster_tasks_required_for_activation_pending_);
166 raster_tasks_required_for_activation_pending_ = false;
167 TRACE_EVENT_ASYNC_STEP_INTO1(
168 "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
169 client_->DidFinishRunningTasksRequiredForActivation();
170 } 163 }
171 164
172 scoped_refptr<base::debug::ConvertableToTraceFormat> 165 scoped_refptr<base::debug::ConvertableToTraceFormat>
173 ImageRasterWorkerPool::StateAsValue() const { 166 ImageRasterWorkerPool::StateAsValue() const {
174 scoped_refptr<base::debug::TracedValue> state = 167 scoped_refptr<base::debug::TracedValue> state =
175 new base::debug::TracedValue(); 168 new base::debug::TracedValue();
176 169
177 state->SetBoolean("tasks_required_for_activation_pending", 170 state->BeginArray("tasks_pending");
178 raster_tasks_required_for_activation_pending_); 171 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
172 state->AppendBoolean(raster_pending_[task_set]);
173 state->EndArray();
179 return state; 174 return state;
180 } 175 }
181 176
182 } // namespace cc 177 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698