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

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

Issue 807233002: cc: GPU rasterize tiles synchronously in PrepareToDraw. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missed 2 lines when splitting this from patch 743023002. 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
« no previous file with comments | « cc/resources/gpu_tile_task_worker_pool.h ('k') | cc/resources/rasterizer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_tile_task_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"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 bool use_distance_field_text_; 69 bool use_distance_field_text_;
70 70
71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); 71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
72 }; 72 };
73 73
74 } // namespace 74 } // namespace
75 75
76 // static 76 // static
77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( 77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create(
78 base::SequencedTaskRunner* task_runner, 78 base::SequencedTaskRunner* task_runner,
79 TaskGraphRunner* task_graph_runner,
79 ContextProvider* context_provider, 80 ContextProvider* context_provider,
80 ResourceProvider* resource_provider, 81 ResourceProvider* resource_provider,
81 bool use_distance_field_text) { 82 bool use_distance_field_text) {
82 return make_scoped_ptr<TileTaskWorkerPool>( 83 return make_scoped_ptr<TileTaskWorkerPool>(new GpuTileTaskWorkerPool(
83 new GpuTileTaskWorkerPool(task_runner, context_provider, 84 task_runner, task_graph_runner, context_provider, resource_provider,
84 resource_provider, use_distance_field_text)); 85 use_distance_field_text));
85 } 86 }
86 87
87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( 88 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool(
88 base::SequencedTaskRunner* task_runner, 89 base::SequencedTaskRunner* task_runner,
90 TaskGraphRunner* task_graph_runner,
89 ContextProvider* context_provider, 91 ContextProvider* context_provider,
90 ResourceProvider* resource_provider, 92 ResourceProvider* resource_provider,
91 bool use_distance_field_text) 93 bool use_distance_field_text)
92 : task_runner_(task_runner), 94 : task_runner_(task_runner),
93 task_graph_runner_(new TaskGraphRunner), 95 task_graph_runner_(task_graph_runner),
94 namespace_token_(task_graph_runner_->GetNamespaceToken()), 96 namespace_token_(task_graph_runner_->GetNamespaceToken()),
95 context_provider_(context_provider), 97 context_provider_(context_provider),
96 resource_provider_(resource_provider), 98 resource_provider_(resource_provider),
97 run_tasks_on_origin_thread_pending_(false), 99 run_tasks_on_origin_thread_pending_(false),
98 use_distance_field_text_(use_distance_field_text), 100 use_distance_field_text_(use_distance_field_text),
99 task_set_finished_weak_ptr_factory_(this), 101 task_set_finished_weak_ptr_factory_(this),
100 weak_ptr_factory_(this) { 102 weak_ptr_factory_(this) {
101 DCHECK(context_provider_); 103 DCHECK(context_provider_);
102 } 104 }
103 105
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 167 }
166 168
167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { 169 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), 170 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
169 kTaskSetFinishedTaskPriority, task_count[task_set]); 171 kTaskSetFinishedTaskPriority, task_count[task_set]);
170 } 172 }
171 173
172 ScheduleTasksOnOriginThread(this, &graph_); 174 ScheduleTasksOnOriginThread(this, &graph_);
173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); 175 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
174 176
175 ScheduleRunTasksOnOriginThread();
176
177 std::copy(new_task_set_finished_tasks, 177 std::copy(new_task_set_finished_tasks,
178 new_task_set_finished_tasks + kNumberOfTaskSets, 178 new_task_set_finished_tasks + kNumberOfTaskSets,
179 task_set_finished_tasks_); 179 task_set_finished_tasks_);
180 } 180 }
181 181
182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { 182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() {
183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); 183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks");
184 184
185 task_graph_runner_->CollectCompletedTasks(namespace_token_, 185 task_graph_runner_->CollectCompletedTasks(namespace_token_,
186 &completed_tasks_); 186 &completed_tasks_);
187 for (Task::Vector::const_iterator it = completed_tasks_.begin(); 187 CompleteTasks(completed_tasks_);
188 it != completed_tasks_.end(); ++it) { 188 completed_tasks_.clear();
189 TileTask* task = static_cast<TileTask*>(it->get()); 189 }
190 190
191 task->WillComplete(); 191 void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) {
192 task->CompleteOnOriginThread(this); 192 for (auto& task : tasks) {
193 task->DidComplete(); 193 RasterTask* raster_task = static_cast<RasterTask*>(task.get());
194 194
195 task->RunReplyOnOriginThread(); 195 raster_task->WillComplete();
196 raster_task->CompleteOnOriginThread(this);
197 raster_task->DidComplete();
198
199 raster_task->RunReplyOnOriginThread();
196 } 200 }
197 completed_tasks_.clear(); 201 completed_tasks_.clear();
198 } 202 }
199 203
200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( 204 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster(
201 const Resource* resource) { 205 const Resource* resource) {
202 return make_scoped_ptr<RasterBuffer>( 206 return make_scoped_ptr<RasterBuffer>(
203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_, 207 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_,
204 use_distance_field_text_)); 208 use_distance_field_text_));
205 } 209 }
206 210
207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( 211 void GpuTileTaskWorkerPool::ReleaseBufferForRaster(
208 scoped_ptr<RasterBuffer> buffer) { 212 scoped_ptr<RasterBuffer> buffer) {
209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. 213 // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
210 } 214 }
211 215
212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { 216 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", 217 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set",
214 task_set); 218 task_set);
215 219
216 DCHECK(tasks_pending_[task_set]); 220 DCHECK(tasks_pending_[task_set]);
217 tasks_pending_[task_set] = false; 221 tasks_pending_[task_set] = false;
222
218 client_->DidFinishRunningTileTasks(task_set); 223 client_->DidFinishRunningTileTasks(task_set);
219 } 224 }
220 225
221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() {
222 if (run_tasks_on_origin_thread_pending_)
223 return;
224
225 task_runner_->PostTask(
226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread,
227 weak_ptr_factory_.GetWeakPtr()));
228 run_tasks_on_origin_thread_pending_ = true;
229 }
230
231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() {
232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread");
233
234 DCHECK(run_tasks_on_origin_thread_pending_);
235 run_tasks_on_origin_thread_pending_ = false;
236
237 ScopedGpuRaster gpu_raster(context_provider_);
238 task_graph_runner_->RunUntilIdle();
239
240 // Draw each all of the pictures that were collected. This will also clear
241 // the pictures and canvases added to |multi_picture_draw_|
242 multi_picture_draw_.draw();
243 }
244
245 } // namespace cc 226 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/gpu_tile_task_worker_pool.h ('k') | cc/resources/rasterizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698