| 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 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 } | 127 } |
| 128 | 128 |
| 129 TileManager::TileManager( | 129 TileManager::TileManager( |
| 130 TileManagerClient* client, | 130 TileManagerClient* client, |
| 131 ResourceProvider* resource_provider, | 131 ResourceProvider* resource_provider, |
| 132 size_t num_raster_threads) | 132 size_t num_raster_threads) |
| 133 : client_(client), | 133 : client_(client), |
| 134 resource_pool_(ResourcePool::Create(resource_provider, | 134 resource_pool_(ResourcePool::Create(resource_provider, |
| 135 Renderer::ImplPool)), | 135 Renderer::ImplPool)), |
| 136 manage_tiles_pending_(false), | 136 manage_tiles_pending_(false), |
| 137 manage_tiles_call_count_(0), |
| 137 check_for_completed_set_pixels_pending_(false) { | 138 check_for_completed_set_pixels_pending_(false) { |
| 138 // Initialize all threads. | 139 // Initialize all threads. |
| 139 const std::string thread_name_prefix = kRasterThreadNamePrefix; | 140 const std::string thread_name_prefix = kRasterThreadNamePrefix; |
| 140 while (raster_threads_.size() < num_raster_threads) { | 141 while (raster_threads_.size() < num_raster_threads) { |
| 141 int thread_number = raster_threads_.size() + 1; | 142 int thread_number = raster_threads_.size() + 1; |
| 142 scoped_ptr<RasterThread> thread = make_scoped_ptr( | 143 scoped_ptr<RasterThread> thread = make_scoped_ptr( |
| 143 new RasterThread(thread_name_prefix + | 144 new RasterThread(thread_name_prefix + |
| 144 StringPrintf("Worker%d", thread_number).c_str())); | 145 StringPrintf("Worker%d", thread_number).c_str())); |
| 145 raster_threads_.append(thread.Pass()); | 146 raster_threads_.append(thread.Pass()); |
| 146 } | 147 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 | 228 |
| 228 return | 229 return |
| 229 ams.time_to_needed_in_seconds < | 230 ams.time_to_needed_in_seconds < |
| 230 bms.time_to_needed_in_seconds; | 231 bms.time_to_needed_in_seconds; |
| 231 } | 232 } |
| 232 }; | 233 }; |
| 233 | 234 |
| 234 void TileManager::ManageTiles() { | 235 void TileManager::ManageTiles() { |
| 235 TRACE_EVENT0("cc", "TileManager::ManageTiles"); | 236 TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
| 236 manage_tiles_pending_ = false; | 237 manage_tiles_pending_ = false; |
| 238 ++manage_tiles_call_count_; |
| 237 | 239 |
| 238 // The amount of time for which we want to have prepainting coverage. | 240 // The amount of time for which we want to have prepainting coverage. |
| 239 const double prepainting_window_time_seconds = 1.0; | 241 const double prepainting_window_time_seconds = 1.0; |
| 240 const double backfling_guard_distance_pixels = 314.0; | 242 const double backfling_guard_distance_pixels = 314.0; |
| 241 | 243 |
| 242 const bool smoothness_takes_priority = global_state_.smoothness_takes_priority
; | 244 const bool smoothness_takes_priority = global_state_.smoothness_takes_priority
; |
| 243 | 245 |
| 244 // Bin into three categories of tiles: things we need now, things we need soon
, and eventually | 246 // Bin into three categories of tiles: things we need now, things we need soon
, and eventually |
| 245 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 247 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 246 Tile* tile = *it; | 248 Tile* tile = *it; |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 picture_pile_clone.get(), | 557 picture_pile_clone.get(), |
| 556 resource_pool_->resource_provider()->mapPixelBuffer(resource_id), | 558 resource_pool_->resource_provider()->mapPixelBuffer(resource_id), |
| 557 tile->content_rect_, | 559 tile->content_rect_, |
| 558 tile->contents_scale(), | 560 tile->contents_scale(), |
| 559 stats, | 561 stats, |
| 560 base::Bind(&TileManager::OnRasterTaskCompleted, | 562 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 561 base::Unretained(this), | 563 base::Unretained(this), |
| 562 tile, | 564 tile, |
| 563 base::Passed(&resource), | 565 base::Passed(&resource), |
| 564 picture_pile_clone, | 566 picture_pile_clone, |
| 567 manage_tiles_call_count_, |
| 565 stats)); | 568 stats)); |
| 566 } | 569 } |
| 567 | 570 |
| 568 void TileManager::OnRasterTaskCompleted( | 571 void TileManager::OnRasterTaskCompleted( |
| 569 scoped_refptr<Tile> tile, | 572 scoped_refptr<Tile> tile, |
| 570 scoped_ptr<ResourcePool::Resource> resource, | 573 scoped_ptr<ResourcePool::Resource> resource, |
| 571 scoped_refptr<PicturePileImpl> picture_pile_clone, | 574 scoped_refptr<PicturePileImpl> picture_pile_clone, |
| 575 int manage_tiles_call_count_when_dispatched, |
| 572 RenderingStats* stats) { | 576 RenderingStats* stats) { |
| 573 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); | 577 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); |
| 574 rendering_stats_.totalRasterizeTimeInSeconds += | 578 rendering_stats_.totalRasterizeTimeInSeconds += |
| 575 stats->totalRasterizeTimeInSeconds; | 579 stats->totalRasterizeTimeInSeconds; |
| 576 rendering_stats_.totalPixelsRasterized += stats->totalPixelsRasterized; | 580 rendering_stats_.totalPixelsRasterized += stats->totalPixelsRasterized; |
| 577 delete stats; | 581 delete stats; |
| 578 | 582 |
| 579 // Release raster resources. | 583 // Release raster resources. |
| 580 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); | 584 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
| 581 | 585 |
| 582 ManagedTileState& managed_tile_state = tile->managed_state(); | 586 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 583 managed_tile_state.can_be_freed = true; | 587 managed_tile_state.can_be_freed = true; |
| 584 | 588 |
| 585 // Tile can be freed after the completion of the raster task. Call | 589 // Tile can be freed after the completion of the raster task. Call |
| 586 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 590 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
| 587 // tiles. The result of this could be that this tile is no longer | 591 // tiles if ManageTiles() was called since task was dispatched. The result |
| 588 // allowed to use gpu memory and in that case we need to abort | 592 // of this could be that this tile is no longer allowed to use gpu |
| 589 // initialization and free all associated resources before calling | 593 // memory and in that case we need to abort initialization and free all |
| 590 // DispatchMoreTasks(). | 594 // associated resources before calling DispatchMoreTasks(). |
| 591 AssignGpuMemoryToTiles(); | 595 if (manage_tiles_call_count_when_dispatched != manage_tiles_call_count_) |
| 596 AssignGpuMemoryToTiles(); |
| 592 | 597 |
| 593 // Finish resource initialization if |can_use_gpu_memory| is true. | 598 // Finish resource initialization if |can_use_gpu_memory| is true. |
| 594 if (managed_tile_state.can_use_gpu_memory) { | 599 if (managed_tile_state.can_use_gpu_memory) { |
| 595 // The component order may be bgra if we're uploading bgra pixels to rgba | 600 // The component order may be bgra if we're uploading bgra pixels to rgba |
| 596 // texture. Mark contents as swizzled if image component order is | 601 // texture. Mark contents as swizzled if image component order is |
| 597 // different than texture format. | 602 // different than texture format. |
| 598 managed_tile_state.contents_swizzled = | 603 managed_tile_state.contents_swizzled = |
| 599 !PlatformColor::sameComponentOrder(tile->format_); | 604 !PlatformColor::sameComponentOrder(tile->format_); |
| 600 | 605 |
| 601 // Tile resources can't be freed until upload has completed. | 606 // Tile resources can't be freed until upload has completed. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 615 } | 620 } |
| 616 | 621 |
| 617 void TileManager::DidFinishTileInitialization(Tile* tile) { | 622 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 618 ManagedTileState& managed_tile_state = tile->managed_state(); | 623 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 619 DCHECK(managed_tile_state.resource); | 624 DCHECK(managed_tile_state.resource); |
| 620 managed_tile_state.resource_is_being_initialized = false; | 625 managed_tile_state.resource_is_being_initialized = false; |
| 621 managed_tile_state.can_be_freed = true; | 626 managed_tile_state.can_be_freed = true; |
| 622 } | 627 } |
| 623 | 628 |
| 624 } | 629 } |
| OLD | NEW |