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) 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <deque> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <queue> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <utility> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/base/ref_counted_managed.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/base/unique_notifier.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "cc/resources/eviction_tile_priority_queue.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/managed_tile_state.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_pile_impl.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/prioritized_tile_set.h" 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "cc/resources/raster_tile_priority_queue.h" 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "cc/resources/rasterizer.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_pool.h" 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/tile.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace base { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace debug { 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ConvertableToTraceFormat; 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TracedValue; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class PictureLayerImpl; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT TileManagerClient { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns the set of layers that the tile manager should consider for raster. 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(vmpstr): Change the way we determine if we are ready to activate, so 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // that this can be removed. 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual const std::vector<PictureLayerImpl*>& GetPictureLayers() const = 0; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called when all tiles marked as required for activation are ready to draw. 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void NotifyReadyToActivate() = 0; 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called when the visible representation of a tile might have changed. Some 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // examples are: 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Tile version initialized. 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Tile resources freed. 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - Tile marked for on-demand raster. 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void NotifyTileStateChanged(const Tile* tile) = 0; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Given an empty raster tile priority queue, this will build a priority queue 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // that will return tiles in order in which they should be rasterized. 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Note if the queue was previous built, Reset must be called on it. 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void BuildRasterQueue(RasterTilePriorityQueue* queue, 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TreePriority tree_priority) = 0; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Given an empty eviction tile priority queue, this will build a priority 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // queue that will return tiles in order in which they should be evicted. 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Note if the queue was previous built, Reset must be called on it. 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void BuildEvictionQueue(EvictionTilePriorityQueue* queue, 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TreePriority tree_priority) = 0; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManagerClient() {} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct RasterTaskCompletionStats { 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats(); 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t completed_count; 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t canceled_count; 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_refptr<base::debug::ConvertableToTraceFormat> 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RasterTaskCompletionStatsAsValue(const RasterTaskCompletionStats& stats); 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages tiles, deciding which should get rasterized and which 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should no longer have any memory assigned to them. Tile objects are "owned" 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by layers; they automatically register with the manager when they are 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created, and unregister from the manager when they are deleted. 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass CC_EXPORT TileManager : public RasterizerClient, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public RefCountedManager<Tile> { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum NamedTaskSet { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci REQUIRED_FOR_ACTIVATION = 0, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ALL = 1, 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Adding additional values requires increasing kNumberOfTaskSets in 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // rasterizer.h 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<TileManager> Create( 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManagerClient* client, 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::SequencedTaskRunner* task_runner, 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ResourcePool* resource_pool, 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Rasterizer* rasterizer, 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderingStatsInstrumentation* rendering_stats_instrumentation); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManager(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ManageTiles(const GlobalStateThatImpactsTilePriority& state); 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Returns true when visible tiles have been initialized. 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool UpdateVisibleTiles(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& tile_size, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& content_rect, 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) float contents_scale, 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int layer_id, 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int source_frame_number, 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int flags); 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::debug::ConvertableToTraceFormat> BasicStateAsValue() 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const; 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void BasicStateAsValueInto(base::debug::TracedValue* dict) const; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemoryHistory::Entry& memory_stats_from_last_assign() const { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memory_stats_from_last_assign_; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void InitializeTilesWithResourcesForTesting(const std::vector<Tile*>& tiles) { 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < tiles.size(); ++i) { 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ManagedTileState& mts = tiles[i]->managed_state(); 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ManagedTileState::TileVersion& tile_version = 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mts.tile_versions[HIGH_QUALITY_RASTER_MODE]; 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) tile_version.resource_ = 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) resource_pool_->AcquireResource(tiles[i]->size()); 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]); 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++resources_releasable_; 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ReleaseTileResourcesForTesting(const std::vector<Tile*>& tiles) { 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < tiles.size(); ++i) { 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Tile* tile = tiles[i]; 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetGlobalStateForTesting( 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GlobalStateThatImpactsTilePriority& state) { 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Soft limit is used for resource pool such that 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // memory returns to soft limit after going over. 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (state != global_state_) { 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch global_state_ = state; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prioritized_tiles_dirty_ = true; 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetRasterizerForTesting(Rasterizer* rasterizer); 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void FreeResourcesAndCleanUpReleasedTilesForTesting() { 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prioritized_tiles_.Clear(); 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FreeResourcesForReleasedTiles(); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CleanUpReleasedTiles(); 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<Tile*> AllTilesForTesting() const { 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<Tile*> tiles; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tiles.push_back(it->second); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return tiles; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManager(TileManagerClient* client, 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::SequencedTaskRunner>& task_runner, 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ResourcePool* resource_pool, 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Rasterizer* rasterizer, 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RenderingStatsInstrumentation* rendering_stats_instrumentation); 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Methods called by Tile 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend class Tile; 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void DidChangeTilePriority(Tile* tile); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void FreeResourcesForReleasedTiles(); 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void CleanUpReleasedTiles(); 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overriden from RefCountedManager<Tile>: 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void Release(Tile* tile) OVERRIDE; 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Overriden from RasterizerClient: 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DidFinishRunningTasks(TaskSet task_set) OVERRIDE; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual TaskSetCollection TasksThatShouldBeForcedToComplete() const OVERRIDE; 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::vector<Tile*> TileVector; 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::set<Tile*> TileSet; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Virtual for test 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ScheduleTasks( 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const TileVector& tiles_that_need_to_be_rasterized); 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AssignGpuMemoryToTiles(PrioritizedTileSet* tiles, 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TileVector* tiles_that_need_to_be_rasterized); 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void GetTilesWithAssignedBins(PrioritizedTileSet* tiles); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnImageDecodeTaskCompleted(int layer_id, 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPixelRef* pixel_ref, 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool was_canceled); 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnRasterTaskCompleted(Tile::Id tile, 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ScopedResource> resource, 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RasterMode raster_mode, 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PicturePileImpl::Analysis& analysis, 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool was_canceled); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch inline size_t BytesConsumedIfAllocated(const Tile* tile) const { 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return Resource::MemorySizeBytes(tile->size(), 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch resource_pool_->resource_format()); 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void FreeResourceForTile(Tile* tile, RasterMode mode); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FreeResourcesForTile(Tile* tile); 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void FreeUnusedResourcesForTile(Tile* tile); 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(Tile* tile); 226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_refptr<ImageDecodeTask> CreateImageDecodeTask(Tile* tile, 227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SkPixelRef* pixel_ref); 228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_refptr<RasterTask> CreateRasterTask(Tile* tile); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdatePrioritizedTileSetIfNeeded(); 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool IsReadyToActivate() const; 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void CheckIfReadyToActivate(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerClient* client_; 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner_; 236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ResourcePool* resource_pool_; 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Rasterizer* rasterizer_; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority global_state_; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef base::hash_map<Tile::Id, Tile*> TileMap; 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TileMap tiles_; 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrioritizedTileSet prioritized_tiles_; 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool prioritized_tiles_dirty_; 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool all_tiles_that_need_to_be_rasterized_have_memory_; 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool all_tiles_required_for_activation_have_memory_; 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t bytes_releasable_; 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t resources_releasable_; 2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool ever_exceeded_memory_budget_; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MemoryHistory::Entry memory_stats_from_last_assign_; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation_; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_initialize_visible_tile_; 258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool did_check_for_completed_tasks_since_last_schedule_tasks_; 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool did_oom_on_last_assign_; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef base::hash_map<uint32_t, scoped_refptr<ImageDecodeTask> > 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PixelRefTaskMap; 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerPixelRefTaskMap image_decode_tasks_; 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef base::hash_map<int, int> LayerCountMap; 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerCountMap used_layer_counts_; 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats update_visible_tiles_stats_; 270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<Tile*> released_tiles_; 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ResourceFormat resource_format_; 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Queue used when scheduling raster tasks. 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RasterTaskQueue raster_queue_; 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::vector<scoped_refptr<RasterTask> > orphan_raster_tasks_; 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UniqueNotifier ready_to_activate_check_notifier_; 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TileManager); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_TILE_MANAGER_H_ 288