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

Side by Side Diff: cc/resources/image_raster_worker_pool.cc

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
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/values.h" 8 #include "base/values.h"
9 #include "cc/debug/traced_value.h" 9 #include "cc/debug/traced_value.h"
10 #include "cc/resources/resource.h" 10 #include "cc/resources/resource.h"
11 #include "third_party/skia/include/core/SkBitmapDevice.h" 11 #include "third_party/skia/include/core/SkBitmapDevice.h"
12 12
13 namespace cc { 13 namespace cc {
14 14
15 // static 15 // static
16 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create( 16 scoped_ptr<RasterWorkerPool> ImageRasterWorkerPool::Create(
17 ResourceProvider* resource_provider, 17 ResourceProvider* resource_provider,
18 ContextProvider* context_provider,
19 unsigned texture_target) { 18 unsigned texture_target) {
20 return make_scoped_ptr<RasterWorkerPool>( 19 return make_scoped_ptr<RasterWorkerPool>(
21 new ImageRasterWorkerPool(GetTaskGraphRunner(), 20 new ImageRasterWorkerPool(GetTaskGraphRunner(),
22 resource_provider, 21 resource_provider,
23 context_provider,
24 texture_target)); 22 texture_target));
25 } 23 }
26 24
27 ImageRasterWorkerPool::ImageRasterWorkerPool( 25 ImageRasterWorkerPool::ImageRasterWorkerPool(
28 internal::TaskGraphRunner* task_graph_runner, 26 internal::TaskGraphRunner* task_graph_runner,
29 ResourceProvider* resource_provider, 27 ResourceProvider* resource_provider,
30 ContextProvider* context_provider,
31 unsigned texture_target) 28 unsigned texture_target)
32 : RasterWorkerPool(task_graph_runner, resource_provider, context_provider), 29 : RasterWorkerPool(task_graph_runner, resource_provider),
33 texture_target_(texture_target), 30 texture_target_(texture_target),
34 raster_tasks_pending_(false), 31 raster_tasks_pending_(false),
35 raster_tasks_required_for_activation_pending_(false) {} 32 raster_tasks_required_for_activation_pending_(false) {}
36 33
37 ImageRasterWorkerPool::~ImageRasterWorkerPool() {} 34 ImageRasterWorkerPool::~ImageRasterWorkerPool() {}
38 35
39 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { 36 void ImageRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
40 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks"); 37 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
41 38
39 DCHECK_EQ(queue->required_for_activation_count,
40 static_cast<size_t>(
41 std::count_if(queue->tasks.begin(),
42 queue->tasks.end(),
43 RasterTaskQueue::Task::IsRequiredForActivation)));
44
42 if (!raster_tasks_pending_) 45 if (!raster_tasks_pending_)
43 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 46 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
44 47
45 raster_tasks_pending_ = true; 48 raster_tasks_pending_ = true;
46 raster_tasks_required_for_activation_pending_ = true; 49 raster_tasks_required_for_activation_pending_ = true;
47 50
48 unsigned priority = kRasterTaskPriorityBase; 51 unsigned priority = kRasterTaskPriorityBase;
49 52
50 graph_.Reset(); 53 graph_.Reset();
51 54
52 scoped_refptr<internal::WorkerPoolTask> 55 scoped_refptr<internal::WorkerPoolTask>
53 new_raster_required_for_activation_finished_task( 56 new_raster_required_for_activation_finished_task(
54 CreateRasterRequiredForActivationFinishedTask( 57 CreateRasterRequiredForActivationFinishedTask(
55 queue->required_for_activation_count())); 58 queue->required_for_activation_count));
56 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( 59 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task(
57 CreateRasterFinishedTask()); 60 CreateRasterFinishedTask());
58 61
59 size_t raster_required_for_activation_finished_dependency_count = 0u;
alokp 2014/02/14 18:50:59 Are these changes necessary in this patch?
reveman 2014/02/14 23:30:52 No but I think they should be included as the only
60 size_t raster_finished_dependency_count = 0u;
61
62 RasterTaskVector gpu_raster_tasks;
63 for (RasterTaskQueueIterator it(queue); it; ++it) { 62 for (RasterTaskQueueIterator it(queue); it; ++it) {
64 internal::RasterWorkerPoolTask* task = *it; 63 internal::RasterWorkerPoolTask* task = *it;
65 DCHECK(!task->HasCompleted()); 64 DCHECK(!task->HasCompleted());
66 65
67 if (task->use_gpu_rasterization()) {
68 gpu_raster_tasks.push_back(task);
69 continue;
70 }
71
72 if (it.required_for_activation()) { 66 if (it.required_for_activation()) {
73 ++raster_required_for_activation_finished_dependency_count;
74 graph_.edges.push_back(internal::TaskGraph::Edge( 67 graph_.edges.push_back(internal::TaskGraph::Edge(
75 task, new_raster_required_for_activation_finished_task.get())); 68 task, new_raster_required_for_activation_finished_task.get()));
76 } 69 }
77 70
78 InsertNodeForRasterTask(&graph_, task, task->dependencies(), priority++); 71 InsertNodeForRasterTask(&graph_, task, task->dependencies(), priority++);
79 72
80 ++raster_finished_dependency_count;
81 graph_.edges.push_back( 73 graph_.edges.push_back(
82 internal::TaskGraph::Edge(task, new_raster_finished_task.get())); 74 internal::TaskGraph::Edge(task, new_raster_finished_task.get()));
83 } 75 }
84 76
85 InsertNodeForTask(&graph_, 77 InsertNodeForTask(&graph_,
86 new_raster_required_for_activation_finished_task.get(), 78 new_raster_required_for_activation_finished_task.get(),
87 kRasterRequiredForActivationFinishedTaskPriority, 79 kRasterRequiredForActivationFinishedTaskPriority,
88 raster_required_for_activation_finished_dependency_count); 80 queue->required_for_activation_count);
89 InsertNodeForTask(&graph_, 81 InsertNodeForTask(&graph_,
90 new_raster_finished_task.get(), 82 new_raster_finished_task.get(),
91 kRasterFinishedTaskPriority, 83 kRasterFinishedTaskPriority,
92 raster_finished_dependency_count); 84 queue->tasks.size());
93 85
94 raster_tasks_.Swap(queue); 86 raster_tasks_.Swap(queue);
95 87
96 SetTaskGraph(&graph_); 88 SetTaskGraph(&graph_);
97 89
98 set_raster_finished_task(new_raster_finished_task); 90 set_raster_finished_task(new_raster_finished_task);
99 set_raster_required_for_activation_finished_task( 91 set_raster_required_for_activation_finished_task(
100 new_raster_required_for_activation_finished_task); 92 new_raster_required_for_activation_finished_task);
101 93
102 if (!gpu_raster_tasks.empty())
103 RunGpuRasterTasks(gpu_raster_tasks);
104
105 TRACE_EVENT_ASYNC_STEP_INTO1( 94 TRACE_EVENT_ASYNC_STEP_INTO1(
106 "cc", 95 "cc",
107 "ScheduledTasks", 96 "ScheduledTasks",
108 this, 97 this,
109 "rasterizing", 98 "rasterizing",
110 "state", 99 "state",
111 TracedValue::FromValue(StateAsValue().release())); 100 TracedValue::FromValue(StateAsValue().release()));
112 } 101 }
113 102
114 unsigned ImageRasterWorkerPool::GetResourceTarget() const { 103 unsigned ImageRasterWorkerPool::GetResourceTarget() const {
(...skipping 14 matching lines...) Expand all
129 internal::WorkerPoolTask* task = 118 internal::WorkerPoolTask* task =
130 static_cast<internal::WorkerPoolTask*>(it->get()); 119 static_cast<internal::WorkerPoolTask*>(it->get());
131 120
132 task->WillComplete(); 121 task->WillComplete();
133 task->CompleteOnOriginThread(this); 122 task->CompleteOnOriginThread(this);
134 task->DidComplete(); 123 task->DidComplete();
135 124
136 task->RunReplyOnOriginThread(); 125 task->RunReplyOnOriginThread();
137 } 126 }
138 completed_tasks_.clear(); 127 completed_tasks_.clear();
139
140 CheckForCompletedGpuRasterTasks();
141 } 128 }
142 129
143 SkCanvas* ImageRasterWorkerPool::AcquireCanvasForRaster( 130 SkCanvas* ImageRasterWorkerPool::AcquireCanvasForRaster(
144 internal::RasterWorkerPoolTask* task) { 131 internal::RasterWorkerPoolTask* task) {
145 if (task->use_gpu_rasterization())
146 return resource_provider()->MapDirectRasterBuffer(task->resource()->id());
147
148 return resource_provider()->MapImageRasterBuffer(task->resource()->id()); 132 return resource_provider()->MapImageRasterBuffer(task->resource()->id());
149 } 133 }
150 134
151 void ImageRasterWorkerPool::OnRasterCompleted( 135 void ImageRasterWorkerPool::OnRasterCompleted(
152 internal::RasterWorkerPoolTask* task, 136 internal::RasterWorkerPoolTask* task,
153 const PicturePileImpl::Analysis& analysis) { 137 const PicturePileImpl::Analysis& analysis) {
154 if (task->use_gpu_rasterization()) {
155 resource_provider()->UnmapDirectRasterBuffer(task->resource()->id());
156 return;
157 }
158 resource_provider()->UnmapImageRasterBuffer(task->resource()->id()); 138 resource_provider()->UnmapImageRasterBuffer(task->resource()->id());
159 } 139 }
160 140
161 void ImageRasterWorkerPool::OnImageDecodeCompleted(
162 internal::WorkerPoolTask* task) {}
163
164 void ImageRasterWorkerPool::OnRasterTasksFinished() { 141 void ImageRasterWorkerPool::OnRasterTasksFinished() {
165 DCHECK(raster_tasks_pending_); 142 DCHECK(raster_tasks_pending_);
166 raster_tasks_pending_ = false; 143 raster_tasks_pending_ = false;
167 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 144 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
168 client()->DidFinishRunningTasks(); 145 client()->DidFinishRunningTasks();
169 } 146 }
170 147
171 void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { 148 void ImageRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
172 DCHECK(raster_tasks_required_for_activation_pending_); 149 DCHECK(raster_tasks_required_for_activation_pending_);
173 raster_tasks_required_for_activation_pending_ = false; 150 raster_tasks_required_for_activation_pending_ = false;
174 TRACE_EVENT_ASYNC_STEP_INTO1( 151 TRACE_EVENT_ASYNC_STEP_INTO1(
175 "cc", 152 "cc",
176 "ScheduledTasks", 153 "ScheduledTasks",
177 this, 154 this,
178 "rasterizing", 155 "rasterizing",
179 "state", 156 "state",
180 TracedValue::FromValue(StateAsValue().release())); 157 TracedValue::FromValue(StateAsValue().release()));
181 client()->DidFinishRunningTasksRequiredForActivation(); 158 client()->DidFinishRunningTasksRequiredForActivation();
182 } 159 }
183 160
184 scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const { 161 scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const {
185 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); 162 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
186 163
187 state->SetBoolean("tasks_required_for_activation_pending", 164 state->SetBoolean("tasks_required_for_activation_pending",
188 raster_tasks_required_for_activation_pending_); 165 raster_tasks_required_for_activation_pending_);
189 return state.PassAs<base::Value>(); 166 return state.PassAs<base::Value>();
190 } 167 }
191 168
192 } // namespace cc 169 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698