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

Side by Side Diff: cc/tile_manager.cc

Issue 12088110: HACK: Rasterize tiles immediately if there are only a few of them (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months 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 | Annotate | Revision Log
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698