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/gpu_tile_task_worker_pool.cc

Issue 786583002: cc: Renaming Rasterizer and RasterWorkerPool interfaces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix test. Update include files alphabetic orders. Created 6 years 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/gpu_raster_worker_pool.h" 5 #include "cc/resources/gpu_tile_task_worker_pool.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "cc/output/context_provider.h" 10 #include "cc/output/context_provider.h"
11 #include "cc/resources/raster_buffer.h" 11 #include "cc/resources/raster_buffer.h"
12 #include "cc/resources/raster_source.h" 12 #include "cc/resources/raster_source.h"
13 #include "cc/resources/resource.h" 13 #include "cc/resources/resource.h"
14 #include "cc/resources/resource_provider.h" 14 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/scoped_gpu_raster.h" 15 #include "cc/resources/scoped_gpu_raster.h"
(...skipping 27 matching lines...) Expand all
43 raster_source->ShouldAttemptToUseDistanceFieldText(); 43 raster_source->ShouldAttemptToUseDistanceFieldText();
44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text, 44 SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text,
45 raster_source->CanUseLCDText()); 45 raster_source->CanUseLCDText());
46 46
47 if (!sk_surface) 47 if (!sk_surface)
48 return; 48 return;
49 49
50 SkPictureRecorder recorder; 50 SkPictureRecorder recorder;
51 gfx::Size size = resource_->size(); 51 gfx::Size size = resource_->size();
52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag; 52 const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag;
53 skia::RefPtr<SkCanvas> canvas = 53 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(
54 skia::SharePtr(recorder.beginRecording(size.width(), size.height(), 54 recorder.beginRecording(size.width(), size.height(), NULL, flags));
55 NULL, flags));
56
57 55
58 canvas->save(); 56 canvas->save();
59 raster_source->PlaybackToCanvas(canvas.get(), rect, scale); 57 raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
60 canvas->restore(); 58 canvas->restore();
61 59
62 // Add the canvas and recorded picture to |multi_picture_draw_|. 60 // Add the canvas and recorded picture to |multi_picture_draw_|.
63 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording()); 61 skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording());
64 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get()); 62 multi_picture_draw_->add(sk_surface->getCanvas(), picture.get());
65 } 63 }
66 64
67 private: 65 private:
68 ResourceProvider::ScopedWriteLockGr lock_; 66 ResourceProvider::ScopedWriteLockGr lock_;
69 const Resource* resource_; 67 const Resource* resource_;
70 SkMultiPictureDraw* multi_picture_draw_; 68 SkMultiPictureDraw* multi_picture_draw_;
71 bool use_distance_field_text_; 69 bool use_distance_field_text_;
72 70
73 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); 71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
74 }; 72 };
75 73
76 } // namespace 74 } // namespace
77 75
78 // static 76 // static
79 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( 77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create(
80 base::SequencedTaskRunner* task_runner, 78 base::SequencedTaskRunner* task_runner,
81 ContextProvider* context_provider, 79 ContextProvider* context_provider,
82 ResourceProvider* resource_provider, 80 ResourceProvider* resource_provider,
83 bool use_distance_field_text) { 81 bool use_distance_field_text) {
84 return make_scoped_ptr<RasterWorkerPool>( 82 return make_scoped_ptr<TileTaskWorkerPool>(
85 new GpuRasterWorkerPool(task_runner, 83 new GpuTileTaskWorkerPool(task_runner, context_provider,
86 context_provider, 84 resource_provider, use_distance_field_text));
87 resource_provider,
88 use_distance_field_text));
89 } 85 }
90 86
91 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, 87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool(
92 ContextProvider* context_provider, 88 base::SequencedTaskRunner* task_runner,
93 ResourceProvider* resource_provider, 89 ContextProvider* context_provider,
94 bool use_distance_field_text) 90 ResourceProvider* resource_provider,
91 bool use_distance_field_text)
95 : task_runner_(task_runner), 92 : task_runner_(task_runner),
96 task_graph_runner_(new TaskGraphRunner), 93 task_graph_runner_(new TaskGraphRunner),
97 namespace_token_(task_graph_runner_->GetNamespaceToken()), 94 namespace_token_(task_graph_runner_->GetNamespaceToken()),
98 context_provider_(context_provider), 95 context_provider_(context_provider),
99 resource_provider_(resource_provider), 96 resource_provider_(resource_provider),
100 run_tasks_on_origin_thread_pending_(false), 97 run_tasks_on_origin_thread_pending_(false),
101 use_distance_field_text_(use_distance_field_text), 98 use_distance_field_text_(use_distance_field_text),
102 raster_finished_weak_ptr_factory_(this), 99 task_set_finished_weak_ptr_factory_(this),
103 weak_ptr_factory_(this) { 100 weak_ptr_factory_(this) {
104 DCHECK(context_provider_); 101 DCHECK(context_provider_);
105 } 102 }
106 103
107 GpuRasterWorkerPool::~GpuRasterWorkerPool() { 104 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() {
108 DCHECK_EQ(0u, completed_tasks_.size()); 105 DCHECK_EQ(0u, completed_tasks_.size());
109 } 106 }
110 107
111 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { 108 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() {
112 return this; 109 return this;
113 } 110 }
114 111
115 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { 112 void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
116 client_ = client; 113 client_ = client;
117 } 114 }
118 115
119 void GpuRasterWorkerPool::Shutdown() { 116 void GpuTileTaskWorkerPool::Shutdown() {
120 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); 117 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown");
121 118
122 TaskGraph empty; 119 TaskGraph empty;
123 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); 120 task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
124 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); 121 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
125 } 122 }
126 123
127 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 124 void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
128 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); 125 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks");
129 126
130 // Mark all task sets as pending. 127 // Mark all task sets as pending.
131 raster_pending_.set(); 128 tasks_pending_.set();
132 129
133 unsigned priority = kRasterTaskPriorityBase; 130 unsigned priority = kTileTaskPriorityBase;
134 131
135 graph_.Reset(); 132 graph_.Reset();
136 133
137 // Cancel existing OnRasterFinished callbacks. 134 // Cancel existing OnTaskSetFinished callbacks.
138 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 135 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
139 136
140 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; 137 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
141 138
142 size_t task_count[kNumberOfTaskSets] = {0}; 139 size_t task_count[kNumberOfTaskSets] = {0};
143 140
144 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { 141 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
145 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( 142 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
146 task_runner_.get(), 143 task_runner_.get(),
147 base::Bind(&GpuRasterWorkerPool::OnRasterFinished, 144 base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished,
148 raster_finished_weak_ptr_factory_.GetWeakPtr(), 145 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
149 task_set));
150 } 146 }
151 147
152 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); 148 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
153 it != queue->items.end(); 149 it != queue->items.end(); ++it) {
154 ++it) { 150 const TileTaskQueue::Item& item = *it;
155 const RasterTaskQueue::Item& item = *it;
156 RasterTask* task = item.task; 151 RasterTask* task = item.task;
157 DCHECK(!task->HasCompleted()); 152 DCHECK(!task->HasCompleted());
158 153
159 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { 154 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
160 if (!item.task_sets[task_set]) 155 if (!item.task_sets[task_set])
161 continue; 156 continue;
162 157
163 ++task_count[task_set]; 158 ++task_count[task_set];
164 159
165 graph_.edges.push_back( 160 graph_.edges.push_back(
166 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get())); 161 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
167 } 162 }
168 163
169 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 164 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
170 } 165 }
171 166
172 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { 167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
173 InsertNodeForTask(&graph_, 168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
174 new_raster_finished_tasks[task_set].get(), 169 kTaskSetFinishedTaskPriority, task_count[task_set]);
175 kRasterFinishedTaskPriority,
176 task_count[task_set]);
177 } 170 }
178 171
179 ScheduleTasksOnOriginThread(this, &graph_); 172 ScheduleTasksOnOriginThread(this, &graph_);
180 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
181 174
182 ScheduleRunTasksOnOriginThread(); 175 ScheduleRunTasksOnOriginThread();
183 176
184 std::copy(new_raster_finished_tasks, 177 std::copy(new_task_set_finished_tasks,
185 new_raster_finished_tasks + kNumberOfTaskSets, 178 new_task_set_finished_tasks + kNumberOfTaskSets,
186 raster_finished_tasks_); 179 task_set_finished_tasks_);
187 } 180 }
188 181
189 void GpuRasterWorkerPool::CheckForCompletedTasks() { 182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() {
190 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); 183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks");
191 184
192 task_graph_runner_->CollectCompletedTasks(namespace_token_, 185 task_graph_runner_->CollectCompletedTasks(namespace_token_,
193 &completed_tasks_); 186 &completed_tasks_);
194 for (Task::Vector::const_iterator it = completed_tasks_.begin(); 187 for (Task::Vector::const_iterator it = completed_tasks_.begin();
195 it != completed_tasks_.end(); 188 it != completed_tasks_.end(); ++it) {
196 ++it) { 189 TileTask* task = static_cast<TileTask*>(it->get());
197 RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
198 190
199 task->WillComplete(); 191 task->WillComplete();
200 task->CompleteOnOriginThread(this); 192 task->CompleteOnOriginThread(this);
201 task->DidComplete(); 193 task->DidComplete();
202 194
203 task->RunReplyOnOriginThread(); 195 task->RunReplyOnOriginThread();
204 } 196 }
205 completed_tasks_.clear(); 197 completed_tasks_.clear();
206 } 198 }
207 199
208 scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( 200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster(
209 const Resource* resource) { 201 const Resource* resource) {
210 return make_scoped_ptr<RasterBuffer>( 202 return make_scoped_ptr<RasterBuffer>(
211 new RasterBufferImpl(resource_provider_, 203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_,
212 resource,
213 &multi_picture_draw_,
214 use_distance_field_text_)); 204 use_distance_field_text_));
215 } 205 }
216 206
217 void GpuRasterWorkerPool::ReleaseBufferForRaster( 207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster(
218 scoped_ptr<RasterBuffer> buffer) { 208 scoped_ptr<RasterBuffer> buffer) {
219 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. 209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
220 } 210 }
221 211
222 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { 212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
223 TRACE_EVENT1( 213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set",
224 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); 214 task_set);
225 215
226 DCHECK(raster_pending_[task_set]); 216 DCHECK(tasks_pending_[task_set]);
227 raster_pending_[task_set] = false; 217 tasks_pending_[task_set] = false;
228 client_->DidFinishRunningTasks(task_set); 218 client_->DidFinishRunningTileTasks(task_set);
229 } 219 }
230 220
231 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { 221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() {
232 if (run_tasks_on_origin_thread_pending_) 222 if (run_tasks_on_origin_thread_pending_)
233 return; 223 return;
234 224
235 task_runner_->PostTask( 225 task_runner_->PostTask(
236 FROM_HERE, 226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread,
237 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, 227 weak_ptr_factory_.GetWeakPtr()));
238 weak_ptr_factory_.GetWeakPtr()));
239 run_tasks_on_origin_thread_pending_ = true; 228 run_tasks_on_origin_thread_pending_ = true;
240 } 229 }
241 230
242 void GpuRasterWorkerPool::RunTasksOnOriginThread() { 231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() {
243 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); 232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread");
244 233
245 DCHECK(run_tasks_on_origin_thread_pending_); 234 DCHECK(run_tasks_on_origin_thread_pending_);
246 run_tasks_on_origin_thread_pending_ = false; 235 run_tasks_on_origin_thread_pending_ = false;
247 236
248 ScopedGpuRaster gpu_raster(context_provider_); 237 ScopedGpuRaster gpu_raster(context_provider_);
249 task_graph_runner_->RunUntilIdle(); 238 task_graph_runner_->RunUntilIdle();
250 239
251 // Draw each all of the pictures that were collected. This will also clear 240 // Draw each all of the pictures that were collected. This will also clear
252 // the pictures and canvases added to |multi_picture_draw_| 241 // the pictures and canvases added to |multi_picture_draw_|
253 multi_picture_draw_.draw(); 242 multi_picture_draw_.draw();
254 } 243 }
255 244
256 } // namespace cc 245 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698