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