tile_manager.h revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/managed_tile_state.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_pile_impl.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/resources/raster_worker_pool.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_pool.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/tile.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT TileManagerClient { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void NotifyReadyToActivate() = 0; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManagerClient() {} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct RasterTaskCompletionStats { 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats(); 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t completed_count; 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t canceled_count; 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochscoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const RasterTaskCompletionStats& stats); 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages tiles, deciding which should get rasterized and which 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should no longer have any memory assigned to them. Tile objects are "owned" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by layers; they automatically register with the manager when they are 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created, and unregister from the manager when they are deleted. 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CC_EXPORT TileManager : public RasterWorkerPoolClient { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<TileManager> Create( 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManagerClient* client, 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t num_raster_threads, 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool use_map_image); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManager(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GlobalStateThatImpactsTilePriority& GlobalState() const { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return global_state_; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ManageTiles(); 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Returns true when visible tiles have been initialized. 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool UpdateVisibleTiles(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> BasicStateAsValue() const; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> AllTilesAsValue() const; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetMemoryStats(size_t* memory_required_bytes, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_nice_to_have_bytes, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_used_bytes) const; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemoryHistory::Entry& memory_stats_from_last_assign() const { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memory_stats_from_last_assign_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool AreTilesRequiredForActivationReady() const { 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return all_tiles_required_for_activation_have_been_initialized_; 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManager(TileManagerClient* client, 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool, 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t num_raster_threads, 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLenum texture_format); 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Methods called by Tile 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Tile; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterTile(Tile* tile); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnregisterTile(Tile* tile); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Overriden from RasterWorkerPoolClient: 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual bool ShouldForceTasksRequiredForActivationToComplete() const 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OVERRIDE; 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFinishRunningTasks() OVERRIDE; 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE; 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::vector<Tile*> TileVector; 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::vector<scoped_refptr<Tile> > TileRefVector; 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::set<Tile*> TileSet; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Virtual for test 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ScheduleTasks( 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const TileVector& tiles_that_need_to_be_rasterized); 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void AssignGpuMemoryToTiles( 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const TileRefVector& sorted_tiles, 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TileVector* tiles_that_need_to_be_rasterized); 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void AssignBinsToTiles(TileRefVector* tiles); 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SortTiles(TileRefVector* tiles); 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void GetSortedTiles(TileRefVector* tiles); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnImageDecodeTaskCompleted( 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int layer_id, 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) skia::LazyPixelRef* pixel_ref, 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool was_canceled); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnRasterTaskCompleted( 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Tile::Id tile, 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<ResourcePool::Resource> resource, 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterMode raster_mode, 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const PicturePileImpl::Analysis& analysis, 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool was_canceled); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterMode DetermineRasterMode(const Tile* tile) const; 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CleanUpUnusedImageDecodeTasks(); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void FreeResourceForTile(Tile* tile, RasterMode mode); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FreeResourcesForTile(Tile* tile); 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void FreeUnusedResourcesForTile(Tile* tile); 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RasterWorkerPool::Task CreateImageDecodeTask( 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Tile* tile, skia::LazyPixelRef* pixel_ref); 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RasterWorkerPool::RasterTask CreateRasterTask(Tile* tile); 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerClient* client_; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourcePool> resource_pool_; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool_; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority global_state_; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef base::hash_map<Tile::Id, Tile*> TileMap; 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TileMap tiles_; 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TileRefVector sorted_tiles_; 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool all_tiles_that_need_to_be_rasterized_have_memory_; 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool all_tiles_required_for_activation_have_memory_; 149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool all_tiles_required_for_activation_have_been_initialized_; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ever_exceeded_memory_budget_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MemoryHistory::Entry memory_stats_from_last_assign_; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation_; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_initialize_visible_tile_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLenum texture_format_; 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<uint32_t, RasterWorkerPool::Task> PixelRefTaskMap; 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerPixelRefTaskMap image_decode_tasks_; 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats update_visible_tiles_stats_; 165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TileManager); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_TILE_MANAGER_H_ 172