tile_manager.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_RESOURCES_TILE_MANAGER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_RESOURCES_TILE_MANAGER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <queue> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_pile_impl.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/resources/raster_worker_pool.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_pool.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/tile_priority.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Tile; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TileVersion; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT TileManagerClient { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidInitializeVisibleTile() = 0; 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void NotifyReadyToActivate() = 0; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManagerClient() {} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tile manager classifying tiles into a few basic 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bins: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum TileManagerBin { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOW_BIN = 0, // Needed ASAP. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SOON_BIN = 1, // Impl-side version of prepainting. 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EVENTUALLY_BIN = 2, // Nice to have, if we've got memory and time. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NEVER_BIN = 3, // Dont bother. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NUM_BINS = 4 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Be sure to update TileManagerBinAsValue when adding new fields. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> TileManagerBinAsValue( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerBin bin); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum TileManagerBinPriority { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HIGH_PRIORITY_BIN = 0, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOW_PRIORITY_BIN = 1, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NUM_BIN_PRIORITIES = 2 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> TileManagerBinPriorityAsValue( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerBinPriority bin); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages tiles, deciding which should get rasterized and which 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should no longer have any memory assigned to them. Tile objects are "owned" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by layers; they automatically register with the manager when they are 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created, and unregister from the manager when they are deleted. 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CC_EXPORT TileManager : public RasterWorkerPoolClient { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<TileManager> Create( 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManagerClient* client, 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t num_raster_threads, 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool use_map_image); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManager(); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalStateThatImpactsTilePriority& GlobalState() const { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return global_state_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ManageTiles(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckForCompletedTileUploads(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> BasicStateAsValue() const; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> AllTilesAsValue() const; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetMemoryStats(size_t* memory_required_bytes, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_nice_to_have_bytes, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_used_bytes) const; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemoryHistory::Entry& memory_stats_from_last_assign() const { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memory_stats_from_last_assign_; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool AreTilesRequiredForActivationReady() const { 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tiles_that_need_to_be_initialized_for_activation_.empty() && 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch oom_tiles_that_need_to_be_initialized_for_activation_.empty(); 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManager(TileManagerClient* client, 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool, 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t num_raster_threads, 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLenum texture_format); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Methods called by Tile 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Tile; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterTile(Tile* tile); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnregisterTile(Tile* tile); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Overriden from RasterWorkerPoolClient: 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool ShouldForceTasksRequiredForActivationToComplete() const 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OVERRIDE; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidFinishedRunningTasks() OVERRIDE; 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidFinishedRunningTasksRequiredForActivation() OVERRIDE; 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Virtual for test 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void ScheduleTasks(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<Tile*>& tiles_that_need_to_be_rasterized() const { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return tiles_that_need_to_be_rasterized_; 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ReassignGpuMemoryToOOMTilesRequiredForActivation(); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnImageDecodeTaskCompleted( 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int layer_id, 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) skia::LazyPixelRef* pixel_ref, 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool was_canceled); 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnRasterTaskCompleted( 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_refptr<Tile> tile, 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<ResourcePool::Resource> resource, 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterMode raster_mode, 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const PicturePileImpl::Analysis& analysis, 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool was_canceled); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AssignBinsToTiles(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SortTiles(); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterMode DetermineRasterMode(const Tile* tile) const; 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CleanUpUnusedImageDecodeTasks(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AssignGpuMemoryToTiles(); 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void FreeResourceForTile(Tile* tile, RasterMode mode); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FreeResourcesForTile(Tile* tile); 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void FreeUnusedResourcesForTile(Tile* tile); 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RasterWorkerPool::Task CreateImageDecodeTask( 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Tile* tile, skia::LazyPixelRef* pixel_ref); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RasterTaskMetadata GetRasterTaskMetadata(const Tile& tile) const; 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterWorkerPool::RasterTask CreateRasterTask(Tile* tile); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidFinishTileInitialization(Tile* tile); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidTileTreeBinChange(Tile* tile, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerBin new_tree_bin, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WhichTree tree); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const; 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void AddRequiredTileForActivation(Tile* tile); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerClient* client_; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourcePool> resource_pool_; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool_; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority global_state_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<Tile*> TileVector; 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TileVector tiles_; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileVector tiles_that_need_to_be_rasterized_; 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef std::set<Tile*> TileSet; 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileSet tiles_that_need_to_be_initialized_for_activation_; 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TileSet oom_tiles_that_need_to_be_initialized_for_activation_; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ever_exceeded_memory_budget_; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MemoryHistory::Entry memory_stats_from_last_assign_; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation_; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_initialize_visible_tile_; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLenum texture_format_; 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<uint32_t, RasterWorkerPool::Task> PixelRefTaskMap; 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerPixelRefTaskMap image_decode_tasks_; 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TileManager); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_TILE_MANAGER_H_ 184