Chromium Code Reviews| 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 12 matching lines...) Expand all Loading... | |
| 23 | 23 |
| 24 // If we raster too fast we become upload bound, and pending | 24 // If we raster too fast we become upload bound, and pending |
| 25 // uploads consume memory. For maximum upload throughput, we would | 25 // uploads consume memory. For maximum upload throughput, we would |
| 26 // want to allow for upload_throughput * pipeline_time of pending | 26 // want to allow for upload_throughput * pipeline_time of pending |
| 27 // uploads, after which we are just wasting memory. Since we don't | 27 // uploads, after which we are just wasting memory. Since we don't |
| 28 // know our upload throughput yet, this just caps our memory usage. | 28 // know our upload throughput yet, this just caps our memory usage. |
| 29 #if defined(OS_ANDROID) | 29 #if defined(OS_ANDROID) |
| 30 // For reference, the Nexus10 can upload 1MB in about 2.5ms. | 30 // For reference, the Nexus10 can upload 1MB in about 2.5ms. |
| 31 // Assuming a three frame deep pipeline this implies ~20MB. | 31 // Assuming a three frame deep pipeline this implies ~20MB. |
| 32 const int kMaxPendingUploadBytes = 20 * 1024 * 1024; | 32 const int kMaxPendingUploadBytes = 20 * 1024 * 1024; |
| 33 const int kMaxPendingRasterBytes = 2 * 1024 * 1024; | |
| 33 #else | 34 #else |
| 34 const int kMaxPendingUploadBytes = 100 * 1024 * 1024; | 35 const int kMaxPendingUploadBytes = 100 * 1024 * 1024; |
| 36 const int kMaxPendingRasterBytes = 10 * 1024 * 1024; | |
| 35 #endif | 37 #endif |
| 36 | 38 |
| 37 // Determine bin based on three categories of tiles: things we need now, | 39 // Determine bin based on three categories of tiles: things we need now, |
| 38 // things we need soon, and eventually. | 40 // things we need soon, and eventually. |
| 39 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { | 41 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { |
| 40 if (!prio.is_live) | 42 if (!prio.is_live) |
| 41 return NEVER_BIN; | 43 return NEVER_BIN; |
| 42 | 44 |
| 43 // The amount of time for which we want to have prepainting coverage. | 45 // The amount of time for which we want to have prepainting coverage. |
| 44 const double prepainting_window_time_seconds = 1.0; | 46 const double prepainting_window_time_seconds = 1.0; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 115 TileManager::TileManager( | 117 TileManager::TileManager( |
| 116 TileManagerClient* client, | 118 TileManagerClient* client, |
| 117 ResourceProvider* resource_provider, | 119 ResourceProvider* resource_provider, |
| 118 size_t num_raster_threads, | 120 size_t num_raster_threads, |
| 119 bool use_cheapness_estimator) | 121 bool use_cheapness_estimator) |
| 120 : client_(client), | 122 : client_(client), |
| 121 resource_pool_(ResourcePool::Create(resource_provider)), | 123 resource_pool_(ResourcePool::Create(resource_provider)), |
| 122 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads)), | 124 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads)), |
| 123 manage_tiles_pending_(false), | 125 manage_tiles_pending_(false), |
| 124 manage_tiles_call_count_(0), | 126 manage_tiles_call_count_(0), |
| 125 bytes_pending_set_pixels_(0), | |
| 126 ever_exceeded_memory_budget_(false), | 127 ever_exceeded_memory_budget_(false), |
| 128 bytes_pending_raster_(0), | |
| 129 bytes_pending_upload_(0), | |
| 127 record_rendering_stats_(false), | 130 record_rendering_stats_(false), |
| 128 use_cheapness_estimator_(use_cheapness_estimator) { | 131 use_cheapness_estimator_(use_cheapness_estimator) { |
| 129 for (int i = 0; i < NUM_STATES; ++i) { | 132 for (int i = 0; i < NUM_STATES; ++i) { |
| 130 for (int j = 0; j < NUM_TREES; ++j) { | 133 for (int j = 0; j < NUM_TREES; ++j) { |
| 131 for (int k = 0; k < NUM_BINS; ++k) | 134 for (int k = 0; k < NUM_BINS; ++k) |
| 132 raster_state_count_[i][j][k] = 0; | 135 raster_state_count_[i][j][k] = 0; |
| 133 } | 136 } |
| 134 } | 137 } |
| 135 } | 138 } |
| 136 | 139 |
| 137 TileManager::~TileManager() { | 140 TileManager::~TileManager() { |
| 138 // Reset global state and manage. This should cause | 141 // Reset global state and manage. This should cause |
| 139 // our memory usage to drop to zero. | 142 // our memory usage to drop to zero. |
| 140 global_state_ = GlobalStateThatImpactsTilePriority(); | 143 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 141 AssignGpuMemoryToTiles(); | 144 AssignGpuMemoryToTiles(); |
| 142 // This should finish all pending tasks and release any uninitialized | 145 // This should finish all pending tasks and release any uninitialized |
| 143 // resources. | 146 // resources. |
| 144 raster_worker_pool_.reset(); | 147 raster_worker_pool_.reset(); |
| 145 CheckForCompletedTileUploads(); | 148 CheckForCompletedTileUploads(); |
| 146 DCHECK(tiles_with_pending_set_pixels_.size() == 0); | 149 DCHECK(tiles_with_pending_upload_.size() == 0); |
| 147 DCHECK(tiles_.size() == 0); | 150 DCHECK(tiles_.size() == 0); |
| 148 } | 151 } |
| 149 | 152 |
| 150 void TileManager::SetGlobalState( | 153 void TileManager::SetGlobalState( |
| 151 const GlobalStateThatImpactsTilePriority& global_state) { | 154 const GlobalStateThatImpactsTilePriority& global_state) { |
| 152 global_state_ = global_state; | 155 global_state_ = global_state; |
| 153 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes); | 156 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes); |
| 154 ScheduleManageTiles(); | 157 ScheduleManageTiles(); |
| 155 } | 158 } |
| 156 | 159 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 | 340 |
| 338 // Assign gpu memory and determine what tiles need to be rasterized. | 341 // Assign gpu memory and determine what tiles need to be rasterized. |
| 339 AssignGpuMemoryToTiles(); | 342 AssignGpuMemoryToTiles(); |
| 340 | 343 |
| 341 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", ValueToString(AsValue())); | 344 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", ValueToString(AsValue())); |
| 342 | 345 |
| 343 // Finally, kick the rasterizer. | 346 // Finally, kick the rasterizer. |
| 344 DispatchMoreTasks(); | 347 DispatchMoreTasks(); |
| 345 } | 348 } |
| 346 | 349 |
| 350 void TileManager::CheckForCompletedRasterTasks() { | |
| 351 int pending_upload_count = tiles_with_pending_upload_.size(); | |
| 352 | |
| 353 // Check for completed tasks and dispatch replies. | |
| 354 raster_worker_pool_->CheckForCompletedTasks(); | |
| 355 | |
| 356 // Flush if we began new uploads. | |
| 357 if (tiles_with_pending_upload_.size() != pending_upload_count) | |
| 358 resource_pool_->resource_provider()->shallowFlushIfSupported(); | |
| 359 | |
| 360 DispatchMoreTasks(); | |
| 361 | |
| 362 // Schedule another check if we still have pending raster tasks. | |
| 363 if (bytes_pending_raster_) | |
| 364 client_->ScheduleCheckForCompletedRasterTasks(); | |
| 365 } | |
| 366 | |
| 347 void TileManager::CheckForCompletedTileUploads() { | 367 void TileManager::CheckForCompletedTileUploads() { |
| 348 while (!tiles_with_pending_set_pixels_.empty()) { | 368 while (!tiles_with_pending_upload_.empty()) { |
| 349 Tile* tile = tiles_with_pending_set_pixels_.front(); | 369 Tile* tile = tiles_with_pending_upload_.front(); |
| 350 DCHECK(tile->managed_state().resource); | 370 DCHECK(tile->managed_state().resource); |
| 351 | 371 |
| 352 // Set pixel tasks complete in the order they are posted. | 372 // Set pixel tasks complete in the order they are posted. |
| 353 if (!resource_pool_->resource_provider()->didSetPixelsComplete( | 373 if (!resource_pool_->resource_provider()->didSetPixelsComplete( |
| 354 tile->managed_state().resource->id())) { | 374 tile->managed_state().resource->id())) { |
| 355 break; | 375 break; |
| 356 } | 376 } |
| 357 | 377 |
| 358 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && | 378 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0 && |
| 359 tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) | 379 tile->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) |
| 360 client_->DidUploadVisibleHighResolutionTile(); | 380 client_->DidUploadVisibleHighResolutionTile(); |
| 361 | 381 |
| 362 // It's now safe to release the pixel buffer. | 382 // It's now safe to release the pixel buffer. |
| 363 resource_pool_->resource_provider()->releasePixelBuffer( | 383 resource_pool_->resource_provider()->releasePixelBuffer( |
| 364 tile->managed_state().resource->id()); | 384 tile->managed_state().resource->id()); |
| 365 | 385 |
| 366 DidFinishTileInitialization(tile); | 386 DidFinishTileInitialization(tile); |
| 367 | 387 |
| 368 bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated(); | 388 bytes_pending_upload_ -= tile->bytes_consumed_if_allocated(); |
| 369 DidTileRasterStateChange(tile, IDLE_STATE); | 389 DidTileRasterStateChange(tile, IDLE_STATE); |
| 370 tiles_with_pending_set_pixels_.pop(); | 390 tiles_with_pending_upload_.pop(); |
| 371 } | 391 } |
| 372 | 392 |
| 373 DispatchMoreTasks(); | 393 DispatchMoreTasks(); |
| 374 } | 394 } |
| 375 | 395 |
| 376 void TileManager::GetMemoryStats( | 396 void TileManager::GetMemoryStats( |
| 377 size_t* memoryRequiredBytes, | 397 size_t* memoryRequiredBytes, |
| 378 size_t* memoryNiceToHaveBytes, | 398 size_t* memoryNiceToHaveBytes, |
| 379 size_t* memoryUsedBytes) const { | 399 size_t* memoryUsedBytes) const { |
| 380 *memoryRequiredBytes = 0; | 400 *memoryRequiredBytes = 0; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 | 459 |
| 440 bool TileManager::HasPendingWorkScheduled(WhichTree tree) const { | 460 bool TileManager::HasPendingWorkScheduled(WhichTree tree) const { |
| 441 // Always true when ManageTiles() call is pending. | 461 // Always true when ManageTiles() call is pending. |
| 442 if (manage_tiles_pending_) | 462 if (manage_tiles_pending_) |
| 443 return true; | 463 return true; |
| 444 | 464 |
| 445 for (int i = 0; i < NUM_STATES; ++i) { | 465 for (int i = 0; i < NUM_STATES; ++i) { |
| 446 switch (i) { | 466 switch (i) { |
| 447 case WAITING_FOR_RASTER_STATE: | 467 case WAITING_FOR_RASTER_STATE: |
| 448 case RASTER_STATE: | 468 case RASTER_STATE: |
| 449 case SET_PIXELS_STATE: | 469 case UPLOAD_STATE: |
| 450 for (int j = 0; j < NEVER_BIN; ++j) { | 470 for (int j = 0; j < NEVER_BIN; ++j) { |
| 451 if (raster_state_count_[i][tree][j]) | 471 if (raster_state_count_[i][tree][j]) |
| 452 return true; | 472 return true; |
| 453 } | 473 } |
| 454 break; | 474 break; |
| 455 case IDLE_STATE: | 475 case IDLE_STATE: |
| 456 break; | 476 break; |
| 457 default: | 477 default: |
| 458 NOTREACHED(); | 478 NOTREACHED(); |
| 459 } | 479 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 546 } | 566 } |
| 547 | 567 |
| 548 void TileManager::FreeResourcesForTile(Tile* tile) { | 568 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 549 ManagedTileState& managed_tile_state = tile->managed_state(); | 569 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 550 DCHECK(managed_tile_state.can_be_freed); | 570 DCHECK(managed_tile_state.can_be_freed); |
| 551 if (managed_tile_state.resource) | 571 if (managed_tile_state.resource) |
| 552 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); | 572 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); |
| 553 } | 573 } |
| 554 | 574 |
| 555 bool TileManager::CanDispatchRasterTask(Tile* tile) { | 575 bool TileManager::CanDispatchRasterTask(Tile* tile) { |
| 556 if (raster_worker_pool_->IsBusy()) | 576 size_t new_raster_bytes_pending = bytes_pending_raster_; |
| 577 new_raster_bytes_pending += tile->bytes_consumed_if_allocated(); | |
| 578 if (new_raster_bytes_pending > kMaxPendingRasterBytes) | |
| 557 return false; | 579 return false; |
| 558 size_t new_bytes_pending = bytes_pending_set_pixels_; | 580 |
| 559 new_bytes_pending += tile->bytes_consumed_if_allocated(); | 581 size_t new_upload_bytes_pending = bytes_pending_upload_; |
|
brianderson
2013/02/12 01:44:31
Shouldn't this be:
size_t new_upload_bytes_pending
reveman
2013/02/12 02:29:52
makes sense.
| |
| 560 return new_bytes_pending <= kMaxPendingUploadBytes; | 582 new_upload_bytes_pending += tile->bytes_consumed_if_allocated(); |
| 583 if (new_upload_bytes_pending > kMaxPendingUploadBytes) | |
| 584 return false; | |
| 585 | |
| 586 return true; | |
| 561 } | 587 } |
| 562 | 588 |
| 563 void TileManager::DispatchMoreTasks() { | 589 void TileManager::DispatchMoreTasks() { |
| 564 // Because tiles in the image decoding list have higher priorities, we | 590 // Because tiles in the image decoding list have higher priorities, we |
| 565 // need to process those tiles first before we start to handle the tiles | 591 // need to process those tiles first before we start to handle the tiles |
| 566 // in the need_to_be_rasterized queue. | 592 // in the need_to_be_rasterized queue. |
| 567 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 593 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 568 it != tiles_with_image_decoding_tasks_.end(); ) { | 594 it != tiles_with_image_decoding_tasks_.end(); ) { |
| 569 DispatchImageDecodeTasksForTile(*it); | 595 DispatchImageDecodeTasksForTile(*it); |
| 570 ManagedTileState& managed_state = (*it)->managed_state(); | 596 ManagedTileState& managed_state = (*it)->managed_state(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 624 if (pending_decode_tasks_.end() != pending_decode_tasks_.find( | 650 if (pending_decode_tasks_.end() != pending_decode_tasks_.find( |
| 625 (*it)->getGenerationID())) { | 651 (*it)->getGenerationID())) { |
| 626 ++it; | 652 ++it; |
| 627 continue; | 653 continue; |
| 628 } | 654 } |
| 629 // TODO(qinmin): passing correct image size to PrepareToDecode(). | 655 // TODO(qinmin): passing correct image size to PrepareToDecode(). |
| 630 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) { | 656 if ((*it)->PrepareToDecode(skia::LazyPixelRef::PrepareParams())) { |
| 631 rendering_stats_.totalDeferredImageCacheHitCount++; | 657 rendering_stats_.totalDeferredImageCacheHitCount++; |
| 632 pending_pixel_refs.erase(it++); | 658 pending_pixel_refs.erase(it++); |
| 633 } else { | 659 } else { |
| 634 if (raster_worker_pool_->IsBusy()) | 660 if (!CanDispatchRasterTask(tile)) |
| 635 return; | 661 return; |
| 636 DispatchOneImageDecodeTask(tile, *it); | 662 DispatchOneImageDecodeTask(tile, *it); |
| 637 ++it; | 663 ++it; |
| 638 } | 664 } |
| 639 } | 665 } |
| 640 } | 666 } |
| 641 | 667 |
| 642 void TileManager::DispatchOneImageDecodeTask( | 668 void TileManager::DispatchOneImageDecodeTask( |
| 643 scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref) { | 669 scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref) { |
| 644 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodeTask"); | 670 TRACE_EVENT0("cc", "TileManager::DispatchOneImageDecodeTask"); |
| 645 uint32_t pixel_ref_id = pixel_ref->getGenerationID(); | 671 uint32_t pixel_ref_id = pixel_ref->getGenerationID(); |
| 646 DCHECK(pending_decode_tasks_.end() == | 672 DCHECK(pending_decode_tasks_.end() == |
| 647 pending_decode_tasks_.find(pixel_ref_id)); | 673 pending_decode_tasks_.find(pixel_ref_id)); |
| 648 pending_decode_tasks_[pixel_ref_id] = pixel_ref; | 674 pending_decode_tasks_[pixel_ref_id] = pixel_ref; |
| 649 | 675 |
| 650 raster_worker_pool_->PostTaskAndReply( | 676 raster_worker_pool_->PostTaskAndReply( |
| 651 base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), | 677 base::Bind(&TileManager::RunImageDecodeTask, pixel_ref), |
| 652 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 678 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
| 653 base::Unretained(this), | 679 base::Unretained(this), |
| 654 tile, | 680 tile, |
| 655 pixel_ref_id)); | 681 pixel_ref_id)); |
| 682 | |
| 683 client_->ScheduleCheckForCompletedRasterTasks(); | |
| 656 } | 684 } |
| 657 | 685 |
| 658 void TileManager::OnImageDecodeTaskCompleted( | 686 void TileManager::OnImageDecodeTaskCompleted( |
| 659 scoped_refptr<Tile> tile, uint32_t pixel_ref_id) { | 687 scoped_refptr<Tile> tile, uint32_t pixel_ref_id) { |
| 660 TRACE_EVENT0("cc", "TileManager::OnImageDecodeTaskCompleted"); | 688 TRACE_EVENT0("cc", "TileManager::OnImageDecodeTaskCompleted"); |
| 661 pending_decode_tasks_.erase(pixel_ref_id); | 689 pending_decode_tasks_.erase(pixel_ref_id); |
| 662 | 690 |
| 663 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); | 691 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); |
| 664 it != tiles_with_image_decoding_tasks_.end(); ++it) { | 692 it != tiles_with_image_decoding_tasks_.end(); ++it) { |
| 665 std::list<skia::LazyPixelRef*>& pixel_refs = | 693 std::list<skia::LazyPixelRef*>& pixel_refs = |
| 666 (*it)->managed_state().pending_pixel_refs; | 694 (*it)->managed_state().pending_pixel_refs; |
| 667 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = | 695 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = |
| 668 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { | 696 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { |
| 669 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { | 697 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
| 670 pixel_refs.erase(pixel_it); | 698 pixel_refs.erase(pixel_it); |
| 671 break; | 699 break; |
| 672 } | 700 } |
| 673 } | 701 } |
| 674 } | 702 } |
| 675 | |
| 676 DispatchMoreTasks(); | |
| 677 } | 703 } |
| 678 | 704 |
| 679 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( | 705 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
| 680 Tile* tile) { | 706 Tile* tile) { |
| 681 ManagedTileState& managed_tile_state = tile->managed_state(); | 707 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 682 DCHECK(managed_tile_state.can_use_gpu_memory); | 708 DCHECK(managed_tile_state.can_use_gpu_memory); |
| 683 scoped_ptr<ResourcePool::Resource> resource = | 709 scoped_ptr<ResourcePool::Resource> resource = |
| 684 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 710 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
| 685 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); | 711 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
| 686 | 712 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 702 resource_pool_->resource_provider()->mapPixelBuffer( | 728 resource_pool_->resource_provider()->mapPixelBuffer( |
| 703 resource_id), | 729 resource_id), |
| 704 tile->content_rect_, | 730 tile->content_rect_, |
| 705 tile->contents_scale(), | 731 tile->contents_scale(), |
| 706 use_cheapness_estimator_), | 732 use_cheapness_estimator_), |
| 707 base::Bind(&TileManager::OnRasterTaskCompleted, | 733 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 708 base::Unretained(this), | 734 base::Unretained(this), |
| 709 tile, | 735 tile, |
| 710 base::Passed(&resource), | 736 base::Passed(&resource), |
| 711 manage_tiles_call_count_)); | 737 manage_tiles_call_count_)); |
| 738 | |
| 739 bytes_pending_raster_ += tile->bytes_consumed_if_allocated(); | |
| 740 client_->ScheduleCheckForCompletedRasterTasks(); | |
| 712 } | 741 } |
| 713 | 742 |
| 714 void TileManager::PerformOneRaster(Tile* tile) { | 743 void TileManager::PerformOneRaster(Tile* tile) { |
| 715 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); | 744 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
| 716 ResourceProvider::ResourceId resource_id = resource->id(); | 745 ResourceProvider::ResourceId resource_id = resource->id(); |
| 717 | 746 |
| 718 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( | 747 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( |
| 719 resource_id), | 748 resource_id), |
| 720 tile->content_rect_, | 749 tile->content_rect_, |
| 721 tile->contents_scale(), | 750 tile->contents_scale(), |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 752 // The component order may be bgra if we're uploading bgra pixels to rgba | 781 // The component order may be bgra if we're uploading bgra pixels to rgba |
| 753 // texture. Mark contents as swizzled if image component order is | 782 // texture. Mark contents as swizzled if image component order is |
| 754 // different than texture format. | 783 // different than texture format. |
| 755 managed_tile_state.contents_swizzled = | 784 managed_tile_state.contents_swizzled = |
| 756 !PlatformColor::sameComponentOrder(tile->format_); | 785 !PlatformColor::sameComponentOrder(tile->format_); |
| 757 | 786 |
| 758 // Tile resources can't be freed until upload has completed. | 787 // Tile resources can't be freed until upload has completed. |
| 759 managed_tile_state.can_be_freed = false; | 788 managed_tile_state.can_be_freed = false; |
| 760 | 789 |
| 761 resource_pool_->resource_provider()->beginSetPixels(resource->id()); | 790 resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
| 762 resource_pool_->resource_provider()->shallowFlushIfSupported(); | |
| 763 managed_tile_state.resource = resource.Pass(); | 791 managed_tile_state.resource = resource.Pass(); |
| 764 | 792 |
| 765 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); | 793 bytes_pending_upload_ += tile->bytes_consumed_if_allocated(); |
| 766 DidTileRasterStateChange(tile, SET_PIXELS_STATE); | 794 DidTileRasterStateChange(tile, UPLOAD_STATE); |
| 767 tiles_with_pending_set_pixels_.push(tile); | 795 tiles_with_pending_upload_.push(tile); |
| 768 } else { | 796 } else { |
| 769 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 797 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
| 770 resource_pool_->ReleaseResource(resource.Pass()); | 798 resource_pool_->ReleaseResource(resource.Pass()); |
| 771 managed_tile_state.resource_is_being_initialized = false; | 799 managed_tile_state.resource_is_being_initialized = false; |
| 772 DidTileRasterStateChange(tile, IDLE_STATE); | 800 DidTileRasterStateChange(tile, IDLE_STATE); |
| 773 } | 801 } |
| 774 } | 802 } |
| 775 | 803 |
| 776 void TileManager::OnRasterTaskCompleted( | 804 void TileManager::OnRasterTaskCompleted( |
| 777 scoped_refptr<Tile> tile, | 805 scoped_refptr<Tile> tile, |
| 778 scoped_ptr<ResourcePool::Resource> resource, | 806 scoped_ptr<ResourcePool::Resource> resource, |
| 779 int manage_tiles_call_count_when_dispatched) { | 807 int manage_tiles_call_count_when_dispatched) { |
| 808 bytes_pending_raster_ -= tile->bytes_consumed_if_allocated(); | |
| 780 OnRasterCompleted(tile, resource.Pass(), | 809 OnRasterCompleted(tile, resource.Pass(), |
| 781 manage_tiles_call_count_when_dispatched); | 810 manage_tiles_call_count_when_dispatched); |
| 782 DispatchMoreTasks(); | |
| 783 } | 811 } |
| 784 | 812 |
| 785 void TileManager::DidFinishTileInitialization(Tile* tile) { | 813 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 786 ManagedTileState& managed_tile_state = tile->managed_state(); | 814 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 787 DCHECK(managed_tile_state.resource); | 815 DCHECK(managed_tile_state.resource); |
| 788 managed_tile_state.resource_is_being_initialized = false; | 816 managed_tile_state.resource_is_being_initialized = false; |
| 789 managed_tile_state.can_be_freed = true; | 817 managed_tile_state.can_be_freed = true; |
| 790 } | 818 } |
| 791 | 819 |
| 792 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { | 820 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 885 decode_begin_time = base::TimeTicks::Now(); | 913 decode_begin_time = base::TimeTicks::Now(); |
| 886 pixel_ref->Decode(); | 914 pixel_ref->Decode(); |
| 887 if (stats) { | 915 if (stats) { |
| 888 stats->totalDeferredImageDecodeCount++; | 916 stats->totalDeferredImageDecodeCount++; |
| 889 stats->totalDeferredImageDecodeTime += | 917 stats->totalDeferredImageDecodeTime += |
| 890 base::TimeTicks::Now() - decode_begin_time; | 918 base::TimeTicks::Now() - decode_begin_time; |
| 891 } | 919 } |
| 892 } | 920 } |
| 893 | 921 |
| 894 } // namespace cc | 922 } // namespace cc |
| OLD | NEW |