blob: 2e226c9999d9c0cbd1f221f1bdc189ea16aaf15d [file] [log] [blame]
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00001// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_RESOURCES_TILE_MANAGER_H_
6#define CC_RESOURCES_TILE_MANAGER_H_
7
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00008#include <queue>
9#include <set>
10#include <vector>
11
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010012#include "base/containers/hash_tables.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000013#include "base/memory/scoped_ptr.h"
14#include "base/values.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000015#include "cc/debug/rendering_stats_instrumentation.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010016#include "cc/resources/managed_tile_state.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000017#include "cc/resources/memory_history.h"
18#include "cc/resources/picture_pile_impl.h"
Ben Murdochbb1529c2013-08-08 10:24:53 +010019#include "cc/resources/prioritized_tile_set.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010020#include "cc/resources/raster_worker_pool.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000021#include "cc/resources/resource_pool.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010022#include "cc/resources/tile.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000023
24namespace cc {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000025class ResourceProvider;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000026
27class CC_EXPORT TileManagerClient {
28 public:
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010029 virtual void NotifyReadyToActivate() = 0;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000030
31 protected:
32 virtual ~TileManagerClient() {}
33};
34
Ben Murdochca12bfa2013-07-23 11:17:05 +010035struct RasterTaskCompletionStats {
36 RasterTaskCompletionStats();
37
38 size_t completed_count;
39 size_t canceled_count;
40};
41scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue(
42 const RasterTaskCompletionStats& stats);
43
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000044// This class manages tiles, deciding which should get rasterized and which
45// should no longer have any memory assigned to them. Tile objects are "owned"
46// by layers; they automatically register with the manager when they are
47// created, and unregister from the manager when they are deleted.
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010048class CC_EXPORT TileManager : public RasterWorkerPoolClient {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000049 public:
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010050 static scoped_ptr<TileManager> Create(
51 TileManagerClient* client,
52 ResourceProvider* resource_provider,
53 size_t num_raster_threads,
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010054 RenderingStatsInstrumentation* rendering_stats_instrumentation,
55 bool use_map_image);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000056 virtual ~TileManager();
57
58 const GlobalStateThatImpactsTilePriority& GlobalState() const {
59 return global_state_;
60 }
61 void SetGlobalState(const GlobalStateThatImpactsTilePriority& state);
62
63 void ManageTiles();
Ben Murdochca12bfa2013-07-23 11:17:05 +010064
65 // Returns true when visible tiles have been initialized.
66 bool UpdateVisibleTiles();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000067
68 scoped_ptr<base::Value> BasicStateAsValue() const;
69 scoped_ptr<base::Value> AllTilesAsValue() const;
70 void GetMemoryStats(size_t* memory_required_bytes,
71 size_t* memory_nice_to_have_bytes,
72 size_t* memory_used_bytes) const;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000073
74 const MemoryHistory::Entry& memory_stats_from_last_assign() const {
75 return memory_stats_from_last_assign_;
76 }
77
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010078 bool AreTilesRequiredForActivationReady() const {
Ben Murdochca12bfa2013-07-23 11:17:05 +010079 return all_tiles_required_for_activation_have_been_initialized_;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010080 }
81
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000082 protected:
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010083 TileManager(TileManagerClient* client,
84 ResourceProvider* resource_provider,
85 scoped_ptr<RasterWorkerPool> raster_worker_pool,
86 size_t num_raster_threads,
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010087 RenderingStatsInstrumentation* rendering_stats_instrumentation,
88 GLenum texture_format);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010089
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000090 // Methods called by Tile
91 friend class Tile;
92 void RegisterTile(Tile* tile);
93 void UnregisterTile(Tile* tile);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000094
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010095 // Overriden from RasterWorkerPoolClient:
96 virtual bool ShouldForceTasksRequiredForActivationToComplete() const
97 OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010098 virtual void DidFinishRunningTasks() OVERRIDE;
99 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE;
100
101 typedef std::vector<Tile*> TileVector;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100102 typedef std::set<Tile*> TileSet;
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100103
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100104 // Virtual for test
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100105 virtual void ScheduleTasks(
106 const TileVector& tiles_that_need_to_be_rasterized);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000107
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100108 void AssignGpuMemoryToTiles(
Ben Murdochbb1529c2013-08-08 10:24:53 +0100109 PrioritizedTileSet* tiles,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100110 TileVector* tiles_that_need_to_be_rasterized);
Ben Murdochbb1529c2013-08-08 10:24:53 +0100111 void GetTilesWithAssignedBins(PrioritizedTileSet* tiles);
112 void GetPrioritizedTileSet(PrioritizedTileSet* tiles);
Ben Murdocheb525c52013-07-10 11:40:50 +0100113
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100114 private:
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100115 void OnImageDecodeTaskCompleted(
116 int layer_id,
117 skia::LazyPixelRef* pixel_ref,
118 bool was_canceled);
119 void OnRasterTaskCompleted(
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100120 Tile::Id tile,
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100121 scoped_ptr<ResourcePool::Resource> resource,
122 RasterMode raster_mode,
123 const PicturePileImpl::Analysis& analysis,
124 bool was_canceled);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000125
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100126 RasterMode DetermineRasterMode(const Tile* tile) const;
127 void CleanUpUnusedImageDecodeTasks();
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100128 void FreeResourceForTile(Tile* tile, RasterMode mode);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000129 void FreeResourcesForTile(Tile* tile);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100130 void FreeUnusedResourcesForTile(Tile* tile);
131 RasterWorkerPool::Task CreateImageDecodeTask(
132 Tile* tile, skia::LazyPixelRef* pixel_ref);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100133 RasterWorkerPool::RasterTask CreateRasterTask(Tile* tile);
Ben Murdocheb525c52013-07-10 11:40:50 +0100134 scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000135
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000136 TileManagerClient* client_;
137 scoped_ptr<ResourcePool> resource_pool_;
138 scoped_ptr<RasterWorkerPool> raster_worker_pool_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000139 GlobalStateThatImpactsTilePriority global_state_;
140
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100141 typedef base::hash_map<Tile::Id, Tile*> TileMap;
142 TileMap tiles_;
143
Ben Murdochbb1529c2013-08-08 10:24:53 +0100144 PrioritizedTileSet prioritized_tiles_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100145
Ben Murdochca12bfa2013-07-23 11:17:05 +0100146 bool all_tiles_that_need_to_be_rasterized_have_memory_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100147 bool all_tiles_required_for_activation_have_memory_;
Ben Murdochca12bfa2013-07-23 11:17:05 +0100148 bool all_tiles_required_for_activation_have_been_initialized_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000149
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000150 bool ever_exceeded_memory_budget_;
151 MemoryHistory::Entry memory_stats_from_last_assign_;
152
153 RenderingStatsInstrumentation* rendering_stats_instrumentation_;
154
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100155 bool did_initialize_visible_tile_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000156
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100157 GLenum texture_format_;
158
159 typedef base::hash_map<uint32_t, RasterWorkerPool::Task> PixelRefTaskMap;
160 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap;
161 LayerPixelRefTaskMap image_decode_tasks_;
162
Ben Murdochca12bfa2013-07-23 11:17:05 +0100163 RasterTaskCompletionStats update_visible_tiles_stats_;
164
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000165 DISALLOW_COPY_AND_ASSIGN(TileManager);
166};
167
168} // namespace cc
169
170#endif // CC_RESOURCES_TILE_MANAGER_H_