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