tile_manager.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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:
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static scoped_ptr<TileManager> Create(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TileManagerClient* client,
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::SequencedTaskRunner* task_runner,
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ResourcePool* resource_pool,
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      Rasterizer* rasterizer,
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      RenderingStatsInstrumentation* rendering_stats_instrumentation);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TileManager();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ManageTiles(const GlobalStateThatImpactsTilePriority& state);
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Returns true when visible tiles have been initialized.
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool UpdateVisibleTiles();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const gfx::Size& tile_size,
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const gfx::Rect& content_rect,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const gfx::Rect& opaque_rect,
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 float contents_scale,
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 int layer_id,
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                 int source_frame_number,
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 int flags);
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<base::debug::ConvertableToTraceFormat> BasicStateAsValue()
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const;
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void BasicStateAsValueInto(base::debug::TracedValue* dict) const;
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AllTilesAsValueInto(base::debug::TracedValue* array) const;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const MemoryHistory::Entry& memory_stats_from_last_assign() const {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return memory_stats_from_last_assign_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void InitializeTilesWithResourcesForTesting(const std::vector<Tile*>& tiles) {
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for (size_t i = 0; i < tiles.size(); ++i) {
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ManagedTileState& mts = tiles[i]->managed_state();
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ManagedTileState::TileVersion& tile_version =
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          mts.tile_versions[HIGH_QUALITY_RASTER_MODE];
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tile_version.resource_ = resource_pool_->AcquireResource(gfx::Size(1, 1));
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]);
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ++resources_releasable_;
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ReleaseTileResourcesForTesting(const std::vector<Tile*>& tiles) {
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t i = 0; i < tiles.size(); ++i) {
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      Tile* tile = tiles[i];
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        FreeResourceForTile(tile, static_cast<RasterMode>(mode));
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetGlobalStateForTesting(
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GlobalStateThatImpactsTilePriority& state) {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Soft limit is used for resource pool such that
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // memory returns to soft limit after going over.
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (state != global_state_) {
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      global_state_ = state;
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      prioritized_tiles_dirty_ = true;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetRasterizerForTesting(Rasterizer* rasterizer);
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void FreeResourcesAndCleanUpReleasedTilesForTesting() {
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    prioritized_tiles_.Clear();
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    FreeResourcesForReleasedTiles();
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CleanUpReleasedTiles();
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TileManager(TileManagerClient* client,
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              base::SequencedTaskRunner* task_runner,
163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              ResourcePool* resource_pool,
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              Rasterizer* rasterizer,
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              RenderingStatsInstrumentation* rendering_stats_instrumentation);
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Methods called by Tile
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend class Tile;
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void DidChangeTilePriority(Tile* tile);
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void FreeResourcesForReleasedTiles();
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void CleanUpReleasedTiles();
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overriden from RefCountedManager<Tile>:
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void Release(Tile* tile) OVERRIDE;
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Overriden from RasterizerClient:
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool ShouldForceTasksRequiredForActivationToComplete() const OVERRIDE;
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidFinishRunningTasks() OVERRIDE;
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE;
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef std::vector<Tile*> TileVector;
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef std::set<Tile*> TileSet;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Virtual for test
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void ScheduleTasks(
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const TileVector& tiles_that_need_to_be_rasterized);
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AssignGpuMemoryToTiles(PrioritizedTileSet* tiles,
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              TileVector* tiles_that_need_to_be_rasterized);
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void GetTilesWithAssignedBins(PrioritizedTileSet* tiles);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnImageDecodeTaskCompleted(int layer_id,
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  SkPixelRef* pixel_ref,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  bool was_canceled);
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnRasterTaskCompleted(Tile::Id tile,
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             scoped_ptr<ScopedResource> resource,
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             RasterMode raster_mode,
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const PicturePileImpl::Analysis& analysis,
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             bool was_canceled);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  inline size_t BytesConsumedIfAllocated(const Tile* tile) const {
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return Resource::MemorySizeBytes(tile->size(),
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     resource_pool_->resource_format());
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void FreeResourceForTile(Tile* tile, RasterMode mode);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FreeResourcesForTile(Tile* tile);
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void FreeUnusedResourcesForTile(Tile* tile);
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(Tile* tile);
212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<ImageDecodeTask> CreateImageDecodeTask(Tile* tile,
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                       SkPixelRef* pixel_ref);
214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<RasterTask> CreateRasterTask(Tile* tile);
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void UpdatePrioritizedTileSetIfNeeded();
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool IsReadyToActivate() const;
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CheckIfReadyToActivate();
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TileManagerClient* client_;
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> task_runner_;
222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ResourcePool* resource_pool_;
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Rasterizer* rasterizer_;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GlobalStateThatImpactsTilePriority global_state_;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef base::hash_map<Tile::Id, Tile*> TileMap;
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TileMap tiles_;
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PrioritizedTileSet prioritized_tiles_;
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool prioritized_tiles_dirty_;
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool all_tiles_that_need_to_be_rasterized_have_memory_;
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool all_tiles_required_for_activation_have_memory_;
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t bytes_releasable_;
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t resources_releasable_;
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool ever_exceeded_memory_budget_;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MemoryHistory::Entry memory_stats_from_last_assign_;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderingStatsInstrumentation* rendering_stats_instrumentation_;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool did_initialize_visible_tile_;
244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool did_check_for_completed_tasks_since_last_schedule_tasks_;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
246a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef base::hash_map<uint32_t, scoped_refptr<ImageDecodeTask> >
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      PixelRefTaskMap;
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LayerPixelRefTaskMap image_decode_tasks_;
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef base::hash_map<int, int> LayerCountMap;
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerCountMap used_layer_counts_;
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RasterTaskCompletionStats update_visible_tiles_stats_;
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::vector<Tile*> released_tiles_;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ResourceFormat resource_format_;
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Queue used when scheduling raster tasks.
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RasterTaskQueue raster_queue_;
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::vector<scoped_refptr<RasterTask> > orphan_raster_tasks_;
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UniqueNotifier ready_to_activate_check_notifier_;
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TileManager);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_RESOURCES_TILE_MANAGER_H_
273