tile_manager.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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> 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <utility> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/base/ref_counted_managed.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/rendering_stats_instrumentation.h" 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/layers/picture_layer_impl.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/managed_tile_state.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/memory_history.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/picture_pile_impl.h" 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "cc/resources/prioritized_tile_set.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/resources/raster_worker_pool.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_pool.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/resources/tile.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RasterWorkerPoolDelegate; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceProvider; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT TileManagerClient { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void NotifyReadyToActivate() = 0; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManagerClient() {} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct RasterTaskCompletionStats { 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats(); 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t completed_count; 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t canceled_count; 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochscoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const RasterTaskCompletionStats& stats); 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages tiles, deciding which should get rasterized and which 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// should no longer have any memory assigned to them. Tile objects are "owned" 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by layers; they automatically register with the manager when they are 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created, and unregister from the manager when they are deleted. 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class CC_EXPORT TileManager : public RasterWorkerPoolClient, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public RefCountedManager<Tile> { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct CC_EXPORT PairedPictureLayer { 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PairedPictureLayer(); 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ~PairedPictureLayer(); 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PictureLayerImpl* active_layer; 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PictureLayerImpl* pending_layer; 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }; 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch class CC_EXPORT RasterTileIterator { 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RasterTileIterator(TileManager* tile_manager, TreePriority tree_priority); 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ~RasterTileIterator(); 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RasterTileIterator& operator++(); 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch operator bool() const; 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Tile* operator*(); 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch struct PairedPictureLayerIterator { 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PairedPictureLayerIterator(); 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ~PairedPictureLayerIterator(); 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Tile* PeekTile(TreePriority tree_priority); 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void PopTile(TreePriority tree_priority); 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::pair<PictureLayerImpl::LayerRasterTileIterator*, WhichTree> 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch NextTileIterator(TreePriority tree_priority); 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PictureLayerImpl::LayerRasterTileIterator active_iterator; 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PictureLayerImpl::LayerRasterTileIterator pending_iterator; 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<Tile*> returned_shared_tiles; 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch }; 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch class RasterOrderComparator { 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch explicit RasterOrderComparator(TreePriority tree_priority); 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool operator()(PairedPictureLayerIterator* a, 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch PairedPictureLayerIterator* b) const; 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool ComparePriorities(const TilePriority& a_priority, 98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const TilePriority& b_priority, 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool prioritize_low_res) const; 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TreePriority tree_priority_; 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch }; 102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<PairedPictureLayerIterator> paired_iterators_; 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<PairedPictureLayerIterator*> iterator_heap_; 105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch TreePriority tree_priority_; 106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RasterOrderComparator comparator_; 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch }; 108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<TileManager> Create( 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManagerClient* client, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SequencedTaskRunner* task_runner, 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextProvider* context_provider, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool use_map_image, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_rasterize_on_demand, 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t max_transfer_buffer_usage_bytes, 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t max_raster_usage_bytes, 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned map_image_texture_target); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TileManager(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ManageTiles(const GlobalStateThatImpactsTilePriority& state); 123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Returns true when visible tiles have been initialized. 125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool UpdateVisibleTiles(); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& tile_size, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& content_rect, 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& opaque_rect, 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) float contents_scale, 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int layer_id, 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int source_frame_number, 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int flags); 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void RegisterPictureLayerImpl(PictureLayerImpl* layer); 13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void UnregisterPictureLayerImpl(PictureLayerImpl* layer); 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> BasicStateAsValue() const; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> AllTilesAsValue() const; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetMemoryStats(size_t* memory_required_bytes, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_nice_to_have_bytes, 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t* memory_allocated_bytes, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* memory_used_bytes) const; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const MemoryHistory::Entry& memory_stats_from_last_assign() const { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memory_stats_from_last_assign_; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void GetPairedPictureLayers(std::vector<PairedPictureLayer>* layers) const; 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void InitializeTilesWithResourcesForTesting( 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<Tile*>& tiles, 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResourceProvider* resource_provider) { 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < tiles.size(); ++i) { 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ManagedTileState& mts = tiles[i]->managed_state(); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ManagedTileState::TileVersion& tile_version = 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mts.tile_versions[HIGH_QUALITY_NO_LCD_RASTER_MODE]; 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) tile_version.resource_ = resource_pool_->AcquireResource(gfx::Size(1, 1)); 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]); 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ++resources_releasable_; 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetGlobalStateForTesting( 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GlobalStateThatImpactsTilePriority& state) { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Soft limit is used for resource pool such that 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // memory returns to soft limit after going over. 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (state != global_state_) { 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) global_state_ = state; 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prioritized_tiles_dirty_ = true; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_pool_->SetResourceUsageLimits( 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) global_state_.soft_memory_limit_in_bytes, 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) global_state_.unused_memory_limit_in_bytes, 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) global_state_.num_resources_limit); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TileManager(TileManagerClient* client, 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SequencedTaskRunner* task_runner, 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceProvider* resource_provider, 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextProvider* context_provider, 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool, 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RasterWorkerPool> direct_raster_worker_pool, 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t max_raster_usage_bytes, 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation, 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_rasterize_on_demand); 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Methods called by Tile 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Tile; 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void DidChangeTilePriority(Tile* tile); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void CleanUpReleasedTiles(); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overriden from RefCountedManager<Tile>: 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void Release(Tile* tile) OVERRIDE; 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overriden from RasterWorkerPoolClient: 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool ShouldForceTasksRequiredForActivationToComplete() const OVERRIDE; 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFinishRunningTasks() OVERRIDE; 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE; 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::vector<Tile*> TileVector; 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::set<Tile*> TileSet; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Virtual for test 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ScheduleTasks( 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const TileVector& tiles_that_need_to_be_rasterized); 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AssignGpuMemoryToTiles(PrioritizedTileSet* tiles, 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TileVector* tiles_that_need_to_be_rasterized); 215bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void GetTilesWithAssignedBins(PrioritizedTileSet* tiles); 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum RasterWorkerPoolType { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RASTER_WORKER_POOL_TYPE_DEFAULT, 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RASTER_WORKER_POOL_TYPE_DIRECT, 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NUM_RASTER_WORKER_POOL_TYPES 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnImageDecodeTaskCompleted(int layer_id, 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkPixelRef* pixel_ref, 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool was_canceled); 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnRasterTaskCompleted(Tile::Id tile, 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ScopedResource> resource, 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RasterMode raster_mode, 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PicturePileImpl::Analysis& analysis, 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool was_canceled); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) inline size_t BytesConsumedIfAllocated(const Tile* tile) const { 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return Resource::MemorySizeBytes(tile->size(), 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) raster_worker_pool_->GetResourceFormat()); 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void FreeResourceForTile(Tile* tile, RasterMode mode); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FreeResourcesForTile(Tile* tile); 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void FreeUnusedResourcesForTile(Tile* tile); 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<internal::WorkerPoolTask> CreateImageDecodeTask( 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Tile* tile, 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPixelRef* pixel_ref); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<internal::RasterWorkerPoolTask> CreateRasterTask(Tile* tile); 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const; 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void UpdatePrioritizedTileSetIfNeeded(); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TileManagerClient* client_; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextProvider* context_provider_; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourcePool> resource_pool_; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RasterWorkerPool> raster_worker_pool_; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RasterWorkerPool> direct_raster_worker_pool_; 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<RasterWorkerPoolDelegate> raster_worker_pool_delegate_; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GlobalStateThatImpactsTilePriority global_state_; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef base::hash_map<Tile::Id, Tile*> TileMap; 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TileMap tiles_; 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 259bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch PrioritizedTileSet prioritized_tiles_; 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool prioritized_tiles_dirty_; 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool all_tiles_that_need_to_be_rasterized_have_memory_; 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool all_tiles_required_for_activation_have_memory_; 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t memory_required_bytes_; 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t memory_nice_to_have_bytes_; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t bytes_releasable_; 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t resources_releasable_; 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t max_raster_usage_bytes_; 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ever_exceeded_memory_budget_; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MemoryHistory::Entry memory_stats_from_last_assign_; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation_; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_initialize_visible_tile_; 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool did_check_for_completed_tasks_since_last_schedule_tasks_; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::hash_map<uint32_t, scoped_refptr<internal::WorkerPoolTask> > 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PixelRefTaskMap; 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerPixelRefTaskMap image_decode_tasks_; 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef base::hash_map<int, int> LayerCountMap; 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerCountMap used_layer_counts_; 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RasterTaskCompletionStats update_visible_tiles_stats_; 289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<Tile*> released_tiles_; 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_rasterize_on_demand_; 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Queues used when scheduling raster tasks. 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RasterTaskQueue raster_queue_[NUM_RASTER_WORKER_POOL_TYPES]; 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<scoped_refptr<internal::Task> > orphan_raster_tasks_; 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::vector<PictureLayerImpl*> layers_; 30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TileManager); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_TILE_MANAGER_H_ 307