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/resources/tile_manager.h" | 5 #include "cc/resources/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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 357 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
358 tile_task_runner_->CheckForCompletedTasks(); | 358 tile_task_runner_->CheckForCompletedTasks(); |
359 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 359 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
360 } | 360 } |
361 | 361 |
362 FreeResourcesForReleasedTiles(); | 362 FreeResourcesForReleasedTiles(); |
363 CleanUpReleasedTiles(); | 363 CleanUpReleasedTiles(); |
364 | 364 |
365 TileVector tiles_that_need_to_be_rasterized; | 365 TileVector tiles_that_need_to_be_rasterized; |
366 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | 366 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
367 scheduled_raster_task_limit_, false); | 367 scheduled_raster_task_limit_); |
368 | 368 |
369 // Schedule tile tasks. | 369 // Schedule tile tasks. |
370 ScheduleTasks(tiles_that_need_to_be_rasterized); | 370 ScheduleTasks(tiles_that_need_to_be_rasterized); |
371 | 371 |
372 did_notify_ready_to_activate_ = false; | 372 did_notify_ready_to_activate_ = false; |
373 did_notify_ready_to_draw_ = false; | 373 did_notify_ready_to_draw_ = false; |
374 } else { | 374 } else { |
375 if (global_state_.hard_memory_limit_in_bytes == 0) { | 375 if (global_state_.hard_memory_limit_in_bytes == 0) { |
376 TileVector tiles_that_need_to_be_rasterized; | 376 TileVector tiles_that_need_to_be_rasterized; |
377 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | 377 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
378 scheduled_raster_task_limit_, false); | 378 scheduled_raster_task_limit_); |
379 DCHECK(tiles_that_need_to_be_rasterized.empty()); | 379 DCHECK(tiles_that_need_to_be_rasterized.empty()); |
380 } | 380 } |
381 | 381 |
382 did_notify_ready_to_activate_ = false; | 382 did_notify_ready_to_activate_ = false; |
383 did_notify_ready_to_draw_ = false; | 383 did_notify_ready_to_draw_ = false; |
384 ready_to_activate_notifier_.Schedule(); | 384 ready_to_activate_notifier_.Schedule(); |
385 ready_to_draw_notifier_.Schedule(); | 385 ready_to_draw_notifier_.Schedule(); |
386 } | 386 } |
387 | 387 |
388 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 388 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
(...skipping 11 matching lines...) Expand all Loading... |
400 DCHECK(rasterizer_->GetPrepareTilesMode() != | 400 DCHECK(rasterizer_->GetPrepareTilesMode() != |
401 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); | 401 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES); |
402 | 402 |
403 global_state_ = state; | 403 global_state_ = state; |
404 | 404 |
405 FreeResourcesForReleasedTiles(); | 405 FreeResourcesForReleasedTiles(); |
406 CleanUpReleasedTiles(); | 406 CleanUpReleasedTiles(); |
407 | 407 |
408 TileVector tiles_that_need_to_be_rasterized; | 408 TileVector tiles_that_need_to_be_rasterized; |
409 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | 409 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
410 std::numeric_limits<size_t>::max(), true); | 410 std::numeric_limits<size_t>::max()); |
411 | 411 |
412 // We must reduce the amount of unused resources before calling | 412 // We must reduce the amount of unused resources before calling |
413 // RunTasks to prevent usage from rising above limits. | 413 // RunTasks to prevent usage from rising above limits. |
414 resource_pool_->ReduceResourceUsage(); | 414 resource_pool_->ReduceResourceUsage(); |
415 | 415 |
416 // Run and complete all raster task synchronously. | 416 // Run and complete all raster task synchronously. |
417 rasterizer_->RasterizeTiles( | 417 rasterizer_->RasterizeTiles( |
418 tiles_that_need_to_be_rasterized, resource_pool_, | 418 tiles_that_need_to_be_rasterized, resource_pool_, |
419 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); | 419 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); |
420 | 420 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 case ALLOW_ANYTHING: | 548 case ALLOW_ANYTHING: |
549 return priority.distance_to_visible == | 549 return priority.distance_to_visible == |
550 std::numeric_limits<float>::infinity(); | 550 std::numeric_limits<float>::infinity(); |
551 } | 551 } |
552 NOTREACHED(); | 552 NOTREACHED(); |
553 return true; | 553 return true; |
554 } | 554 } |
555 | 555 |
556 void TileManager::AssignGpuMemoryToTiles( | 556 void TileManager::AssignGpuMemoryToTiles( |
557 TileVector* tiles_that_need_to_be_rasterized, | 557 TileVector* tiles_that_need_to_be_rasterized, |
558 size_t scheduled_raster_task_limit, | 558 size_t scheduled_raster_task_limit) { |
559 bool required_for_draw_only) { | |
560 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); | 559 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); |
561 | 560 |
562 // Maintain the list of released resources that can potentially be re-used | 561 // Maintain the list of released resources that can potentially be re-used |
563 // or deleted. | 562 // or deleted. |
564 // If this operation becomes expensive too, only do this after some | 563 // If this operation becomes expensive too, only do this after some |
565 // resource(s) was returned. Note that in that case, one also need to | 564 // resource(s) was returned. Note that in that case, one also need to |
566 // invalidate when releasing some resource from the pool. | 565 // invalidate when releasing some resource from the pool. |
567 resource_pool_->CheckBusyResources(false); | 566 resource_pool_->CheckBusyResources(false); |
568 | 567 |
569 // Now give memory out to the tiles until we're out, and build | 568 // Now give memory out to the tiles until we're out, and build |
570 // the needs-to-be-rasterized queue. | 569 // the needs-to-be-rasterized queue. |
571 unsigned schedule_priority = 1u; | 570 unsigned schedule_priority = 1u; |
572 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; | 571 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; |
573 bool had_enough_memory_to_schedule_tiles_needed_now = true; | 572 bool had_enough_memory_to_schedule_tiles_needed_now = true; |
574 | 573 |
575 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, | 574 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, |
576 global_state_.num_resources_limit); | 575 global_state_.num_resources_limit); |
577 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, | 576 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, |
578 global_state_.num_resources_limit); | 577 global_state_.num_resources_limit); |
579 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), | 578 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), |
580 resource_pool_->acquired_resource_count()); | 579 resource_pool_->acquired_resource_count()); |
581 | 580 |
582 eviction_priority_queue_is_up_to_date_ = false; | 581 eviction_priority_queue_is_up_to_date_ = false; |
583 client_->BuildRasterQueue(&raster_priority_queue_, | 582 client_->BuildRasterQueue(&raster_priority_queue_, |
584 global_state_.tree_priority); | 583 global_state_.tree_priority); |
585 | 584 |
586 while (!raster_priority_queue_.IsEmpty()) { | 585 while (!raster_priority_queue_.IsEmpty()) { |
587 Tile* tile = raster_priority_queue_.Top(); | 586 Tile* tile = raster_priority_queue_.Top(); |
588 | |
589 // TODO(vmpstr): Remove this when the iterator returns the correct tiles | |
590 // to draw for GPU rasterization. | |
591 if (required_for_draw_only) { | |
592 if (!tile->required_for_draw()) { | |
593 raster_priority_queue_.Pop(); | |
594 continue; | |
595 } | |
596 } | |
597 TilePriority priority = tile->combined_priority(); | 587 TilePriority priority = tile->combined_priority(); |
598 | 588 |
599 if (TilePriorityViolatesMemoryPolicy(priority)) { | 589 if (TilePriorityViolatesMemoryPolicy(priority)) { |
600 TRACE_EVENT_INSTANT0( | 590 TRACE_EVENT_INSTANT0( |
601 "cc", "TileManager::AssignGpuMemory tile violates memory policy", | 591 "cc", "TileManager::AssignGpuMemory tile violates memory policy", |
602 TRACE_EVENT_SCOPE_THREAD); | 592 TRACE_EVENT_SCOPE_THREAD); |
603 break; | 593 break; |
604 } | 594 } |
605 | 595 |
606 // We won't be able to schedule this tile, so break out early. | 596 // We won't be able to schedule this tile, so break out early. |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 } | 934 } |
945 | 935 |
946 void TileManager::CheckIfMoreTilesNeedToBePrepared() { | 936 void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
947 tile_task_runner_->CheckForCompletedTasks(); | 937 tile_task_runner_->CheckForCompletedTasks(); |
948 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 938 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
949 | 939 |
950 // When OOM, keep re-assigning memory until we reach a steady state | 940 // When OOM, keep re-assigning memory until we reach a steady state |
951 // where top-priority tiles are initialized. | 941 // where top-priority tiles are initialized. |
952 TileVector tiles_that_need_to_be_rasterized; | 942 TileVector tiles_that_need_to_be_rasterized; |
953 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, | 943 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized, |
954 scheduled_raster_task_limit_, false); | 944 scheduled_raster_task_limit_); |
955 | 945 |
956 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 946 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
957 // steady memory state. Keep scheduling tasks until we reach this state. | 947 // steady memory state. Keep scheduling tasks until we reach this state. |
958 if (!tiles_that_need_to_be_rasterized.empty()) { | 948 if (!tiles_that_need_to_be_rasterized.empty()) { |
959 ScheduleTasks(tiles_that_need_to_be_rasterized); | 949 ScheduleTasks(tiles_that_need_to_be_rasterized); |
960 return; | 950 return; |
961 } | 951 } |
962 | 952 |
963 FreeResourcesForReleasedTiles(); | 953 FreeResourcesForReleasedTiles(); |
964 | 954 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 result -= other; | 1040 result -= other; |
1051 return result; | 1041 return result; |
1052 } | 1042 } |
1053 | 1043 |
1054 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { | 1044 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { |
1055 return memory_bytes_ > limit.memory_bytes_ || | 1045 return memory_bytes_ > limit.memory_bytes_ || |
1056 resource_count_ > limit.resource_count_; | 1046 resource_count_ > limit.resource_count_; |
1057 } | 1047 } |
1058 | 1048 |
1059 } // namespace cc | 1049 } // namespace cc |
OLD | NEW |