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

Side by Side Diff: cc/tiles/tile_manager.cc

Issue 1470113002: Move TaskGraph creation to TileManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pinchfix
Patch Set: remove unnecessary include Created 5 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/tiles/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 uint64_t resource_content_id_; 146 uint64_t resource_content_id_;
147 int source_frame_number_; 147 int source_frame_number_;
148 bool analyze_picture_; 148 bool analyze_picture_;
149 const base::Callback<void(const DisplayListRasterSource::SolidColorAnalysis&, 149 const base::Callback<void(const DisplayListRasterSource::SolidColorAnalysis&,
150 bool)> reply_; 150 bool)> reply_;
151 scoped_ptr<RasterBuffer> raster_buffer_; 151 scoped_ptr<RasterBuffer> raster_buffer_;
152 152
153 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); 153 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
154 }; 154 };
155 155
156 const char* TaskSetName(TaskSet task_set) { 156 // Task priorities that make sure that the task set done tasks run before any
157 switch (task_set) { 157 // other remaining tasks.
158 case TileManager::ALL: 158 const size_t kRequiredForActivationDoneTaskPriority = 1u;
159 return "ALL"; 159 const size_t kRequiredForDrawDoneTaskPriority = 2u;
160 case TileManager::REQUIRED_FOR_ACTIVATION: 160 const size_t kAllDoneTaskPriority = 3u;
161 return "REQUIRED_FOR_ACTIVATION"; 161
162 case TileManager::REQUIRED_FOR_DRAW: 162 // For correctness, |kTileTaskPriorityBase| must be greater than
163 return "REQUIRED_FOR_DRAW"; 163 // all task set done task priorities.
164 size_t kTileTaskPriorityBase = 10u;
165
166 void InsertNodeForTask(TaskGraph* graph,
167 TileTask* task,
168 size_t priority,
169 size_t dependencies) {
170 DCHECK(std::find_if(graph->nodes.begin(), graph->nodes.end(),
171 [task](const TaskGraph::Node& node) {
172 return node.task == task;
173 }) == graph->nodes.end());
174 graph->nodes.push_back(TaskGraph::Node(task, priority, dependencies));
175 }
176
177 void InsertNodesForRasterTask(TaskGraph* graph,
178 RasterTask* raster_task,
179 const ImageDecodeTask::Vector& decode_tasks,
180 size_t priority) {
181 size_t dependencies = 0u;
182
183 // Insert image decode tasks.
184 for (ImageDecodeTask::Vector::const_iterator it = decode_tasks.begin();
185 it != decode_tasks.end(); ++it) {
186 ImageDecodeTask* decode_task = it->get();
187
188 // Skip if already decoded.
189 if (decode_task->HasCompleted())
190 continue;
191
192 dependencies++;
193
194 // Add decode task if it doesn't already exists in graph.
195 TaskGraph::Node::Vector::iterator decode_it =
196 std::find_if(graph->nodes.begin(), graph->nodes.end(),
197 [decode_task](const TaskGraph::Node& node) {
198 return node.task == decode_task;
199 });
200 if (decode_it == graph->nodes.end())
201 InsertNodeForTask(graph, decode_task, priority, 0u);
202
203 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
164 } 204 }
165 205
166 NOTREACHED(); 206 InsertNodeForTask(graph, raster_task, priority, dependencies);
167 return "Invalid TaskSet";
168 } 207 }
169 208
209 class TaskSetFinishedTaskImpl : public TileTask {
210 public:
211 explicit TaskSetFinishedTaskImpl(
212 base::SequencedTaskRunner* task_runner,
213 const base::Closure& on_task_set_finished_callback)
214 : task_runner_(task_runner),
215 on_task_set_finished_callback_(on_task_set_finished_callback) {}
216
217 // Overridden from Task:
218 void RunOnWorkerThread() override {
219 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread");
220 TaskSetFinished();
221 }
222
223 // Overridden from TileTask:
224 void ScheduleOnOriginThread(TileTaskClient* client) override {}
225 void CompleteOnOriginThread(TileTaskClient* client) override {}
226
227 protected:
228 ~TaskSetFinishedTaskImpl() override {}
229
230 void TaskSetFinished() {
231 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_);
232 }
233
234 private:
235 scoped_refptr<base::SequencedTaskRunner> task_runner_;
236 const base::Closure on_task_set_finished_callback_;
237
238 DISALLOW_COPY_AND_ASSIGN(TaskSetFinishedTaskImpl);
239 };
240
170 } // namespace 241 } // namespace
171 242
172 RasterTaskCompletionStats::RasterTaskCompletionStats() 243 RasterTaskCompletionStats::RasterTaskCompletionStats()
173 : completed_count(0u), canceled_count(0u) {} 244 : completed_count(0u), canceled_count(0u) {}
174 245
175 scoped_refptr<base::trace_event::ConvertableToTraceFormat> 246 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
176 RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats) { 247 RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats) {
177 scoped_refptr<base::trace_event::TracedValue> state = 248 scoped_refptr<base::trace_event::TracedValue> state =
178 new base::trace_event::TracedValue(); 249 new base::trace_event::TracedValue();
179 state->SetInteger("completed_count", 250 state->SetInteger("completed_count",
(...skipping 29 matching lines...) Expand all
209 did_oom_on_last_assign_(false), 280 did_oom_on_last_assign_(false),
210 more_tiles_need_prepare_check_notifier_( 281 more_tiles_need_prepare_check_notifier_(
211 task_runner_.get(), 282 task_runner_.get(),
212 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, 283 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
213 base::Unretained(this))), 284 base::Unretained(this))),
214 signals_check_notifier_(task_runner_.get(), 285 signals_check_notifier_(task_runner_.get(),
215 base::Bind(&TileManager::CheckAndIssueSignals, 286 base::Bind(&TileManager::CheckAndIssueSignals,
216 base::Unretained(this))), 287 base::Unretained(this))),
217 has_scheduled_tile_tasks_(false), 288 has_scheduled_tile_tasks_(false),
218 prepare_tiles_count_(0u), 289 prepare_tiles_count_(0u),
219 next_tile_id_(0u) {} 290 next_tile_id_(0u),
291 task_set_finished_weak_ptr_factory_(this) {}
220 292
221 TileManager::~TileManager() { 293 TileManager::~TileManager() {
222 FinishTasksAndCleanUp(); 294 FinishTasksAndCleanUp();
223 } 295 }
224 296
225 void TileManager::FinishTasksAndCleanUp() { 297 void TileManager::FinishTasksAndCleanUp() {
226 if (!tile_task_runner_) 298 if (!tile_task_runner_)
227 return; 299 return;
228 300
229 global_state_ = GlobalStateThatImpactsTilePriority(); 301 global_state_ = GlobalStateThatImpactsTilePriority();
230 302
231 TileTaskQueue empty; 303 // This cancels tasks if possible, finishes pending tasks, and release any
232 tile_task_runner_->ScheduleTasks(&empty); 304 // uninitialized resources.
233 orphan_raster_tasks_.clear(); 305 tile_task_runner_->Shutdown();
234 306
235 // This should finish all pending tasks and release any uninitialized 307 // Now that all tasks have been finished, we can clear any
236 // resources. 308 // |orphan_tasks_|.
237 tile_task_runner_->Shutdown(); 309 orphan_tasks_.clear();
310
238 tile_task_runner_->CheckForCompletedTasks(); 311 tile_task_runner_->CheckForCompletedTasks();
239 312
240 FreeResourcesForReleasedTiles(); 313 FreeResourcesForReleasedTiles();
241 CleanUpReleasedTiles(); 314 CleanUpReleasedTiles();
242 315
243 tile_task_runner_ = nullptr; 316 tile_task_runner_ = nullptr;
244 resource_pool_ = nullptr; 317 resource_pool_ = nullptr;
245 more_tiles_need_prepare_check_notifier_.Cancel(); 318 more_tiles_need_prepare_check_notifier_.Cancel();
246 signals_check_notifier_.Cancel(); 319 signals_check_notifier_.Cancel();
320 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
247 } 321 }
248 322
249 void TileManager::SetResources(ResourcePool* resource_pool, 323 void TileManager::SetResources(ResourcePool* resource_pool,
250 TileTaskRunner* tile_task_runner, 324 TileTaskRunner* tile_task_runner,
251 size_t scheduled_raster_task_limit) { 325 size_t scheduled_raster_task_limit) {
252 DCHECK(!tile_task_runner_); 326 DCHECK(!tile_task_runner_);
253 DCHECK(tile_task_runner); 327 DCHECK(tile_task_runner);
254 328
255 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 329 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
256 resource_pool_ = resource_pool; 330 resource_pool_ = resource_pool;
257 tile_task_runner_ = tile_task_runner; 331 tile_task_runner_ = tile_task_runner;
258 tile_task_runner_->SetClient(this);
259 } 332 }
260 333
261 void TileManager::Release(Tile* tile) { 334 void TileManager::Release(Tile* tile) {
262 released_tiles_.push_back(tile); 335 released_tiles_.push_back(tile);
263 } 336 }
264 337
265 void TileManager::FreeResourcesForReleasedTiles() { 338 void TileManager::FreeResourcesForReleasedTiles() {
266 for (auto* tile : released_tiles_) 339 for (auto* tile : released_tiles_)
267 FreeResourcesForTile(tile); 340 FreeResourcesForTile(tile);
268 } 341 }
269 342
270 void TileManager::CleanUpReleasedTiles() { 343 void TileManager::CleanUpReleasedTiles() {
271 std::vector<Tile*> tiles_to_retain; 344 std::vector<Tile*> tiles_to_retain;
272 for (auto* tile : released_tiles_) { 345 for (auto* tile : released_tiles_) {
273 if (tile->HasRasterTask()) { 346 if (tile->HasRasterTask()) {
274 tiles_to_retain.push_back(tile); 347 tiles_to_retain.push_back(tile);
275 continue; 348 continue;
276 } 349 }
277 350
278 DCHECK(!tile->draw_info().has_resource()); 351 DCHECK(!tile->draw_info().has_resource());
279 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 352 DCHECK(tiles_.find(tile->id()) != tiles_.end());
280 tiles_.erase(tile->id()); 353 tiles_.erase(tile->id());
281 354
282 image_decode_controller_.SubtractLayerUsedCount(tile->layer_id()); 355 image_decode_controller_.SubtractLayerUsedCount(tile->layer_id());
283 delete tile; 356 delete tile;
284 } 357 }
285 released_tiles_.swap(tiles_to_retain); 358 released_tiles_.swap(tiles_to_retain);
286 } 359 }
287 360
288 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) { 361 void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
289 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set", 362 TRACE_EVENT0("cc",
290 TaskSetName(task_set)); 363 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
364 signals_.ready_to_activate = true;
365 signals_check_notifier_.Schedule();
366
367 DidFinishRunningAnyTileTasks();
368 }
369
370 void TileManager::DidFinishRunningTileTasksRequiredForDraw() {
371 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTileTasksRequiredForDraw");
372 signals_.ready_to_draw = true;
373 signals_check_notifier_.Schedule();
374
375 DidFinishRunningAnyTileTasks();
376 }
377
378 void TileManager::DidFinishRunningAllTileTasks() {
379 TRACE_EVENT0("cc", "TileManager::DidFinishRunningAllTileTasks");
291 DCHECK(resource_pool_); 380 DCHECK(resource_pool_);
292 DCHECK(tile_task_runner_); 381 DCHECK(tile_task_runner_);
293 382
294 switch (task_set) { 383 has_scheduled_tile_tasks_ = false;
295 case ALL: {
296 has_scheduled_tile_tasks_ = false;
297 384
298 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() > 385 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() >
299 global_state_.soft_memory_limit_in_bytes; 386 global_state_.soft_memory_limit_in_bytes;
300 387
301 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 388 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
302 !memory_usage_above_limit) { 389 !memory_usage_above_limit) {
303 // TODO(ericrk): We should find a better way to safely handle re-entrant 390 // TODO(ericrk): We should find a better way to safely handle re-entrant
304 // notifications than always having to schedule a new task. 391 // notifications than always having to schedule a new task.
305 // http://crbug.com/498439 392 // http://crbug.com/498439
306 signals_.all_tile_tasks_completed = true; 393 signals_.all_tile_tasks_completed = true;
307 signals_check_notifier_.Schedule(); 394 signals_check_notifier_.Schedule();
308 return; 395 return;
309 }
310
311 more_tiles_need_prepare_check_notifier_.Schedule();
312 return;
313 }
314 case REQUIRED_FOR_ACTIVATION:
315 signals_.ready_to_activate = true;
316 signals_check_notifier_.Schedule();
317 return;
318
319 case REQUIRED_FOR_DRAW:
320 signals_.ready_to_draw = true;
321 signals_check_notifier_.Schedule();
322 return;
323 } 396 }
324 397
325 NOTREACHED(); 398 more_tiles_need_prepare_check_notifier_.Schedule();
399
400 DidFinishRunningAnyTileTasks();
401 }
402
403 void TileManager::DidFinishRunningAnyTileTasks() {
404 if (has_scheduled_tile_tasks_) {
405 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running",
406 "state", ScheduledTasksStateAsValue());
reveman 2015/12/02 22:26:05 can we call this directly in DidFinishRunningTileT
ericrk 2015/12/03 00:43:22 yup - that makes sense.
407 } else {
408 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
reveman 2015/12/02 22:26:05 and this directly in DidFinishRunningAllTileTasks
ericrk 2015/12/03 00:43:22 Done.
409 }
326 } 410 }
327 411
328 bool TileManager::PrepareTiles( 412 bool TileManager::PrepareTiles(
329 const GlobalStateThatImpactsTilePriority& state) { 413 const GlobalStateThatImpactsTilePriority& state) {
330 ++prepare_tiles_count_; 414 ++prepare_tiles_count_;
331 415
332 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", 416 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id",
333 prepare_tiles_count_); 417 prepare_tiles_count_);
334 418
335 if (!tile_task_runner_) { 419 if (!tile_task_runner_) {
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( 682 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
599 Tile* tile) { 683 Tile* tile) {
600 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); 684 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw();
601 FreeResourcesForTile(tile); 685 FreeResourcesForTile(tile);
602 if (was_ready_to_draw) 686 if (was_ready_to_draw)
603 client_->NotifyTileStateChanged(tile); 687 client_->NotifyTileStateChanged(tile);
604 } 688 }
605 689
606 void TileManager::ScheduleTasks( 690 void TileManager::ScheduleTasks(
607 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) { 691 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) {
608 TRACE_EVENT1("cc", 692 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
609 "TileManager::ScheduleTasks",
610 "count",
611 tiles_that_need_to_be_rasterized.size()); 693 tiles_that_need_to_be_rasterized.size());
612 694
613 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 695 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
614 696
615 raster_queue_.Reset(); 697 if (!has_scheduled_tile_tasks_) {
698 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
699 }
700
701 // Cancel existing OnTaskSetFinished callbacks.
702 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
616 703
617 // Even when scheduling an empty set of tiles, the TTWP does some work, and 704 // Even when scheduling an empty set of tiles, the TTWP does some work, and
618 // will always trigger a DidFinishRunningTileTasks notification. Because of 705 // will always trigger a DidFinishRunningTileTasks notification. Because of
619 // this we unconditionally set |has_scheduled_tile_tasks_| to true. 706 // this we unconditionally set |has_scheduled_tile_tasks_| to true.
620 has_scheduled_tile_tasks_ = true; 707 has_scheduled_tile_tasks_ = true;
621 708
622 // Build a new task queue containing all task currently needed. Tasks 709 // We need to keep the existing *_done_task_ tasks alive until after we
623 // are added in order of priority, highest priority task first. 710 // call ScheduleTasks on our tile_task_runner_. BuildTaskGraph will replace
624 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 711 // these, so hold references here.
625 Tile* tile = prioritized_tile.tile(); 712 scoped_refptr<TileTask> old_required_for_activation_done_task;
713 scoped_refptr<TileTask> old_required_for_draw_done_task;
714 scoped_refptr<TileTask> old_all_done_task;
reveman 2015/12/02 22:26:05 nit: how about "scoped_refptr<TileTask> new_*_done
ericrk 2015/12/03 00:43:22 restructured things to avoid this.
715 std::swap(old_required_for_activation_done_task,
716 required_for_activation_done_task_);
717 std::swap(old_required_for_draw_done_task, required_for_draw_done_task_);
718 std::swap(old_all_done_task, all_done_task_);
626 719
627 DCHECK(tile->draw_info().requires_resource()); 720 BuildTaskGraph(tiles_that_need_to_be_rasterized);
628 DCHECK(!tile->draw_info().resource_);
629
630 if (!tile->raster_task_.get())
631 tile->raster_task_ = CreateRasterTask(prioritized_tile);
632
633 TaskSetCollection task_sets;
634 if (tile->required_for_activation())
635 task_sets.set(REQUIRED_FOR_ACTIVATION);
636 if (tile->required_for_draw())
637 task_sets.set(REQUIRED_FOR_DRAW);
638 task_sets.set(ALL);
639 raster_queue_.items.push_back(
640 TileTaskQueue::Item(tile->raster_task_.get(), task_sets));
641 }
642 721
643 // We must reduce the amount of unused resoruces before calling 722 // We must reduce the amount of unused resoruces before calling
644 // ScheduleTasks to prevent usage from rising above limits. 723 // ScheduleTasks to prevent usage from rising above limits.
645 resource_pool_->ReduceResourceUsage(); 724 resource_pool_->ReduceResourceUsage();
646 725
647 // Schedule running of |raster_queue_|. This replaces any previously 726 // Schedule running of |raster_queue_|. This replaces any previously
648 // scheduled tasks and effectively cancels all tasks not present 727 // scheduled tasks and effectively cancels all tasks not present
649 // in |raster_queue_|. 728 // in |raster_queue_|.
650 tile_task_runner_->ScheduleTasks(&raster_queue_); 729 tile_task_runner_->ScheduleTasks(&graph_);
651 730
652 // It's now safe to clean up orphan tasks as raster worker pool is not 731 // It's now safe to clean up orphan tasks as raster worker pool is not
653 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has 732 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has
654 // been called. 733 // been called.
655 orphan_raster_tasks_.clear(); 734 orphan_tasks_.clear();
656 735
657 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 736 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
737
738 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
739 ScheduledTasksStateAsValue());
658 } 740 }
659 741
660 scoped_refptr<RasterTask> TileManager::CreateRasterTask( 742 scoped_refptr<RasterTask> TileManager::CreateRasterTask(
661 const PrioritizedTile& prioritized_tile) { 743 const PrioritizedTile& prioritized_tile) {
662 Tile* tile = prioritized_tile.tile(); 744 Tile* tile = prioritized_tile.tile();
663 uint64_t resource_content_id = 0; 745 uint64_t resource_content_id = 0;
664 Resource* resource = nullptr; 746 Resource* resource = nullptr;
665 if (use_partial_raster_ && tile->invalidated_id()) { 747 if (use_partial_raster_ && tile->invalidated_id()) {
666 // TODO(danakj): For resources that are in use, we should still grab them 748 // TODO(danakj): For resources that are in use, we should still grab them
667 // and copy from them instead of rastering everything. crbug.com/492754 749 // and copy from them instead of rastering everything. crbug.com/492754
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 784
703 void TileManager::OnRasterTaskCompleted( 785 void TileManager::OnRasterTaskCompleted(
704 Tile::Id tile_id, 786 Tile::Id tile_id,
705 Resource* resource, 787 Resource* resource,
706 const DisplayListRasterSource::SolidColorAnalysis& analysis, 788 const DisplayListRasterSource::SolidColorAnalysis& analysis,
707 bool was_canceled) { 789 bool was_canceled) {
708 DCHECK(tiles_.find(tile_id) != tiles_.end()); 790 DCHECK(tiles_.find(tile_id) != tiles_.end());
709 791
710 Tile* tile = tiles_[tile_id]; 792 Tile* tile = tiles_[tile_id];
711 DCHECK(tile->raster_task_.get()); 793 DCHECK(tile->raster_task_.get());
712 orphan_raster_tasks_.push_back(tile->raster_task_); 794 orphan_tasks_.push_back(tile->raster_task_);
713 tile->raster_task_ = nullptr; 795 tile->raster_task_ = nullptr;
714 796
715 if (was_canceled) { 797 if (was_canceled) {
716 ++flush_stats_.canceled_count; 798 ++flush_stats_.canceled_count;
717 // TODO(ericrk): If more partial raster work is done in the future, it may 799 // TODO(ericrk): If more partial raster work is done in the future, it may
718 // be worth returning the resource to the pool with its previous ID (not 800 // be worth returning the resource to the pool with its previous ID (not
719 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method 801 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
720 // of achieving this. 802 // of achieving this.
721 resource_pool_->ReleaseResource(resource, 0 /* content_id */); 803 resource_pool_->ReleaseResource(resource, 0 /* content_id */);
722 return; 804 return;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 848 DCHECK(tiles_.find(tile->id()) == tiles_.end());
767 849
768 tiles_[tile->id()] = tile.get(); 850 tiles_[tile->id()] = tile.get();
769 image_decode_controller_.AddLayerUsedCount(tile->layer_id()); 851 image_decode_controller_.AddLayerUsedCount(tile->layer_id());
770 return tile; 852 return tile;
771 } 853 }
772 854
773 void TileManager::SetTileTaskRunnerForTesting( 855 void TileManager::SetTileTaskRunnerForTesting(
774 TileTaskRunner* tile_task_runner) { 856 TileTaskRunner* tile_task_runner) {
775 tile_task_runner_ = tile_task_runner; 857 tile_task_runner_ = tile_task_runner;
776 tile_task_runner_->SetClient(this);
777 } 858 }
778 859
779 bool TileManager::AreRequiredTilesReadyToDraw( 860 bool TileManager::AreRequiredTilesReadyToDraw(
780 RasterTilePriorityQueue::Type type) const { 861 RasterTilePriorityQueue::Type type) const {
781 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( 862 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue(
782 client_->BuildRasterQueue(global_state_.tree_priority, type)); 863 client_->BuildRasterQueue(global_state_.tree_priority, type));
783 // It is insufficient to check whether the raster queue we constructed is 864 // It is insufficient to check whether the raster queue we constructed is
784 // empty. The reason for this is that there are situations (rasterize on 865 // empty. The reason for this is that there are situations (rasterize on
785 // demand) when the tile both needs raster and it's ready to draw. Hence, we 866 // demand) when the tile both needs raster and it's ready to draw. Hence, we
786 // have to iterate the queue to check whether the required tiles are ready to 867 // have to iterate the queue to check whether the required tiles are ready to
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 } 1021 }
941 1022
942 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { 1023 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
943 return tile_task_runner_->GetResourceFormat(!tile->is_opaque()); 1024 return tile_task_runner_->GetResourceFormat(!tile->is_opaque());
944 } 1025 }
945 1026
946 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const { 1027 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const {
947 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque()); 1028 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque());
948 } 1029 }
949 1030
950 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { 1031 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
1032 TileManager::ScheduledTasksStateAsValue() const {
1033 scoped_refptr<base::trace_event::TracedValue> state =
1034 new base::trace_event::TracedValue();
1035
1036 state->BeginDictionary("tasks_pending");
1037 state->SetBoolean("ready_to_activate", signals_.ready_to_activate);
1038 state->SetBoolean("ready_to_draw", signals_.ready_to_draw);
1039 state->SetBoolean("all_tile_tasks_completed",
1040 signals_.all_tile_tasks_completed);
1041 state->EndDictionary();
1042 return state;
951 } 1043 }
952 1044
1045 // Utility function that can be used to create a "Task set finished" task that
1046 // posts |callback| to |task_runner| when run.
1047 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1048 void (TileManager::*callback)()) {
1049 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1050 task_runner_.get(),
1051 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr())));
1052 }
reveman 2015/12/02 22:26:05 nit: would it not be easier to read if this helper
ericrk 2015/12/03 00:43:22 Done.
1053
1054 void TileManager::BuildTaskGraph(
1055 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) {
1056 // Track the number of dependents for each *_done task.
1057 size_t required_for_activate_count = 0;
1058 size_t required_for_draw_count = 0;
1059 size_t all_count = 0;
1060
1061 size_t priority = kTileTaskPriorityBase;
1062
1063 graph_.Reset();
1064
1065 required_for_activation_done_task_ = CreateTaskSetFinishedTask(
1066 &TileManager::DidFinishRunningTileTasksRequiredForActivation);
1067 required_for_draw_done_task_ = CreateTaskSetFinishedTask(
1068 &TileManager::DidFinishRunningTileTasksRequiredForDraw);
1069 all_done_task_ =
1070 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
reveman 2015/12/02 22:26:05 ah, I see why you did the std::swap in the other f
ericrk 2015/12/03 00:43:22 Inlined this function, so it's no longer an issue
1071
1072 // Build a new task queue containing all task currently needed. Tasks
1073 // are added in order of priority, highest priority task first.
1074 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
1075 Tile* tile = prioritized_tile.tile();
1076
1077 DCHECK(tile->draw_info().requires_resource());
1078 DCHECK(!tile->draw_info().resource_);
1079
1080 if (!tile->raster_task_) {
1081 tile->raster_task_ = CreateRasterTask(prioritized_tile);
1082 }
1083
1084 RasterTask* task = tile->raster_task_.get();
1085 DCHECK(!task->HasCompleted());
1086
1087 if (!tile->raster_task_.get())
1088 tile->raster_task_ = CreateRasterTask(prioritized_tile);
1089
1090 if (tile->required_for_activation()) {
1091 required_for_activate_count++;
1092 graph_.edges.push_back(
1093 TaskGraph::Edge(task, required_for_activation_done_task_.get()));
1094 }
1095 if (tile->required_for_draw()) {
1096 required_for_draw_count++;
1097 graph_.edges.push_back(
1098 TaskGraph::Edge(task, required_for_draw_done_task_.get()));
1099 }
1100 all_count++;
1101 graph_.edges.push_back(TaskGraph::Edge(task, all_done_task_.get()));
1102
1103 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
1104 }
1105
1106 InsertNodeForTask(&graph_, required_for_activation_done_task_.get(),
1107 kRequiredForActivationDoneTaskPriority,
1108 required_for_activate_count);
1109 InsertNodeForTask(&graph_, required_for_draw_done_task_.get(),
1110 kRequiredForDrawDoneTaskPriority, required_for_draw_count);
1111 InsertNodeForTask(&graph_, all_done_task_.get(), kAllDoneTaskPriority,
1112 all_count);
1113 }
1114
1115 TileManager::MemoryUsage::MemoryUsage()
1116 : memory_bytes_(0), resource_count_(0) {}
1117
953 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1118 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
954 size_t resource_count) 1119 size_t resource_count)
955 : memory_bytes_(static_cast<int64>(memory_bytes)), 1120 : memory_bytes_(static_cast<int64>(memory_bytes)),
956 resource_count_(static_cast<int>(resource_count)) { 1121 resource_count_(static_cast<int>(resource_count)) {
957 // MemoryUsage is constructed using size_ts, since it deals with memory and 1122 // MemoryUsage is constructed using size_ts, since it deals with memory and
958 // the inputs are typically size_t. However, during the course of usage (in 1123 // the inputs are typically size_t. However, during the course of usage (in
959 // particular operator-=) can cause internal values to become negative. Thus, 1124 // particular operator-=) can cause internal values to become negative. Thus,
960 // member variables are signed. 1125 // member variables are signed.
961 DCHECK_LE(memory_bytes, 1126 DCHECK_LE(memory_bytes,
962 static_cast<size_t>(std::numeric_limits<int64>::max())); 1127 static_cast<size_t>(std::numeric_limits<int64>::max()));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 void TileManager::Signals::reset() { 1182 void TileManager::Signals::reset() {
1018 ready_to_activate = false; 1183 ready_to_activate = false;
1019 did_notify_ready_to_activate = false; 1184 did_notify_ready_to_activate = false;
1020 ready_to_draw = false; 1185 ready_to_draw = false;
1021 did_notify_ready_to_draw = false; 1186 did_notify_ready_to_draw = false;
1022 all_tile_tasks_completed = false; 1187 all_tile_tasks_completed = false;
1023 did_notify_all_tile_tasks_completed = false; 1188 did_notify_all_tile_tasks_completed = false;
1024 } 1189 }
1025 1190
1026 } // namespace cc 1191 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698