1 // 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_PRIORITY_H_ 6 #define CC_RESOURCES_TILE_PRIORITY_H_ 7 8 #include <algorithm> 9 #include <limits> 10 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "cc/resources/picture_pile.h" 14 #include "ui/gfx/quad_f.h" 15 #include "ui/gfx/rect.h" 16 #include "ui/gfx/size.h" 17 18 namespace base { 19 class Value; 20 } 21 22 namespace cc { 23 24 enum WhichTree { 25 // Note: these must be 0 and 1 because we index with them in various places, 26 // e.g. in Tile::priority_. 27 ACTIVE_TREE = 0, 28 PENDING_TREE = 1, 29 NUM_TREES = 2 30 // Be sure to update WhichTreeAsValue when adding new fields. 31 }; 32 scoped_ptr<base::Value> WhichTreeAsValue( 33 WhichTree tree); 34 35 enum TileResolution { 36 LOW_RESOLUTION = 0 , 37 HIGH_RESOLUTION = 1, 38 NON_IDEAL_RESOLUTION = 2, 39 }; 40 scoped_ptr<base::Value> TileResolutionAsValue( 41 TileResolution resolution); 42 43 struct CC_EXPORT TilePriority { 44 enum PriorityBin { NOW, SOON, EVENTUALLY }; 45 46 TilePriority() 47 : resolution(NON_IDEAL_RESOLUTION), 48 required_for_activation(false), 49 priority_bin(EVENTUALLY), 50 distance_to_visible(std::numeric_limits<float>::infinity()) {} 51 52 TilePriority(TileResolution resolution, 53 PriorityBin bin, 54 float distance_to_visible) 55 : resolution(resolution), 56 required_for_activation(false), 57 priority_bin(bin), 58 distance_to_visible(distance_to_visible) {} 59 60 TilePriority(const TilePriority& active, const TilePriority& pending) { 61 if (active.resolution == HIGH_RESOLUTION || 62 pending.resolution == HIGH_RESOLUTION) 63 resolution = HIGH_RESOLUTION; 64 else if (active.resolution == LOW_RESOLUTION || 65 pending.resolution == LOW_RESOLUTION) 66 resolution = LOW_RESOLUTION; 67 else 68 resolution = NON_IDEAL_RESOLUTION; 69 70 required_for_activation = 71 active.required_for_activation || pending.required_for_activation; 72 73 if (active.priority_bin < pending.priority_bin) { 74 priority_bin = active.priority_bin; 75 distance_to_visible = active.distance_to_visible; 76 } else if (active.priority_bin > pending.priority_bin) { 77 priority_bin = pending.priority_bin; 78 distance_to_visible = pending.distance_to_visible; 79 } else { 80 priority_bin = active.priority_bin; 81 distance_to_visible = 82 std::min(active.distance_to_visible, pending.distance_to_visible); 83 } 84 } 85 86 scoped_ptr<base::Value> AsValue() const; 87 88 bool operator ==(const TilePriority& other) const { 89 return resolution == other.resolution && 90 priority_bin == other.priority_bin && 91 distance_to_visible == other.distance_to_visible && 92 required_for_activation == other.required_for_activation; 93 } 94 95 bool operator !=(const TilePriority& other) const { 96 return !(*this == other); 97 } 98 99 bool IsHigherPriorityThan(const TilePriority& other) const { 100 return priority_bin < other.priority_bin || 101 (priority_bin == other.priority_bin && 102 distance_to_visible < other.distance_to_visible); 103 } 104 105 TileResolution resolution; 106 bool required_for_activation; 107 PriorityBin priority_bin; 108 float distance_to_visible; 109 }; 110 111 scoped_ptr<base::Value> TilePriorityBinAsValue(TilePriority::PriorityBin bin); 112 113 enum TileMemoryLimitPolicy { 114 // Nothing. 115 ALLOW_NOTHING = 0, 116 117 // You might be made visible, but you're not being interacted with. 118 ALLOW_ABSOLUTE_MINIMUM = 1, // Tall. 119 120 // You're being interacted with, but we're low on memory. 121 ALLOW_PREPAINT_ONLY = 2, // Grande. 122 123 // You're the only thing in town. Go crazy. 124 ALLOW_ANYTHING = 3, // Venti. 125 126 NUM_TILE_MEMORY_LIMIT_POLICIES = 4, 127 128 // NOTE: Be sure to update TreePriorityAsValue and kBinPolicyMap when adding 129 // or reordering fields. 130 }; 131 scoped_ptr<base::Value> TileMemoryLimitPolicyAsValue( 132 TileMemoryLimitPolicy policy); 133 134 enum TreePriority { 135 SAME_PRIORITY_FOR_BOTH_TREES, 136 SMOOTHNESS_TAKES_PRIORITY, 137 NEW_CONTENT_TAKES_PRIORITY 138 139 // Be sure to update TreePriorityAsValue when adding new fields. 140 }; 141 scoped_ptr<base::Value> TreePriorityAsValue(TreePriority prio); 142 143 class GlobalStateThatImpactsTilePriority { 144 public: 145 GlobalStateThatImpactsTilePriority() 146 : memory_limit_policy(ALLOW_NOTHING), 147 soft_memory_limit_in_bytes(0), 148 hard_memory_limit_in_bytes(0), 149 num_resources_limit(0), 150 tree_priority(SAME_PRIORITY_FOR_BOTH_TREES) {} 151 152 TileMemoryLimitPolicy memory_limit_policy; 153 154 size_t soft_memory_limit_in_bytes; 155 size_t hard_memory_limit_in_bytes; 156 size_t num_resources_limit; 157 158 TreePriority tree_priority; 159 160 bool operator==(const GlobalStateThatImpactsTilePriority& other) const { 161 return memory_limit_policy == other.memory_limit_policy && 162 soft_memory_limit_in_bytes == other.soft_memory_limit_in_bytes && 163 hard_memory_limit_in_bytes == other.hard_memory_limit_in_bytes && 164 num_resources_limit == other.num_resources_limit && 165 tree_priority == other.tree_priority; 166 } 167 bool operator!=(const GlobalStateThatImpactsTilePriority& other) const { 168 return !(*this == other); 169 } 170 171 scoped_ptr<base::Value> AsValue() const; 172 }; 173 174 } // namespace cc 175 176 #endif // CC_RESOURCES_TILE_PRIORITY_H_ 177