• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_H_
6 #define CC_RESOURCES_TILE_H_
7 
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/scoped_vector.h"
11 #include "cc/base/ref_counted_managed.h"
12 #include "cc/resources/managed_tile_state.h"
13 #include "cc/resources/picture_pile_impl.h"
14 #include "cc/resources/raster_mode.h"
15 #include "cc/resources/tile_priority.h"
16 #include "ui/gfx/rect.h"
17 #include "ui/gfx/size.h"
18 
19 namespace cc {
20 
21 class CC_EXPORT Tile : public RefCountedManaged<Tile> {
22  public:
23   enum TileRasterFlags { USE_PICTURE_ANALYSIS = 1 << 0 };
24 
25   typedef uint64 Id;
26 
id()27   Id id() const {
28     return id_;
29   }
30 
picture_pile()31   PicturePileImpl* picture_pile() {
32     return picture_pile_.get();
33   }
34 
picture_pile()35   const PicturePileImpl* picture_pile() const {
36     return picture_pile_.get();
37   }
38 
priority(WhichTree tree)39   const TilePriority& priority(WhichTree tree) const {
40     return priority_[tree];
41   }
42 
priority_for_tree_priority(TreePriority tree_priority)43   TilePriority priority_for_tree_priority(TreePriority tree_priority) const {
44     switch (tree_priority) {
45       case SMOOTHNESS_TAKES_PRIORITY:
46         return priority_[ACTIVE_TREE];
47       case NEW_CONTENT_TAKES_PRIORITY:
48         return priority_[PENDING_TREE];
49       case SAME_PRIORITY_FOR_BOTH_TREES:
50         return combined_priority();
51       default:
52         NOTREACHED();
53         return TilePriority();
54     }
55   }
56 
combined_priority()57   TilePriority combined_priority() const {
58     return TilePriority(priority_[ACTIVE_TREE],
59                         priority_[PENDING_TREE]);
60   }
61 
62   void SetPriority(WhichTree tree, const TilePriority& priority);
63 
set_is_occluded(WhichTree tree,bool is_occluded)64   void set_is_occluded(WhichTree tree, bool is_occluded) {
65     is_occluded_[tree] = is_occluded;
66   }
67 
is_occluded(WhichTree tree)68   bool is_occluded(WhichTree tree) const { return is_occluded_[tree]; }
69 
set_shared(bool is_shared)70   void set_shared(bool is_shared) { is_shared_ = is_shared; }
is_shared()71   bool is_shared() const { return is_shared_; }
72 
is_occluded_for_tree_priority(TreePriority tree_priority)73   bool is_occluded_for_tree_priority(TreePriority tree_priority) const {
74     switch (tree_priority) {
75       case SMOOTHNESS_TAKES_PRIORITY:
76         return is_occluded_[ACTIVE_TREE];
77       case NEW_CONTENT_TAKES_PRIORITY:
78         return is_occluded_[PENDING_TREE];
79       case SAME_PRIORITY_FOR_BOTH_TREES:
80         return is_occluded_[ACTIVE_TREE] && is_occluded_[PENDING_TREE];
81       default:
82         NOTREACHED();
83         return false;
84     }
85   }
86 
87   void MarkRequiredForActivation();
88 
required_for_activation()89   bool required_for_activation() const {
90     return priority_[PENDING_TREE].required_for_activation;
91   }
92 
use_picture_analysis()93   bool use_picture_analysis() const {
94     return !!(flags_ & USE_PICTURE_ANALYSIS);
95   }
96 
NeedsRasterForMode(RasterMode mode)97   bool NeedsRasterForMode(RasterMode mode) const {
98     return !managed_state_.tile_versions[mode].IsReadyToDraw();
99   }
100 
HasResources()101   bool HasResources() const {
102     for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
103       if (managed_state_.tile_versions[mode].has_resource())
104         return true;
105     }
106     return false;
107   }
108 
109   void AsValueInto(base::debug::TracedValue* dict) const;
110 
IsReadyToDraw()111   inline bool IsReadyToDraw() const {
112     for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
113       if (managed_state_.tile_versions[mode].IsReadyToDraw())
114         return true;
115     }
116     return false;
117   }
118 
GetTileVersionForDrawing()119   const ManagedTileState::TileVersion& GetTileVersionForDrawing() const {
120     for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
121       if (managed_state_.tile_versions[mode].IsReadyToDraw())
122         return managed_state_.tile_versions[mode];
123     }
124     return managed_state_.tile_versions[HIGH_QUALITY_RASTER_MODE];
125   }
126 
contents_scale()127   float contents_scale() const { return contents_scale_; }
content_rect()128   gfx::Rect content_rect() const { return content_rect_; }
129 
layer_id()130   int layer_id() const { return layer_id_; }
131 
source_frame_number()132   int source_frame_number() const { return source_frame_number_; }
133 
set_picture_pile(scoped_refptr<PicturePileImpl> pile)134   void set_picture_pile(scoped_refptr<PicturePileImpl> pile) {
135     DCHECK(pile->CanRaster(contents_scale_, content_rect_))
136         << "Recording rect: "
137         << gfx::ScaleToEnclosingRect(content_rect_, 1.f / contents_scale_)
138                .ToString();
139     picture_pile_ = pile;
140   }
141 
142   size_t GPUMemoryUsageInBytes() const;
143 
size()144   gfx::Size size() const { return size_; }
145 
146   RasterMode DetermineRasterModeForTree(WhichTree tree) const;
147   RasterMode DetermineOverallRasterMode() const;
148 
149   // Functionality used in tests.
GetRasterModeForTesting()150   RasterMode GetRasterModeForTesting() const {
151     return managed_state().raster_mode;
152   }
GetTileVersionForTesting(RasterMode mode)153   ManagedTileState::TileVersion& GetTileVersionForTesting(RasterMode mode) {
154     return managed_state_.tile_versions[mode];
155   }
156 
157  private:
158   friend class TileManager;
159   friend class PrioritizedTileSet;
160   friend class FakeTileManager;
161   friend class BinComparator;
162   friend class FakePictureLayerImpl;
163 
164   // Methods called by by tile manager.
165   Tile(TileManager* tile_manager,
166        PicturePileImpl* picture_pile,
167        const gfx::Size& tile_size,
168        const gfx::Rect& content_rect,
169        float contents_scale,
170        int layer_id,
171        int source_frame_number,
172        int flags);
173   ~Tile();
174 
managed_state()175   ManagedTileState& managed_state() { return managed_state_; }
managed_state()176   const ManagedTileState& managed_state() const { return managed_state_; }
177   RasterMode DetermineRasterModeForResolution(TileResolution resolution) const;
178 
179   bool HasRasterTask() const;
180 
181   TileManager* tile_manager_;
182   scoped_refptr<PicturePileImpl> picture_pile_;
183   gfx::Size size_;
184   gfx::Rect content_rect_;
185   float contents_scale_;
186   bool is_occluded_[NUM_TREES];
187 
188   TilePriority priority_[NUM_TREES];
189   ManagedTileState managed_state_;
190   int layer_id_;
191   int source_frame_number_;
192   int flags_;
193   bool is_shared_;
194 
195   Id id_;
196   static Id s_next_id_;
197 
198   DISALLOW_COPY_AND_ASSIGN(Tile);
199 };
200 
201 }  // namespace cc
202 
203 #endif  // CC_RESOURCES_TILE_H_
204