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