Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 1 | // Copyright 2013 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_MANAGED_TILE_STATE_H_ |
| 6 | #define CC_RESOURCES_MANAGED_TILE_STATE_H_ |
| 7 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 8 | #include "base/memory/scoped_ptr.h" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 9 | #include "cc/resources/platform_color.h" |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 10 | #include "cc/resources/raster_worker_pool.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 11 | #include "cc/resources/resource_pool.h" |
| 12 | #include "cc/resources/resource_provider.h" |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 13 | |
| 14 | namespace cc { |
| 15 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 16 | class TileManager; |
| 17 | |
| 18 | // Tile manager classifying tiles into a few basic bins: |
| 19 | enum ManagedTileBin { |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 20 | NOW_AND_READY_TO_DRAW_BIN = 0, // Ready to draw and within viewport. |
| 21 | NOW_BIN = 1, // Needed ASAP. |
| 22 | SOON_BIN = 2, // Impl-side version of prepainting. |
| 23 | EVENTUALLY_AND_ACTIVE_BIN = 3, // Nice to have, and has a task or resource. |
| 24 | EVENTUALLY_BIN = 4, // Nice to have, if we've got memory and time. |
| 25 | NEVER_AND_ACTIVE_BIN = 5, // Dont bother, but has a task or resource. |
| 26 | NEVER_BIN = 6, // Dont bother. |
| 27 | NUM_BINS = 7 |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 28 | // NOTE: Be sure to update ManagedTileBinAsValue and kBinPolicyMap when adding |
| 29 | // or reordering fields. |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 30 | }; |
| 31 | scoped_ptr<base::Value> ManagedTileBinAsValue( |
| 32 | ManagedTileBin bin); |
| 33 | |
| 34 | enum ManagedTileBinPriority { |
| 35 | HIGH_PRIORITY_BIN = 0, |
| 36 | LOW_PRIORITY_BIN = 1, |
| 37 | NUM_BIN_PRIORITIES = 2 |
| 38 | }; |
| 39 | scoped_ptr<base::Value> ManagedTileBinPriorityAsValue( |
| 40 | ManagedTileBinPriority bin); |
| 41 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 42 | // This is state that is specific to a tile that is |
| 43 | // managed by the TileManager. |
| 44 | class CC_EXPORT ManagedTileState { |
| 45 | public: |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 46 | class CC_EXPORT TileVersion { |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 47 | public: |
| 48 | enum Mode { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 49 | RESOURCE_MODE, |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 50 | SOLID_COLOR_MODE, |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 51 | PICTURE_PILE_MODE, |
| 52 | NUM_MODES |
| 53 | }; |
| 54 | |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 55 | TileVersion(); |
| 56 | ~TileVersion(); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 57 | |
| 58 | Mode mode() const { |
| 59 | return mode_; |
| 60 | } |
| 61 | |
| 62 | bool IsReadyToDraw() const; |
| 63 | |
| 64 | ResourceProvider::ResourceId get_resource_id() const { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 65 | DCHECK(mode_ == RESOURCE_MODE); |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 66 | DCHECK(resource_); |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 67 | |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 68 | return resource_->id(); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | SkColor get_solid_color() const { |
| 72 | DCHECK(mode_ == SOLID_COLOR_MODE); |
| 73 | |
| 74 | return solid_color_; |
| 75 | } |
| 76 | |
| 77 | bool contents_swizzled() const { |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 78 | DCHECK(resource_); |
| 79 | return !PlatformColor::SameComponentOrder(resource_->format()); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 80 | } |
| 81 | |
| 82 | bool requires_resource() const { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 83 | return mode_ == RESOURCE_MODE || |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 84 | mode_ == PICTURE_PILE_MODE; |
| 85 | } |
| 86 | |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 87 | size_t GPUMemoryUsageInBytes() const; |
| 88 | |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 89 | void SetResourceForTesting(scoped_ptr<ResourcePool::Resource> resource) { |
| 90 | resource_ = resource.Pass(); |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 91 | } |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 92 | const ResourcePool::Resource* GetResourceForTesting() const { |
| 93 | return resource_.get(); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 94 | } |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 95 | void SetSolidColorForTesting(SkColor color) { |
| 96 | set_solid_color(color); |
| 97 | } |
| 98 | void SetHasTextForTesting(bool has_text) { |
| 99 | has_text_ = has_text; |
| 100 | } |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 101 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 102 | private: |
| 103 | friend class TileManager; |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 104 | friend class PrioritizedTileSet; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 105 | friend class Tile; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 106 | friend class ManagedTileState; |
| 107 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 108 | void set_use_resource() { |
| 109 | mode_ = RESOURCE_MODE; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | void set_solid_color(const SkColor& color) { |
| 113 | mode_ = SOLID_COLOR_MODE; |
| 114 | solid_color_ = color; |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | void set_has_text(bool has_text) { |
| 118 | has_text_ = has_text; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 119 | } |
| 120 | |
| 121 | void set_rasterize_on_demand() { |
| 122 | mode_ = PICTURE_PILE_MODE; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 123 | } |
| 124 | |
| 125 | Mode mode_; |
| 126 | SkColor solid_color_; |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 127 | bool has_text_; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 128 | scoped_ptr<ResourcePool::Resource> resource_; |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 129 | RasterWorkerPool::RasterTask raster_task_; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 130 | }; |
| 131 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 132 | ManagedTileState(); |
| 133 | ~ManagedTileState(); |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 134 | |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 135 | scoped_ptr<base::Value> AsValue() const; |
| 136 | |
| 137 | // Persisted state: valid all the time. |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 138 | TileVersion tile_versions[NUM_RASTER_MODES]; |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 139 | RasterMode raster_mode; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 140 | |
| 141 | // Ephemeral state, valid only during TileManager::ManageTiles. |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 142 | bool is_in_never_bin_on_both_trees() const { |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 143 | return (bin[HIGH_PRIORITY_BIN] == NEVER_BIN || |
| 144 | bin[HIGH_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN) && |
| 145 | (bin[LOW_PRIORITY_BIN] == NEVER_BIN || |
| 146 | bin[LOW_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 147 | } |
| 148 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 149 | ManagedTileBin bin[NUM_BIN_PRIORITIES]; |
| 150 | ManagedTileBin tree_bin[NUM_TREES]; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 151 | |
| 152 | // The bin that the tile would have if the GPU memory manager had |
| 153 | // a maximally permissive policy, send to the GPU memory manager |
| 154 | // to determine policy. |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 155 | ManagedTileBin gpu_memmgr_stats_bin; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 156 | TileResolution resolution; |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 157 | bool required_for_activation; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 158 | float time_to_needed_in_seconds; |
| 159 | float distance_to_visible_in_pixels; |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 160 | bool visible_and_ready_to_draw; |
Ben Murdoch | 2385ea3 | 2013-08-06 11:01:04 +0100 | [diff] [blame] | 161 | |
| 162 | // Priority for this state from the last time we assigned memory. |
| 163 | unsigned scheduled_priority; |
Torne (Richard Coles) | 2a99a7e | 2013-03-28 15:31:22 +0000 | [diff] [blame] | 164 | }; |
| 165 | |
| 166 | } // namespace cc |
| 167 | |
| 168 | #endif // CC_RESOURCES_MANAGED_TILE_STATE_H_ |