OLD | NEW |
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 Loading... |
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 Loading... |
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 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| 365 ScheduledTasksStateAsValue()); |
| 366 signals_.ready_to_activate = true; |
| 367 signals_check_notifier_.Schedule(); |
| 368 } |
| 369 |
| 370 void TileManager::DidFinishRunningTileTasksRequiredForDraw() { |
| 371 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTileTasksRequiredForDraw"); |
| 372 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| 373 ScheduledTasksStateAsValue()); |
| 374 signals_.ready_to_draw = true; |
| 375 signals_check_notifier_.Schedule(); |
| 376 } |
| 377 |
| 378 void TileManager::DidFinishRunningAllTileTasks() { |
| 379 TRACE_EVENT0("cc", "TileManager::DidFinishRunningAllTileTasks"); |
| 380 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); |
291 DCHECK(resource_pool_); | 381 DCHECK(resource_pool_); |
292 DCHECK(tile_task_runner_); | 382 DCHECK(tile_task_runner_); |
293 | 383 |
294 switch (task_set) { | 384 has_scheduled_tile_tasks_ = false; |
295 case ALL: { | |
296 has_scheduled_tile_tasks_ = false; | |
297 | 385 |
298 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() > | 386 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() > |
299 global_state_.soft_memory_limit_in_bytes; | 387 global_state_.soft_memory_limit_in_bytes; |
300 | 388 |
301 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && | 389 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && |
302 !memory_usage_above_limit) { | 390 !memory_usage_above_limit) { |
303 // TODO(ericrk): We should find a better way to safely handle re-entrant | 391 // TODO(ericrk): We should find a better way to safely handle re-entrant |
304 // notifications than always having to schedule a new task. | 392 // notifications than always having to schedule a new task. |
305 // http://crbug.com/498439 | 393 // http://crbug.com/498439 |
306 signals_.all_tile_tasks_completed = true; | 394 signals_.all_tile_tasks_completed = true; |
307 signals_check_notifier_.Schedule(); | 395 signals_check_notifier_.Schedule(); |
308 return; | 396 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 } | 397 } |
324 | 398 |
325 NOTREACHED(); | 399 more_tiles_need_prepare_check_notifier_.Schedule(); |
326 } | 400 } |
327 | 401 |
328 bool TileManager::PrepareTiles( | 402 bool TileManager::PrepareTiles( |
329 const GlobalStateThatImpactsTilePriority& state) { | 403 const GlobalStateThatImpactsTilePriority& state) { |
330 ++prepare_tiles_count_; | 404 ++prepare_tiles_count_; |
331 | 405 |
332 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", | 406 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", |
333 prepare_tiles_count_); | 407 prepare_tiles_count_); |
334 | 408 |
335 if (!tile_task_runner_) { | 409 if (!tile_task_runner_) { |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 672 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
599 Tile* tile) { | 673 Tile* tile) { |
600 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); | 674 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); |
601 FreeResourcesForTile(tile); | 675 FreeResourcesForTile(tile); |
602 if (was_ready_to_draw) | 676 if (was_ready_to_draw) |
603 client_->NotifyTileStateChanged(tile); | 677 client_->NotifyTileStateChanged(tile); |
604 } | 678 } |
605 | 679 |
606 void TileManager::ScheduleTasks( | 680 void TileManager::ScheduleTasks( |
607 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) { | 681 const PrioritizedTileVector& tiles_that_need_to_be_rasterized) { |
608 TRACE_EVENT1("cc", | 682 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count", |
609 "TileManager::ScheduleTasks", | |
610 "count", | |
611 tiles_that_need_to_be_rasterized.size()); | 683 tiles_that_need_to_be_rasterized.size()); |
612 | 684 |
613 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 685 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
614 | 686 |
615 raster_queue_.Reset(); | 687 if (!has_scheduled_tile_tasks_) { |
| 688 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); |
| 689 } |
| 690 |
| 691 // Cancel existing OnTaskSetFinished callbacks. |
| 692 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
616 | 693 |
617 // Even when scheduling an empty set of tiles, the TTWP does some work, and | 694 // Even when scheduling an empty set of tiles, the TTWP does some work, and |
618 // will always trigger a DidFinishRunningTileTasks notification. Because of | 695 // will always trigger a DidFinishRunningTileTasks notification. Because of |
619 // this we unconditionally set |has_scheduled_tile_tasks_| to true. | 696 // this we unconditionally set |has_scheduled_tile_tasks_| to true. |
620 has_scheduled_tile_tasks_ = true; | 697 has_scheduled_tile_tasks_ = true; |
621 | 698 |
| 699 // Track the number of dependents for each *_done task. |
| 700 size_t required_for_activate_count = 0; |
| 701 size_t required_for_draw_count = 0; |
| 702 size_t all_count = 0; |
| 703 |
| 704 size_t priority = kTileTaskPriorityBase; |
| 705 |
| 706 graph_.Reset(); |
| 707 |
| 708 scoped_refptr<TileTask> required_for_activation_done_task = |
| 709 CreateTaskSetFinishedTask( |
| 710 &TileManager::DidFinishRunningTileTasksRequiredForActivation); |
| 711 scoped_refptr<TileTask> required_for_draw_done_task = |
| 712 CreateTaskSetFinishedTask( |
| 713 &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| 714 scoped_refptr<TileTask> all_done_task = |
| 715 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| 716 |
622 // Build a new task queue containing all task currently needed. Tasks | 717 // Build a new task queue containing all task currently needed. Tasks |
623 // are added in order of priority, highest priority task first. | 718 // are added in order of priority, highest priority task first. |
624 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { | 719 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
625 Tile* tile = prioritized_tile.tile(); | 720 Tile* tile = prioritized_tile.tile(); |
626 | 721 |
627 DCHECK(tile->draw_info().requires_resource()); | 722 DCHECK(tile->draw_info().requires_resource()); |
628 DCHECK(!tile->draw_info().resource_); | 723 DCHECK(!tile->draw_info().resource_); |
629 | 724 |
| 725 if (!tile->raster_task_) { |
| 726 tile->raster_task_ = CreateRasterTask(prioritized_tile); |
| 727 } |
| 728 |
| 729 RasterTask* task = tile->raster_task_.get(); |
| 730 DCHECK(!task->HasCompleted()); |
| 731 |
630 if (!tile->raster_task_.get()) | 732 if (!tile->raster_task_.get()) |
631 tile->raster_task_ = CreateRasterTask(prioritized_tile); | 733 tile->raster_task_ = CreateRasterTask(prioritized_tile); |
632 | 734 |
633 TaskSetCollection task_sets; | 735 if (tile->required_for_activation()) { |
634 if (tile->required_for_activation()) | 736 required_for_activate_count++; |
635 task_sets.set(REQUIRED_FOR_ACTIVATION); | 737 graph_.edges.push_back( |
636 if (tile->required_for_draw()) | 738 TaskGraph::Edge(task, required_for_activation_done_task.get())); |
637 task_sets.set(REQUIRED_FOR_DRAW); | 739 } |
638 task_sets.set(ALL); | 740 if (tile->required_for_draw()) { |
639 raster_queue_.items.push_back( | 741 required_for_draw_count++; |
640 TileTaskQueue::Item(tile->raster_task_.get(), task_sets)); | 742 graph_.edges.push_back( |
| 743 TaskGraph::Edge(task, required_for_draw_done_task.get())); |
| 744 } |
| 745 all_count++; |
| 746 graph_.edges.push_back(TaskGraph::Edge(task, all_done_task.get())); |
| 747 |
| 748 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); |
641 } | 749 } |
642 | 750 |
| 751 InsertNodeForTask(&graph_, required_for_activation_done_task.get(), |
| 752 kRequiredForActivationDoneTaskPriority, |
| 753 required_for_activate_count); |
| 754 InsertNodeForTask(&graph_, required_for_draw_done_task.get(), |
| 755 kRequiredForDrawDoneTaskPriority, required_for_draw_count); |
| 756 InsertNodeForTask(&graph_, all_done_task.get(), kAllDoneTaskPriority, |
| 757 all_count); |
| 758 |
643 // We must reduce the amount of unused resoruces before calling | 759 // We must reduce the amount of unused resoruces before calling |
644 // ScheduleTasks to prevent usage from rising above limits. | 760 // ScheduleTasks to prevent usage from rising above limits. |
645 resource_pool_->ReduceResourceUsage(); | 761 resource_pool_->ReduceResourceUsage(); |
646 | 762 |
647 // Schedule running of |raster_queue_|. This replaces any previously | 763 // Schedule running of |raster_queue_|. This replaces any previously |
648 // scheduled tasks and effectively cancels all tasks not present | 764 // scheduled tasks and effectively cancels all tasks not present |
649 // in |raster_queue_|. | 765 // in |raster_queue_|. |
650 tile_task_runner_->ScheduleTasks(&raster_queue_); | 766 tile_task_runner_->ScheduleTasks(&graph_); |
651 | 767 |
652 // It's now safe to clean up orphan tasks as raster worker pool is not | 768 // 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 | 769 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has |
654 // been called. | 770 // been called. |
655 orphan_raster_tasks_.clear(); | 771 orphan_tasks_.clear(); |
| 772 |
| 773 // It's also now safe to replace our *_done_task_ tasks. |
| 774 required_for_activation_done_task_ = |
| 775 std::move(required_for_activation_done_task); |
| 776 required_for_draw_done_task_ = std::move(required_for_draw_done_task); |
| 777 all_done_task_ = std::move(all_done_task); |
656 | 778 |
657 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 779 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 780 |
| 781 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| 782 ScheduledTasksStateAsValue()); |
658 } | 783 } |
659 | 784 |
660 scoped_refptr<RasterTask> TileManager::CreateRasterTask( | 785 scoped_refptr<RasterTask> TileManager::CreateRasterTask( |
661 const PrioritizedTile& prioritized_tile) { | 786 const PrioritizedTile& prioritized_tile) { |
662 Tile* tile = prioritized_tile.tile(); | 787 Tile* tile = prioritized_tile.tile(); |
663 uint64_t resource_content_id = 0; | 788 uint64_t resource_content_id = 0; |
664 Resource* resource = nullptr; | 789 Resource* resource = nullptr; |
665 if (use_partial_raster_ && tile->invalidated_id()) { | 790 if (use_partial_raster_ && tile->invalidated_id()) { |
666 // TODO(danakj): For resources that are in use, we should still grab them | 791 // 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 | 792 // and copy from them instead of rastering everything. crbug.com/492754 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 | 827 |
703 void TileManager::OnRasterTaskCompleted( | 828 void TileManager::OnRasterTaskCompleted( |
704 Tile::Id tile_id, | 829 Tile::Id tile_id, |
705 Resource* resource, | 830 Resource* resource, |
706 const DisplayListRasterSource::SolidColorAnalysis& analysis, | 831 const DisplayListRasterSource::SolidColorAnalysis& analysis, |
707 bool was_canceled) { | 832 bool was_canceled) { |
708 DCHECK(tiles_.find(tile_id) != tiles_.end()); | 833 DCHECK(tiles_.find(tile_id) != tiles_.end()); |
709 | 834 |
710 Tile* tile = tiles_[tile_id]; | 835 Tile* tile = tiles_[tile_id]; |
711 DCHECK(tile->raster_task_.get()); | 836 DCHECK(tile->raster_task_.get()); |
712 orphan_raster_tasks_.push_back(tile->raster_task_); | 837 orphan_tasks_.push_back(tile->raster_task_); |
713 tile->raster_task_ = nullptr; | 838 tile->raster_task_ = nullptr; |
714 | 839 |
715 if (was_canceled) { | 840 if (was_canceled) { |
716 ++flush_stats_.canceled_count; | 841 ++flush_stats_.canceled_count; |
717 // TODO(ericrk): If more partial raster work is done in the future, it may | 842 // 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 | 843 // be worth returning the resource to the pool with its previous ID (not |
719 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method | 844 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method |
720 // of achieving this. | 845 // of achieving this. |
721 resource_pool_->ReleaseResource(resource, 0 /* content_id */); | 846 resource_pool_->ReleaseResource(resource, 0 /* content_id */); |
722 return; | 847 return; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 891 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
767 | 892 |
768 tiles_[tile->id()] = tile.get(); | 893 tiles_[tile->id()] = tile.get(); |
769 image_decode_controller_.AddLayerUsedCount(tile->layer_id()); | 894 image_decode_controller_.AddLayerUsedCount(tile->layer_id()); |
770 return tile; | 895 return tile; |
771 } | 896 } |
772 | 897 |
773 void TileManager::SetTileTaskRunnerForTesting( | 898 void TileManager::SetTileTaskRunnerForTesting( |
774 TileTaskRunner* tile_task_runner) { | 899 TileTaskRunner* tile_task_runner) { |
775 tile_task_runner_ = tile_task_runner; | 900 tile_task_runner_ = tile_task_runner; |
776 tile_task_runner_->SetClient(this); | |
777 } | 901 } |
778 | 902 |
779 bool TileManager::AreRequiredTilesReadyToDraw( | 903 bool TileManager::AreRequiredTilesReadyToDraw( |
780 RasterTilePriorityQueue::Type type) const { | 904 RasterTilePriorityQueue::Type type) const { |
781 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( | 905 scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
782 client_->BuildRasterQueue(global_state_.tree_priority, type)); | 906 client_->BuildRasterQueue(global_state_.tree_priority, type)); |
783 // It is insufficient to check whether the raster queue we constructed is | 907 // 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 | 908 // 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 | 909 // 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 | 910 // 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 Loading... |
940 } | 1064 } |
941 | 1065 |
942 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { | 1066 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { |
943 return tile_task_runner_->GetResourceFormat(!tile->is_opaque()); | 1067 return tile_task_runner_->GetResourceFormat(!tile->is_opaque()); |
944 } | 1068 } |
945 | 1069 |
946 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const { | 1070 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const { |
947 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque()); | 1071 return tile_task_runner_->GetResourceRequiresSwizzle(!tile->is_opaque()); |
948 } | 1072 } |
949 | 1073 |
950 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { | 1074 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| 1075 TileManager::ScheduledTasksStateAsValue() const { |
| 1076 scoped_refptr<base::trace_event::TracedValue> state = |
| 1077 new base::trace_event::TracedValue(); |
| 1078 |
| 1079 state->BeginDictionary("tasks_pending"); |
| 1080 state->SetBoolean("ready_to_activate", signals_.ready_to_activate); |
| 1081 state->SetBoolean("ready_to_draw", signals_.ready_to_draw); |
| 1082 state->SetBoolean("all_tile_tasks_completed", |
| 1083 signals_.all_tile_tasks_completed); |
| 1084 state->EndDictionary(); |
| 1085 return state; |
951 } | 1086 } |
952 | 1087 |
| 1088 // Utility function that can be used to create a "Task set finished" task that |
| 1089 // posts |callback| to |task_runner| when run. |
| 1090 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1091 void (TileManager::*callback)()) { |
| 1092 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1093 task_runner_.get(), |
| 1094 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1095 } |
| 1096 |
| 1097 TileManager::MemoryUsage::MemoryUsage() |
| 1098 : memory_bytes_(0), resource_count_(0) {} |
| 1099 |
953 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1100 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
954 size_t resource_count) | 1101 size_t resource_count) |
955 : memory_bytes_(static_cast<int64>(memory_bytes)), | 1102 : memory_bytes_(static_cast<int64>(memory_bytes)), |
956 resource_count_(static_cast<int>(resource_count)) { | 1103 resource_count_(static_cast<int>(resource_count)) { |
957 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1104 // 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 | 1105 // the inputs are typically size_t. However, during the course of usage (in |
959 // particular operator-=) can cause internal values to become negative. Thus, | 1106 // particular operator-=) can cause internal values to become negative. Thus, |
960 // member variables are signed. | 1107 // member variables are signed. |
961 DCHECK_LE(memory_bytes, | 1108 DCHECK_LE(memory_bytes, |
962 static_cast<size_t>(std::numeric_limits<int64>::max())); | 1109 static_cast<size_t>(std::numeric_limits<int64>::max())); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 void TileManager::Signals::reset() { | 1164 void TileManager::Signals::reset() { |
1018 ready_to_activate = false; | 1165 ready_to_activate = false; |
1019 did_notify_ready_to_activate = false; | 1166 did_notify_ready_to_activate = false; |
1020 ready_to_draw = false; | 1167 ready_to_draw = false; |
1021 did_notify_ready_to_draw = false; | 1168 did_notify_ready_to_draw = false; |
1022 all_tile_tasks_completed = false; | 1169 all_tile_tasks_completed = false; |
1023 did_notify_all_tile_tasks_completed = false; | 1170 did_notify_all_tile_tasks_completed = false; |
1024 } | 1171 } |
1025 | 1172 |
1026 } // namespace cc | 1173 } // namespace cc |
OLD | NEW |