tile_manager.h revision f2477e01787aa58f445919b809d89e252beef54f
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 3// found in the LICENSE file. 4 5#ifndef CC_RESOURCES_TILE_MANAGER_H_ 6#define CC_RESOURCES_TILE_MANAGER_H_ 7 8#include <queue> 9#include <set> 10#include <vector> 11 12#include "base/containers/hash_tables.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/values.h" 15#include "cc/base/ref_counted_managed.h" 16#include "cc/debug/rendering_stats_instrumentation.h" 17#include "cc/resources/managed_tile_state.h" 18#include "cc/resources/memory_history.h" 19#include "cc/resources/picture_pile_impl.h" 20#include "cc/resources/prioritized_tile_set.h" 21#include "cc/resources/raster_worker_pool.h" 22#include "cc/resources/resource_pool.h" 23#include "cc/resources/tile.h" 24 25namespace cc { 26class ResourceProvider; 27 28class CC_EXPORT TileManagerClient { 29 public: 30 virtual void NotifyReadyToActivate() = 0; 31 32 protected: 33 virtual ~TileManagerClient() {} 34}; 35 36struct RasterTaskCompletionStats { 37 RasterTaskCompletionStats(); 38 39 size_t completed_count; 40 size_t canceled_count; 41}; 42scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( 43 const RasterTaskCompletionStats& stats); 44 45// This class manages tiles, deciding which should get rasterized and which 46// should no longer have any memory assigned to them. Tile objects are "owned" 47// by layers; they automatically register with the manager when they are 48// created, and unregister from the manager when they are deleted. 49class CC_EXPORT TileManager : public RasterWorkerPoolClient, 50 public RefCountedManager<Tile> { 51 public: 52 static scoped_ptr<TileManager> Create( 53 TileManagerClient* client, 54 ResourceProvider* resource_provider, 55 size_t num_raster_threads, 56 RenderingStatsInstrumentation* rendering_stats_instrumentation, 57 bool use_map_image, 58 size_t max_transfer_buffer_usage_bytes, 59 size_t max_raster_usage_bytes, 60 GLenum map_image_texture_target); 61 virtual ~TileManager(); 62 63 void ManageTiles(const GlobalStateThatImpactsTilePriority& state); 64 65 // Returns true when visible tiles have been initialized. 66 bool UpdateVisibleTiles(); 67 68 scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile, 69 gfx::Size tile_size, 70 gfx::Rect content_rect, 71 gfx::Rect opaque_rect, 72 float contents_scale, 73 int layer_id, 74 int source_frame_number, 75 bool can_use_lcd_text); 76 77 scoped_ptr<base::Value> BasicStateAsValue() const; 78 scoped_ptr<base::Value> AllTilesAsValue() const; 79 void GetMemoryStats(size_t* memory_required_bytes, 80 size_t* memory_nice_to_have_bytes, 81 size_t* memory_allocated_bytes, 82 size_t* memory_used_bytes) const; 83 84 const MemoryHistory::Entry& memory_stats_from_last_assign() const { 85 return memory_stats_from_last_assign_; 86 } 87 88 void InitializeTilesWithResourcesForTesting( 89 const std::vector<Tile*>& tiles, 90 ResourceProvider* resource_provider) { 91 for (size_t i = 0; i < tiles.size(); ++i) { 92 ManagedTileState& mts = tiles[i]->managed_state(); 93 ManagedTileState::TileVersion& tile_version = 94 mts.tile_versions[HIGH_QUALITY_NO_LCD_RASTER_MODE]; 95 96 tile_version.resource_ = resource_pool_->AcquireResource( 97 gfx::Size(1, 1)); 98 99 bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]); 100 ++resources_releasable_; 101 } 102 } 103 RasterWorkerPool* RasterWorkerPoolForTesting() { 104 return raster_worker_pool_.get(); 105 } 106 107 void SetGlobalStateForTesting( 108 const GlobalStateThatImpactsTilePriority& state) { 109 if (state != global_state_) { 110 global_state_ = state; 111 prioritized_tiles_dirty_ = true; 112 resource_pool_->SetResourceUsageLimits( 113 global_state_.memory_limit_in_bytes, 114 global_state_.unused_memory_limit_in_bytes, 115 global_state_.num_resources_limit); 116 } 117 } 118 119 protected: 120 TileManager(TileManagerClient* client, 121 ResourceProvider* resource_provider, 122 scoped_ptr<RasterWorkerPool> raster_worker_pool, 123 size_t num_raster_threads, 124 size_t max_raster_usage_bytes, 125 RenderingStatsInstrumentation* rendering_stats_instrumentation); 126 127 // Methods called by Tile 128 friend class Tile; 129 void DidChangeTilePriority(Tile* tile); 130 131 void CleanUpReleasedTiles(); 132 133 // Overriden from RefCountedManager<Tile>: 134 virtual void Release(Tile* tile) OVERRIDE; 135 136 // Overriden from RasterWorkerPoolClient: 137 virtual bool ShouldForceTasksRequiredForActivationToComplete() const 138 OVERRIDE; 139 virtual void DidFinishRunningTasks() OVERRIDE; 140 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE; 141 142 typedef std::vector<Tile*> TileVector; 143 typedef std::set<Tile*> TileSet; 144 145 // Virtual for test 146 virtual void ScheduleTasks( 147 const TileVector& tiles_that_need_to_be_rasterized); 148 149 void AssignGpuMemoryToTiles( 150 PrioritizedTileSet* tiles, 151 TileVector* tiles_that_need_to_be_rasterized); 152 void GetTilesWithAssignedBins(PrioritizedTileSet* tiles); 153 154 private: 155 void OnImageDecodeTaskCompleted( 156 int layer_id, 157 skia::LazyPixelRef* pixel_ref, 158 bool was_canceled); 159 void OnRasterTaskCompleted( 160 Tile::Id tile, 161 scoped_ptr<ResourcePool::Resource> resource, 162 RasterMode raster_mode, 163 const PicturePileImpl::Analysis& analysis, 164 bool was_canceled); 165 166 inline size_t BytesConsumedIfAllocated(const Tile* tile) const { 167 return Resource::MemorySizeBytes(tile->size(), 168 raster_worker_pool_->GetResourceFormat()); 169 } 170 171 RasterMode DetermineRasterMode(const Tile* tile) const; 172 void FreeResourceForTile(Tile* tile, RasterMode mode); 173 void FreeResourcesForTile(Tile* tile); 174 void FreeUnusedResourcesForTile(Tile* tile); 175 RasterWorkerPool::Task CreateImageDecodeTask( 176 Tile* tile, skia::LazyPixelRef* pixel_ref); 177 RasterWorkerPool::RasterTask CreateRasterTask(Tile* tile); 178 scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const; 179 void UpdatePrioritizedTileSetIfNeeded(); 180 181 TileManagerClient* client_; 182 scoped_ptr<ResourcePool> resource_pool_; 183 scoped_ptr<RasterWorkerPool> raster_worker_pool_; 184 GlobalStateThatImpactsTilePriority global_state_; 185 186 typedef base::hash_map<Tile::Id, Tile*> TileMap; 187 TileMap tiles_; 188 189 PrioritizedTileSet prioritized_tiles_; 190 bool prioritized_tiles_dirty_; 191 192 bool all_tiles_that_need_to_be_rasterized_have_memory_; 193 bool all_tiles_required_for_activation_have_memory_; 194 195 size_t memory_required_bytes_; 196 size_t memory_nice_to_have_bytes_; 197 198 size_t bytes_releasable_; 199 size_t resources_releasable_; 200 size_t max_raster_usage_bytes_; 201 202 bool ever_exceeded_memory_budget_; 203 MemoryHistory::Entry memory_stats_from_last_assign_; 204 205 RenderingStatsInstrumentation* rendering_stats_instrumentation_; 206 207 bool did_initialize_visible_tile_; 208 bool did_check_for_completed_tasks_since_last_schedule_tasks_; 209 210 typedef base::hash_map<uint32_t, RasterWorkerPool::Task> PixelRefTaskMap; 211 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 212 LayerPixelRefTaskMap image_decode_tasks_; 213 214 typedef base::hash_map<int, int> LayerCountMap; 215 LayerCountMap used_layer_counts_; 216 217 RasterTaskCompletionStats update_visible_tiles_stats_; 218 219 std::vector<Tile*> released_tiles_; 220 221 DISALLOW_COPY_AND_ASSIGN(TileManager); 222}; 223 224} // namespace cc 225 226#endif // CC_RESOURCES_TILE_MANAGER_H_ 227