| 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/tile_manager.h" | 5 #include "cc/tile_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 // Because tiles in the image decoding list have higher priorities, we | 527 // Because tiles in the image decoding list have higher priorities, we |
| 528 // need to process those tiles first before we start to handle the tiles | 528 // need to process those tiles first before we start to handle the tiles |
| 529 // in the need_to_be_rasterized queue. | 529 // in the need_to_be_rasterized queue. |
| 530 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 530 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 531 it != tiles_with_image_decoding_tasks_.end(); ) { | 531 it != tiles_with_image_decoding_tasks_.end(); ) { |
| 532 DispatchImageDecodeTasksForTile(*it); | 532 DispatchImageDecodeTasksForTile(*it); |
| 533 ManagedTileState& managed_state = (*it)->managed_state(); | 533 ManagedTileState& managed_state = (*it)->managed_state(); |
| 534 if (managed_state.pending_pixel_refs.empty()) { | 534 if (managed_state.pending_pixel_refs.empty()) { |
| 535 if (!CanDispatchRasterTask(*it)) | 535 if (!CanDispatchRasterTask(*it)) |
| 536 return; | 536 return; |
| 537 DispatchOneRasterTask(*it); | 537 DispatchOneRasterTask(*it, false); |
| 538 tiles_with_image_decoding_tasks_.erase(it++); | 538 tiles_with_image_decoding_tasks_.erase(it++); |
| 539 } else { | 539 } else { |
| 540 ++it; | 540 ++it; |
| 541 } | 541 } |
| 542 } | 542 } |
| 543 | 543 |
| 544 // Process all tiles in the need_to_be_rasterized queue. If a tile has | 544 // Process all tiles in the need_to_be_rasterized queue. If a tile has |
| 545 // image decoding tasks, put it to the back of the image decoding list. | 545 // image decoding tasks, put it to the back of the image decoding list. |
| 546 while (!tiles_that_need_to_be_rasterized_.empty()) { | 546 while (!tiles_that_need_to_be_rasterized_.empty()) { |
| 547 Tile* tile = tiles_that_need_to_be_rasterized_.back(); | 547 Tile* tile = tiles_that_need_to_be_rasterized_.back(); |
| 548 DispatchImageDecodeTasksForTile(tile); | 548 DispatchImageDecodeTasksForTile(tile); |
| 549 ManagedTileState& managed_state = tile->managed_state(); | 549 ManagedTileState& managed_state = tile->managed_state(); |
| 550 if (!managed_state.pending_pixel_refs.empty()) { | 550 if (!managed_state.pending_pixel_refs.empty()) { |
| 551 tiles_with_image_decoding_tasks_.push_back(tile); | 551 tiles_with_image_decoding_tasks_.push_back(tile); |
| 552 } else { | 552 } else { |
| 553 if (!CanDispatchRasterTask(tile)) | 553 if (!CanDispatchRasterTask(tile)) |
| 554 return; | 554 return; |
| 555 DispatchOneRasterTask(tile); | 555 bool immediate = |
| 556 tiles_that_need_to_be_rasterized_.size() < 5; |
| 557 DispatchOneRasterTask(tile, immediate); |
| 556 } | 558 } |
| 557 tiles_that_need_to_be_rasterized_.pop_back(); | 559 tiles_that_need_to_be_rasterized_.pop_back(); |
| 558 } | 560 } |
| 559 } | 561 } |
| 560 | 562 |
| 561 void TileManager::GatherPixelRefsForTile(Tile* tile) { | 563 void TileManager::GatherPixelRefsForTile(Tile* tile) { |
| 562 TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForTile"); | 564 TRACE_EVENT0("cc", "TileManager::GatherPixelRefsForTile"); |
| 563 ManagedTileState& managed_state = tile->managed_state(); | 565 ManagedTileState& managed_state = tile->managed_state(); |
| 564 if (managed_state.need_to_gather_pixel_refs) { | 566 if (managed_state.need_to_gather_pixel_refs) { |
| 565 base::TimeTicks gather_begin_time = base::TimeTicks::Now(); | 567 base::TimeTicks gather_begin_time = base::TimeTicks::Now(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { | 630 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
| 629 pixel_refs.erase(pixel_it); | 631 pixel_refs.erase(pixel_it); |
| 630 break; | 632 break; |
| 631 } | 633 } |
| 632 } | 634 } |
| 633 } | 635 } |
| 634 | 636 |
| 635 DispatchMoreTasks(); | 637 DispatchMoreTasks(); |
| 636 } | 638 } |
| 637 | 639 |
| 638 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { | 640 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile, |
| 641 bool immediate) { |
| 639 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); | 642 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
| 640 ManagedTileState& managed_tile_state = tile->managed_state(); | 643 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 641 DCHECK(managed_tile_state.can_use_gpu_memory); | 644 DCHECK(managed_tile_state.can_use_gpu_memory); |
| 642 scoped_ptr<ResourcePool::Resource> resource = | 645 scoped_ptr<ResourcePool::Resource> resource = |
| 643 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 646 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
| 644 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); | 647 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
| 645 | 648 |
| 646 managed_tile_state.resource_is_being_initialized = true; | 649 managed_tile_state.resource_is_being_initialized = true; |
| 647 managed_tile_state.can_be_freed = false; | 650 managed_tile_state.can_be_freed = false; |
| 648 | 651 |
| 649 DidTileRasterStateChange(tile, RASTER_STATE); | 652 DidTileRasterStateChange(tile, RASTER_STATE); |
| 650 | 653 |
| 651 ResourceProvider::ResourceId resource_id = resource->id(); | 654 ResourceProvider::ResourceId resource_id = resource->id(); |
| 652 | 655 |
| 656 if (immediate) { |
| 657 RunRasterTask(resource_pool_->resource_provider()->mapPixelBuffer( |
| 658 resource_id), |
| 659 tile->content_rect_, |
| 660 tile->contents_scale(), |
| 661 tile->picture_pile(), |
| 662 &rendering_stats_); |
| 663 TileManager::OnRasterTaskCompleted(tile, resource.Pass(), |
| 664 manage_tiles_call_count_, |
| 665 false); |
| 666 return; |
| 667 } |
| 668 |
| 653 raster_worker_pool_->PostRasterTaskAndReply( | 669 raster_worker_pool_->PostRasterTaskAndReply( |
| 654 tile->picture_pile(), | 670 tile->picture_pile(), |
| 655 base::Bind(&TileManager::RunRasterTask, | 671 base::Bind(&TileManager::RunRasterTask, |
| 656 resource_pool_->resource_provider()->mapPixelBuffer( | 672 resource_pool_->resource_provider()->mapPixelBuffer( |
| 657 resource_id), | 673 resource_id), |
| 658 tile->content_rect_, | 674 tile->content_rect_, |
| 659 tile->contents_scale()), | 675 tile->contents_scale()), |
| 660 base::Bind(&TileManager::OnRasterTaskCompleted, | 676 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 661 base::Unretained(this), | 677 base::Unretained(this), |
| 662 tile, | 678 tile, |
| 663 base::Passed(&resource), | 679 base::Passed(&resource), |
| 664 manage_tiles_call_count_)); | 680 manage_tiles_call_count_, |
| 681 true)); |
| 665 } | 682 } |
| 666 | 683 |
| 667 void TileManager::OnRasterTaskCompleted( | 684 void TileManager::OnRasterTaskCompleted( |
| 668 scoped_refptr<Tile> tile, | 685 scoped_refptr<Tile> tile, |
| 669 scoped_ptr<ResourcePool::Resource> resource, | 686 scoped_ptr<ResourcePool::Resource> resource, |
| 670 int manage_tiles_call_count_when_dispatched) { | 687 int manage_tiles_call_count_when_dispatched, |
| 688 bool dispatch_more) { |
| 671 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); | 689 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); |
| 672 | 690 |
| 673 // Release raster resources. | 691 // Release raster resources. |
| 674 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); | 692 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
| 675 | 693 |
| 676 ManagedTileState& managed_tile_state = tile->managed_state(); | 694 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 677 managed_tile_state.can_be_freed = true; | 695 managed_tile_state.can_be_freed = true; |
| 678 | 696 |
| 679 // Tile can be freed after the completion of the raster task. Call | 697 // Tile can be freed after the completion of the raster task. Call |
| 680 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 698 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| (...skipping 22 matching lines...) Expand all Loading... |
| 703 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); | 721 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); |
| 704 DidTileRasterStateChange(tile, SET_PIXELS_STATE); | 722 DidTileRasterStateChange(tile, SET_PIXELS_STATE); |
| 705 tiles_with_pending_set_pixels_.push(tile); | 723 tiles_with_pending_set_pixels_.push(tile); |
| 706 } else { | 724 } else { |
| 707 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 725 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| 708 resource_pool_->ReleaseResource(resource.Pass()); | 726 resource_pool_->ReleaseResource(resource.Pass()); |
| 709 managed_tile_state.resource_is_being_initialized = false; | 727 managed_tile_state.resource_is_being_initialized = false; |
| 710 DidTileRasterStateChange(tile, IDLE_STATE); | 728 DidTileRasterStateChange(tile, IDLE_STATE); |
| 711 } | 729 } |
| 712 | 730 |
| 713 DispatchMoreTasks(); | 731 if (dispatch_more) |
| 732 DispatchMoreTasks(); |
| 714 } | 733 } |
| 715 | 734 |
| 716 void TileManager::DidFinishTileInitialization(Tile* tile) { | 735 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 717 ManagedTileState& managed_tile_state = tile->managed_state(); | 736 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 718 DCHECK(managed_tile_state.resource); | 737 DCHECK(managed_tile_state.resource); |
| 719 managed_tile_state.resource_is_being_initialized = false; | 738 managed_tile_state.resource_is_being_initialized = false; |
| 720 managed_tile_state.can_be_freed = true; | 739 managed_tile_state.can_be_freed = true; |
| 721 } | 740 } |
| 722 | 741 |
| 723 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { | 742 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 RenderingStats* stats) { | 792 RenderingStats* stats) { |
| 774 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); | 793 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |
| 775 base::TimeTicks decode_begin_time = base::TimeTicks::Now(); | 794 base::TimeTicks decode_begin_time = base::TimeTicks::Now(); |
| 776 pixel_ref->Decode(); | 795 pixel_ref->Decode(); |
| 777 stats->totalDeferredImageDecodeCount++; | 796 stats->totalDeferredImageDecodeCount++; |
| 778 stats->totalDeferredImageDecodeTime += | 797 stats->totalDeferredImageDecodeTime += |
| 779 base::TimeTicks::Now() - decode_begin_time; | 798 base::TimeTicks::Now() - decode_begin_time; |
| 780 } | 799 } |
| 781 | 800 |
| 782 } // namespace cc | 801 } // namespace cc |
| OLD | NEW |