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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 return state.PassAs<base::Value>(); | 170 return state.PassAs<base::Value>(); |
171 } | 171 } |
172 | 172 |
173 TileManager::TileManager( | 173 TileManager::TileManager( |
174 TileManagerClient* client, | 174 TileManagerClient* client, |
175 ResourceProvider* resource_provider, | 175 ResourceProvider* resource_provider, |
176 size_t num_raster_threads, | 176 size_t num_raster_threads, |
177 bool use_cheapness_estimator) | 177 bool use_cheapness_estimator) |
178 : client_(client), | 178 : client_(client), |
179 resource_pool_(ResourcePool::Create(resource_provider)), | 179 resource_pool_(ResourcePool::Create(resource_provider)), |
180 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads)), | 180 raster_worker_pool_(RasterWorkerPool::Create(this, num_raster_threads)), |
181 manage_tiles_pending_(false), | 181 manage_tiles_pending_(false), |
182 manage_tiles_call_count_(0), | 182 manage_tiles_call_count_(0), |
183 bytes_pending_set_pixels_(0), | 183 bytes_pending_set_pixels_(0), |
| 184 has_performed_uploads_since_last_flush_(false), |
184 ever_exceeded_memory_budget_(false), | 185 ever_exceeded_memory_budget_(false), |
185 record_rendering_stats_(false), | 186 record_rendering_stats_(false), |
186 use_cheapness_estimator_(use_cheapness_estimator) { | 187 use_cheapness_estimator_(use_cheapness_estimator) { |
187 for (int i = 0; i < NUM_STATES; ++i) { | 188 for (int i = 0; i < NUM_STATES; ++i) { |
188 for (int j = 0; j < NUM_TREES; ++j) { | 189 for (int j = 0; j < NUM_TREES; ++j) { |
189 for (int k = 0; k < NUM_BINS; ++k) | 190 for (int k = 0; k < NUM_BINS; ++k) |
190 raster_state_count_[i][j][k] = 0; | 191 raster_state_count_[i][j][k] = 0; |
191 } | 192 } |
192 } | 193 } |
193 } | 194 } |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 case IDLE_STATE: | 532 case IDLE_STATE: |
532 break; | 533 break; |
533 default: | 534 default: |
534 NOTREACHED(); | 535 NOTREACHED(); |
535 } | 536 } |
536 } | 537 } |
537 | 538 |
538 return false; | 539 return false; |
539 } | 540 } |
540 | 541 |
| 542 void TileManager::DidFinishDispatchingWorkerPoolCompletionCallbacks() { |
| 543 // If a flush is needed, do it now before starting to dispatch more tasks. |
| 544 if (has_performed_uploads_since_last_flush_) { |
| 545 resource_pool_->resource_provider()->shallowFlushIfSupported(); |
| 546 has_performed_uploads_since_last_flush_ = false; |
| 547 } |
| 548 |
| 549 DispatchMoreTasks(); |
| 550 } |
| 551 |
541 void TileManager::AssignGpuMemoryToTiles() { | 552 void TileManager::AssignGpuMemoryToTiles() { |
542 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 553 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
543 size_t unreleasable_bytes = 0; | 554 size_t unreleasable_bytes = 0; |
544 | 555 |
545 // Now give memory out to the tiles until we're out, and build | 556 // Now give memory out to the tiles until we're out, and build |
546 // the needs-to-be-rasterized queue. | 557 // the needs-to-be-rasterized queue. |
547 tiles_that_need_to_be_rasterized_.clear(); | 558 tiles_that_need_to_be_rasterized_.clear(); |
548 | 559 |
549 // Reset the image decoding list so that we don't mess up with tile | 560 // Reset the image decoding list so that we don't mess up with tile |
550 // priorities. Tiles will be added to the image decoding list again | 561 // priorities. Tiles will be added to the image decoding list again |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 std::list<skia::LazyPixelRef*>& pixel_refs = | 752 std::list<skia::LazyPixelRef*>& pixel_refs = |
742 (*it)->managed_state().pending_pixel_refs; | 753 (*it)->managed_state().pending_pixel_refs; |
743 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = | 754 for (std::list<skia::LazyPixelRef*>::iterator pixel_it = |
744 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { | 755 pixel_refs.begin(); pixel_it != pixel_refs.end(); ++pixel_it) { |
745 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { | 756 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
746 pixel_refs.erase(pixel_it); | 757 pixel_refs.erase(pixel_it); |
747 break; | 758 break; |
748 } | 759 } |
749 } | 760 } |
750 } | 761 } |
751 | |
752 DispatchMoreTasks(); | |
753 } | 762 } |
754 | 763 |
755 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( | 764 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
756 Tile* tile) { | 765 Tile* tile) { |
757 ManagedTileState& managed_tile_state = tile->managed_state(); | 766 ManagedTileState& managed_tile_state = tile->managed_state(); |
758 DCHECK(managed_tile_state.can_use_gpu_memory); | 767 DCHECK(managed_tile_state.can_use_gpu_memory); |
759 scoped_ptr<ResourcePool::Resource> resource = | 768 scoped_ptr<ResourcePool::Resource> resource = |
760 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 769 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
761 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); | 770 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
762 | 771 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 // The component order may be bgra if we're uploading bgra pixels to rgba | 839 // The component order may be bgra if we're uploading bgra pixels to rgba |
831 // texture. Mark contents as swizzled if image component order is | 840 // texture. Mark contents as swizzled if image component order is |
832 // different than texture format. | 841 // different than texture format. |
833 managed_tile_state.contents_swizzled = | 842 managed_tile_state.contents_swizzled = |
834 !PlatformColor::sameComponentOrder(tile->format_); | 843 !PlatformColor::sameComponentOrder(tile->format_); |
835 | 844 |
836 // Tile resources can't be freed until upload has completed. | 845 // Tile resources can't be freed until upload has completed. |
837 managed_tile_state.can_be_freed = false; | 846 managed_tile_state.can_be_freed = false; |
838 | 847 |
839 resource_pool_->resource_provider()->beginSetPixels(resource->id()); | 848 resource_pool_->resource_provider()->beginSetPixels(resource->id()); |
840 resource_pool_->resource_provider()->shallowFlushIfSupported(); | 849 has_performed_uploads_since_last_flush_ = true; |
| 850 |
841 managed_tile_state.resource = resource.Pass(); | 851 managed_tile_state.resource = resource.Pass(); |
842 | 852 |
843 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); | 853 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); |
844 DidTileRasterStateChange(tile, SET_PIXELS_STATE); | 854 DidTileRasterStateChange(tile, SET_PIXELS_STATE); |
845 tiles_with_pending_set_pixels_.push(tile); | 855 tiles_with_pending_set_pixels_.push(tile); |
846 } else { | 856 } else { |
847 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 857 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
848 resource_pool_->ReleaseResource(resource.Pass()); | 858 resource_pool_->ReleaseResource(resource.Pass()); |
849 managed_tile_state.resource_is_being_initialized = false; | 859 managed_tile_state.resource_is_being_initialized = false; |
850 DidTileRasterStateChange(tile, IDLE_STATE); | 860 DidTileRasterStateChange(tile, IDLE_STATE); |
851 } | 861 } |
852 } | 862 } |
853 | 863 |
854 void TileManager::OnRasterTaskCompleted( | 864 void TileManager::OnRasterTaskCompleted( |
855 scoped_refptr<Tile> tile, | 865 scoped_refptr<Tile> tile, |
856 scoped_ptr<ResourcePool::Resource> resource, | 866 scoped_ptr<ResourcePool::Resource> resource, |
857 int manage_tiles_call_count_when_dispatched) { | 867 int manage_tiles_call_count_when_dispatched) { |
858 OnRasterCompleted(tile, resource.Pass(), | 868 OnRasterCompleted(tile, resource.Pass(), |
859 manage_tiles_call_count_when_dispatched); | 869 manage_tiles_call_count_when_dispatched); |
860 DispatchMoreTasks(); | |
861 } | 870 } |
862 | 871 |
863 void TileManager::DidFinishTileInitialization(Tile* tile) { | 872 void TileManager::DidFinishTileInitialization(Tile* tile) { |
864 ManagedTileState& managed_tile_state = tile->managed_state(); | 873 ManagedTileState& managed_tile_state = tile->managed_state(); |
865 DCHECK(managed_tile_state.resource); | 874 DCHECK(managed_tile_state.resource); |
866 managed_tile_state.resource_is_being_initialized = false; | 875 managed_tile_state.resource_is_being_initialized = false; |
867 managed_tile_state.can_be_freed = true; | 876 managed_tile_state.can_be_freed = true; |
868 } | 877 } |
869 | 878 |
870 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { | 879 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
970 decode_begin_time = base::TimeTicks::Now(); | 979 decode_begin_time = base::TimeTicks::Now(); |
971 pixel_ref->Decode(); | 980 pixel_ref->Decode(); |
972 if (stats) { | 981 if (stats) { |
973 stats->totalDeferredImageDecodeCount++; | 982 stats->totalDeferredImageDecodeCount++; |
974 stats->totalDeferredImageDecodeTime += | 983 stats->totalDeferredImageDecodeTime += |
975 base::TimeTicks::Now() - decode_begin_time; | 984 base::TimeTicks::Now() - decode_begin_time; |
976 } | 985 } |
977 } | 986 } |
978 | 987 |
979 } // namespace cc | 988 } // namespace cc |
OLD | NEW |