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