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