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

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: 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 case TileManager::REQUIRED_FOR_ACTIVATION: 160 case TileManager::REQUIRED_FOR_ACTIVATION:
161 return "REQUIRED_FOR_ACTIVATION"; 161 return "REQUIRED_FOR_ACTIVATION";
162 case TileManager::REQUIRED_FOR_DRAW: 162 case TileManager::REQUIRED_FOR_DRAW:
163 return "REQUIRED_FOR_DRAW"; 163 return "REQUIRED_FOR_DRAW";
164 } 164 }
165 165
166 NOTREACHED(); 166 NOTREACHED();
167 return "Invalid TaskSet"; 167 return "Invalid TaskSet";
168 } 168 }
169 169
170 // Task priorities that make sure task set finished tasks run before any
171 // other remaining tasks. This is combined with the task set type to ensure
172 // proper prioritization ordering between task set types.
173 size_t kTaskSetFinishedTaskPriorityBase = 1u;
174 // For correctness, |kTileTaskPriorityBase| must be greater than
175 // |kTaskSetFinishedTaskPriorityBase + kNumberOfTaskSets|.
176 size_t kTileTaskPriorityBase = 10u;
177
178 void InsertNodeForTask(TaskGraph* graph,
179 TileTask* task,
180 size_t priority,
181 size_t dependencies) {
182 DCHECK(std::find_if(graph->nodes.begin(), graph->nodes.end(),
183 [task](const TaskGraph::Node& node) {
184 return node.task == task;
185 }) == graph->nodes.end());
186 graph->nodes.push_back(TaskGraph::Node(task, priority, dependencies));
187 }
188
189 void InsertNodesForRasterTask(TaskGraph* graph,
190 RasterTask* raster_task,
191 const ImageDecodeTask::Vector& decode_tasks,
192 size_t priority) {
193 size_t dependencies = 0u;
194
195 // Insert image decode tasks.
196 for (ImageDecodeTask::Vector::const_iterator it = decode_tasks.begin();
197 it != decode_tasks.end(); ++it) {
198 ImageDecodeTask* decode_task = it->get();
199
200 // Skip if already decoded.
201 if (decode_task->HasCompleted())
202 continue;
203
204 dependencies++;
205
206 // Add decode task if it doesn't already exists in graph.
207 TaskGraph::Node::Vector::iterator decode_it =
208 std::find_if(graph->nodes.begin(), graph->nodes.end(),
209 [decode_task](const TaskGraph::Node& node) {
210 return node.task == decode_task;
211 });
212 if (decode_it == graph->nodes.end())
213 InsertNodeForTask(graph, decode_task, priority, 0u);
214
215 graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
216 }
217
218 InsertNodeForTask(graph, raster_task, priority, dependencies);
219 }
220
221 class TaskSetFinishedTaskImpl : public TileTask {
222 public:
223 explicit TaskSetFinishedTaskImpl(
224 base::SequencedTaskRunner* task_runner,
225 const base::Closure& on_task_set_finished_callback)
226 : task_runner_(task_runner),
227 on_task_set_finished_callback_(on_task_set_finished_callback) {}
228
229 // Overridden from Task:
230 void RunOnWorkerThread() override {
231 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread");
232 TaskSetFinished();
233 }
234
235 // Overridden from TileTask:
236 void ScheduleOnOriginThread(TileTaskClient* client) override {}
237 void CompleteOnOriginThread(TileTaskClient* client) override {}
238
239 protected:
240 ~TaskSetFinishedTaskImpl() override {}
241
242 void TaskSetFinished() {
243 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_);
244 }
245
246 private:
247 scoped_refptr<base::SequencedTaskRunner> task_runner_;
248 const base::Closure on_task_set_finished_callback_;
249
250 DISALLOW_COPY_AND_ASSIGN(TaskSetFinishedTaskImpl);
251 };
252
253 // Utility function that can be used to create a "Task set finished" task that
254 // posts |callback| to |task_runner| when run.
255 scoped_refptr<TileTask> CreateTaskSetFinishedTask(
256 base::SequencedTaskRunner* task_runner,
257 const base::Closure& on_task_set_finished_callback) {
258 return make_scoped_refptr(
259 new TaskSetFinishedTaskImpl(task_runner, on_task_set_finished_callback));
260 }
261
170 } // namespace 262 } // namespace
171 263
172 RasterTaskCompletionStats::RasterTaskCompletionStats() 264 RasterTaskCompletionStats::RasterTaskCompletionStats()
173 : completed_count(0u), canceled_count(0u) {} 265 : completed_count(0u), canceled_count(0u) {}
174 266
175 scoped_refptr<base::trace_event::ConvertableToTraceFormat> 267 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
176 RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats) { 268 RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats) {
177 scoped_refptr<base::trace_event::TracedValue> state = 269 scoped_refptr<base::trace_event::TracedValue> state =
178 new base::trace_event::TracedValue(); 270 new base::trace_event::TracedValue();
179 state->SetInteger("completed_count", 271 state->SetInteger("completed_count",
(...skipping 29 matching lines...) Expand all
209 did_oom_on_last_assign_(false), 301 did_oom_on_last_assign_(false),
210 more_tiles_need_prepare_check_notifier_( 302 more_tiles_need_prepare_check_notifier_(
211 task_runner_.get(), 303 task_runner_.get(),
212 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, 304 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
213 base::Unretained(this))), 305 base::Unretained(this))),
214 signals_check_notifier_(task_runner_.get(), 306 signals_check_notifier_(task_runner_.get(),
215 base::Bind(&TileManager::CheckAndIssueSignals, 307 base::Bind(&TileManager::CheckAndIssueSignals,
216 base::Unretained(this))), 308 base::Unretained(this))),
217 has_scheduled_tile_tasks_(false), 309 has_scheduled_tile_tasks_(false),
218 prepare_tiles_count_(0u), 310 prepare_tiles_count_(0u),
219 next_tile_id_(0u) {} 311 next_tile_id_(0u),
312 task_set_finished_weak_ptr_factory_(this) {}
220 313
221 TileManager::~TileManager() { 314 TileManager::~TileManager() {
222 FinishTasksAndCleanUp(); 315 FinishTasksAndCleanUp();
223 } 316 }
224 317
225 void TileManager::FinishTasksAndCleanUp() { 318 void TileManager::FinishTasksAndCleanUp() {
226 if (!tile_task_runner_) 319 if (!tile_task_runner_)
227 return; 320 return;
228 321
229 global_state_ = GlobalStateThatImpactsTilePriority(); 322 global_state_ = GlobalStateThatImpactsTilePriority();
230 323
231 TileTaskQueue empty; 324 // This cancels tasks if possible, finishes pending tasks, and release any
232 tile_task_runner_->ScheduleTasks(&empty); 325 // uninitialized resources.
233 orphan_raster_tasks_.clear(); 326 tile_task_runner_->Shutdown();
234 327
235 // This should finish all pending tasks and release any uninitialized 328 // Now that all tasks have been finished, we can clear any
236 // resources. 329 // |orphan_tasks_|.
237 tile_task_runner_->Shutdown(); 330 orphan_tasks_.clear();
331
238 tile_task_runner_->CheckForCompletedTasks(); 332 tile_task_runner_->CheckForCompletedTasks();
239 333
240 FreeResourcesForReleasedTiles(); 334 FreeResourcesForReleasedTiles();
241 CleanUpReleasedTiles(); 335 CleanUpReleasedTiles();
242 336
243 tile_task_runner_ = nullptr; 337 tile_task_runner_ = nullptr;
244 resource_pool_ = nullptr; 338 resource_pool_ = nullptr;
245 more_tiles_need_prepare_check_notifier_.Cancel(); 339 more_tiles_need_prepare_check_notifier_.Cancel();
246 signals_check_notifier_.Cancel(); 340 signals_check_notifier_.Cancel();
341 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
247 } 342 }
248 343
249 void TileManager::SetResources(ResourcePool* resource_pool, 344 void TileManager::SetResources(ResourcePool* resource_pool,
250 TileTaskRunner* tile_task_runner, 345 TileTaskRunner* tile_task_runner,
251 size_t scheduled_raster_task_limit) { 346 size_t scheduled_raster_task_limit) {
252 DCHECK(!tile_task_runner_); 347 DCHECK(!tile_task_runner_);
253 DCHECK(tile_task_runner); 348 DCHECK(tile_task_runner);
254 349
255 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 350 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
256 resource_pool_ = resource_pool; 351 resource_pool_ = resource_pool;
257 tile_task_runner_ = tile_task_runner; 352 tile_task_runner_ = tile_task_runner;
258 tile_task_runner_->SetClient(this);
259 } 353 }
260 354
261 void TileManager::Release(Tile* tile) { 355 void TileManager::Release(Tile* tile) {
262 released_tiles_.push_back(tile); 356 released_tiles_.push_back(tile);
263 } 357 }
264 358
265 void TileManager::FreeResourcesForReleasedTiles() { 359 void TileManager::FreeResourcesForReleasedTiles() {
266 for (auto* tile : released_tiles_) 360 for (auto* tile : released_tiles_)
267 FreeResourcesForTile(tile); 361 FreeResourcesForTile(tile);
268 } 362 }
(...skipping 15 matching lines...) Expand all
284 } 378 }
285 released_tiles_.swap(tiles_to_retain); 379 released_tiles_.swap(tiles_to_retain);
286 } 380 }
287 381
288 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) { 382 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) {
289 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set", 383 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set",
290 TaskSetName(task_set)); 384 TaskSetName(task_set));
291 DCHECK(resource_pool_); 385 DCHECK(resource_pool_);
292 DCHECK(tile_task_runner_); 386 DCHECK(tile_task_runner_);
293 387
388 DCHECK(tasks_pending_[task_set]);
389 tasks_pending_[task_set] = false;
390
391 if (tasks_pending_.any()) {
392 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running",
393 "state", ScheduledTasksStateAsValue());
394 } else {
395 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
396 }
397
294 switch (task_set) { 398 switch (task_set) {
295 case ALL: { 399 case ALL: {
296 has_scheduled_tile_tasks_ = false; 400 has_scheduled_tile_tasks_ = false;
297 401
298 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() > 402 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() >
299 global_state_.soft_memory_limit_in_bytes; 403 global_state_.soft_memory_limit_in_bytes;
300 404
301 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 405 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
302 !memory_usage_above_limit) { 406 !memory_usage_above_limit) {
303 // TODO(ericrk): We should find a better way to safely handle re-entrant 407 // TODO(ericrk): We should find a better way to safely handle re-entrant
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( 702 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
599 Tile* tile) { 703 Tile* tile) {
600 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); 704 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw();
601 FreeResourcesForTile(tile); 705 FreeResourcesForTile(tile);
602 if (was_ready_to_draw) 706 if (was_ready_to_draw)
603 client_->NotifyTileStateChanged(tile); 707 client_->NotifyTileStateChanged(tile);
604 } 708 }
605 709
606 void TileManager::ScheduleTasks( 710 void TileManager::ScheduleTasks(
607 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) { 711 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) {
608 TRACE_EVENT1("cc", 712 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
609 "TileManager::ScheduleTasks",
610 "count",
611 tiles_that_need_to_be_rasterized.size()); 713 tiles_that_need_to_be_rasterized.size());
612 714
613 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 715 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
614 716
615 raster_queue_.Reset(); 717 if (tasks_pending_.none()) {
718 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
719 }
720
721 // Cancel existing OnTaskSetFinished callbacks.
722 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
723 tasks_pending_.set();
616 724
617 // Even when scheduling an empty set of tiles, the TTWP does some work, and 725 // Even when scheduling an empty set of tiles, the TTWP does some work, and
618 // will always trigger a DidFinishRunningTileTasks notification. Because of 726 // will always trigger a DidFinishRunningTileTasks notification. Because of
619 // this we unconditionally set |has_scheduled_tile_tasks_| to true. 727 // this we unconditionally set |has_scheduled_tile_tasks_| to true.
620 has_scheduled_tile_tasks_ = true; 728 has_scheduled_tile_tasks_ = true;
621 729
622 // Build a new task queue containing all task currently needed. Tasks 730 scoped_ptr<TaskGraph> graph(new TaskGraph);
623 // are added in order of priority, highest priority task first. 731 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
624 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 732 BuildTaskGraph(tiles_that_need_to_be_rasterized, graph.get(),
625 Tile* tile = prioritized_tile.tile(); 733 new_task_set_finished_tasks);
626
627 DCHECK(tile->draw_info().requires_resource());
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 734
643 // We must reduce the amount of unused resoruces before calling 735 // We must reduce the amount of unused resoruces before calling
644 // ScheduleTasks to prevent usage from rising above limits. 736 // ScheduleTasks to prevent usage from rising above limits.
645 resource_pool_->ReduceResourceUsage(); 737 resource_pool_->ReduceResourceUsage();
646 738
647 // Schedule running of |raster_queue_|. This replaces any previously 739 // Schedule running of |raster_queue_|. This replaces any previously
648 // scheduled tasks and effectively cancels all tasks not present 740 // scheduled tasks and effectively cancels all tasks not present
649 // in |raster_queue_|. 741 // in |raster_queue_|.
650 tile_task_runner_->ScheduleTasks(&raster_queue_); 742 tile_task_runner_->ScheduleTasks(graph.Pass());
651 743
652 // It's now safe to clean up orphan tasks as raster worker pool is not 744 // 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 745 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has
654 // been called. 746 // been called.
655 orphan_raster_tasks_.clear(); 747 orphan_tasks_.clear();
748
749 // Our |new_task_set_finished_tasks| need to be kept alive while the
750 // TaskGraphRunner may be using them.
751 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
752 orphan_tasks_.push_back(std::move(new_task_set_finished_tasks[task_set]));
753 }
656 754
657 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 755 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
756
757 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
758 ScheduledTasksStateAsValue());
658 } 759 }
659 760
660 scoped_refptr<RasterTask> TileManager::CreateRasterTask( 761 scoped_refptr<RasterTask> TileManager::CreateRasterTask(
661 const PrioritizedTile& prioritized_tile) { 762 const PrioritizedTile& prioritized_tile) {
662 Tile* tile = prioritized_tile.tile(); 763 Tile* tile = prioritized_tile.tile();
663 uint64_t resource_content_id = 0; 764 uint64_t resource_content_id = 0;
664 Resource* resource = nullptr; 765 Resource* resource = nullptr;
665 if (use_partial_raster_ && tile->invalidated_id()) { 766 if (use_partial_raster_ && tile->invalidated_id()) {
666 // TODO(danakj): For resources that are in use, we should still grab them 767 // 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 768 // and copy from them instead of rastering everything. crbug.com/492754
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 803
703 void TileManager::OnRasterTaskCompleted( 804 void TileManager::OnRasterTaskCompleted(
704 Tile::Id tile_id, 805 Tile::Id tile_id,
705 Resource* resource, 806 Resource* resource,
706 const DisplayListRasterSource::SolidColorAnalysis& analysis, 807 const DisplayListRasterSource::SolidColorAnalysis& analysis,
707 bool was_canceled) { 808 bool was_canceled) {
708 DCHECK(tiles_.find(tile_id) != tiles_.end()); 809 DCHECK(tiles_.find(tile_id) != tiles_.end());
709 810
710 Tile* tile = tiles_[tile_id]; 811 Tile* tile = tiles_[tile_id];
711 DCHECK(tile->raster_task_.get()); 812 DCHECK(tile->raster_task_.get());
712 orphan_raster_tasks_.push_back(tile->raster_task_); 813 orphan_tasks_.push_back(tile->raster_task_);
713 tile->raster_task_ = nullptr; 814 tile->raster_task_ = nullptr;
714 815
715 if (was_canceled) { 816 if (was_canceled) {
716 ++flush_stats_.canceled_count; 817 ++flush_stats_.canceled_count;
717 // TODO(ericrk): If more partial raster work is done in the future, it may 818 // 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 819 // be worth returning the resource to the pool with its previous ID (not
719 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method 820 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
720 // of achieving this. 821 // of achieving this.
721 resource_pool_->ReleaseResource(resource, 0 /* content_id */); 822 resource_pool_->ReleaseResource(resource, 0 /* content_id */);
722 return; 823 return;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 867 DCHECK(tiles_.find(tile->id()) == tiles_.end());
767 868
768 tiles_[tile->id()] = tile.get(); 869 tiles_[tile->id()] = tile.get();
769 image_decode_controller_.AddLayerUsedCount(tile->layer_id()); 870 image_decode_controller_.AddLayerUsedCount(tile->layer_id());
770 return tile; 871 return tile;
771 } 872 }
772 873
773 void TileManager::SetTileTaskRunnerForTesting( 874 void TileManager::SetTileTaskRunnerForTesting(
774 TileTaskRunner* tile_task_runner) { 875 TileTaskRunner* tile_task_runner) {
775 tile_task_runner_ = tile_task_runner; 876 tile_task_runner_ = tile_task_runner;
776 tile_task_runner_->SetClient(this);
777 } 877 }
778 878
779 bool TileManager::AreRequiredTilesReadyToDraw( 879 bool TileManager::AreRequiredTilesReadyToDraw(
780 RasterTilePriorityQueue::Type type) const { 880 RasterTilePriorityQueue::Type type) const {
781 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( 881 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue(
782 client_->BuildRasterQueue(global_state_.tree_priority, type)); 882 client_->BuildRasterQueue(global_state_.tree_priority, type));
783 // It is insufficient to check whether the raster queue we constructed is 883 // 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 884 // 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 885 // 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 886 // 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 } 1040 }
941 1041
942 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { 1042 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
943 return tile_task_runner_->GetResourceFormat(!tile->is_opaque()); 1043 return tile_task_runner_->GetResourceFormat(!tile->is_opaque());
944 } 1044 }
945 1045
946 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const { 1046 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const {
947 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque()); 1047 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque());
948 } 1048 }
949 1049
950 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { 1050 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
1051 TileManager::ScheduledTasksStateAsValue() const {
1052 scoped_refptr<base::trace_event::TracedValue> state =
1053 new base::trace_event::TracedValue();
1054
1055 state->BeginArray("tasks_pending");
1056 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1057 state->AppendBoolean(tasks_pending_[task_set]);
1058 }
1059 state->EndArray();
1060 return state;
951 } 1061 }
952 1062
1063 void TileManager::BuildTaskGraph(
1064 const PrioritizedTileVector& tiles_that_need_to_be_rasterized,
1065 TaskGraph* graph,
1066 scoped_refptr<TileTask>(&new_task_set_finished_tasks)[kNumberOfTaskSets]) {
1067 size_t task_count[kNumberOfTaskSets] = {0};
1068
1069 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1070 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
1071 task_runner_.get(),
1072 base::Bind(&TileManager::DidFinishRunningTileTasks,
1073 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
1074 }
1075
1076 size_t priority = kTileTaskPriorityBase;
1077
1078 // Build a new task queue containing all task currently needed. Tasks
1079 // are added in order of priority, highest priority task first.
1080 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
1081 Tile* tile = prioritized_tile.tile();
1082
1083 DCHECK(tile->draw_info().requires_resource());
1084 DCHECK(!tile->draw_info().resource_);
1085
1086 if (!tile->raster_task_.get())
1087 tile->raster_task_ = CreateRasterTask(prioritized_tile);
1088
1089 TaskSetCollection task_sets;
1090 if (tile->required_for_activation())
1091 task_sets.set(REQUIRED_FOR_ACTIVATION);
1092 if (tile->required_for_draw())
1093 task_sets.set(REQUIRED_FOR_DRAW);
1094 task_sets.set(ALL);
1095
1096 RasterTask* task = tile->raster_task_.get();
1097 DCHECK(!task->HasCompleted());
1098
1099 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1100 if (!task_sets[task_set])
1101 continue;
1102
1103 ++task_count[task_set];
1104
1105 graph->edges.push_back(
1106 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
1107 }
1108
1109 InsertNodesForRasterTask(graph, task, task->dependencies(), priority++);
1110 }
1111
1112 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
1113 InsertNodeForTask(graph, new_task_set_finished_tasks[task_set].get(),
1114 kTaskSetFinishedTaskPriorityBase + task_set,
1115 task_count[task_set]);
1116 }
1117 }
1118
1119 TileManager::MemoryUsage::MemoryUsage()
1120 : memory_bytes_(0), resource_count_(0) {}
1121
953 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1122 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
954 size_t resource_count) 1123 size_t resource_count)
955 : memory_bytes_(static_cast<int64>(memory_bytes)), 1124 : memory_bytes_(static_cast<int64>(memory_bytes)),
956 resource_count_(static_cast<int>(resource_count)) { 1125 resource_count_(static_cast<int>(resource_count)) {
957 // MemoryUsage is constructed using size_ts, since it deals with memory and 1126 // 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 1127 // the inputs are typically size_t. However, during the course of usage (in
959 // particular operator-=) can cause internal values to become negative. Thus, 1128 // particular operator-=) can cause internal values to become negative. Thus,
960 // member variables are signed. 1129 // member variables are signed.
961 DCHECK_LE(memory_bytes, 1130 DCHECK_LE(memory_bytes,
962 static_cast<size_t>(std::numeric_limits<int64>::max())); 1131 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() { 1186 void TileManager::Signals::reset() {
1018 ready_to_activate = false; 1187 ready_to_activate = false;
1019 did_notify_ready_to_activate = false; 1188 did_notify_ready_to_activate = false;
1020 ready_to_draw = false; 1189 ready_to_draw = false;
1021 did_notify_ready_to_draw = false; 1190 did_notify_ready_to_draw = false;
1022 all_tile_tasks_completed = false; 1191 all_tile_tasks_completed = false;
1023 did_notify_all_tile_tasks_completed = false; 1192 did_notify_all_tile_tasks_completed = false;
1024 } 1193 }
1025 1194
1026 } // namespace cc 1195 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698