blob: be9b19a4f1b264060f1a42dff52a4413a6dec8c2 [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_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/resources/managed_tile_state.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010012#include "cc/resources/raster_mode.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000013#include "cc/resources/tile_priority.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000014#include "ui/gfx/rect.h"
15#include "ui/gfx/size.h"
16
17namespace cc {
18
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010019class PicturePileImpl;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000020
21class CC_EXPORT Tile : public base::RefCounted<Tile> {
22 public:
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010023 typedef uint64 Id;
24
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000025 Tile(TileManager* tile_manager,
26 PicturePileImpl* picture_pile,
27 gfx::Size tile_size,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000028 gfx::Rect content_rect,
29 gfx::Rect opaque_rect,
30 float contents_scale,
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010031 int layer_id,
Ben Murdocheb525c52013-07-10 11:40:50 +010032 int source_frame_number,
33 bool can_use_lcd_text);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000034
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010035 Id id() const {
36 return id_;
37 }
38
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000039 PicturePileImpl* picture_pile() {
40 return picture_pile_.get();
41 }
42
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010043 const PicturePileImpl* picture_pile() const {
44 return picture_pile_.get();
45 }
46
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000047 const TilePriority& priority(WhichTree tree) const {
48 return priority_[tree];
49 }
50
51 TilePriority combined_priority() const {
52 return TilePriority(priority_[ACTIVE_TREE],
53 priority_[PENDING_TREE]);
54 }
55
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010056 void SetPriority(WhichTree tree, const TilePriority& priority) {
57 priority_[tree] = priority;
58 }
59
60 void mark_required_for_activation() {
61 priority_[PENDING_TREE].required_for_activation = true;
62 }
63
64 bool required_for_activation() const {
65 return priority_[PENDING_TREE].required_for_activation;
66 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000067
Ben Murdocheb525c52013-07-10 11:40:50 +010068 void set_can_use_lcd_text(bool can_use_lcd_text) {
69 can_use_lcd_text_ = can_use_lcd_text;
70 }
71
72 bool can_use_lcd_text() const {
73 return can_use_lcd_text_;
74 }
75
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000076 scoped_ptr<base::Value> AsValue() const;
77
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010078 bool IsReadyToDraw() const {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010079 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010080 if (managed_state_.tile_versions[mode].IsReadyToDraw())
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010081 return true;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010082 }
83 return false;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000084 }
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010085
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010086 const ManagedTileState::TileVersion& GetTileVersionForDrawing() const {
87 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
88 if (managed_state_.tile_versions[mode].IsReadyToDraw())
89 return managed_state_.tile_versions[mode];
90 }
91 return managed_state_.tile_versions[HIGH_QUALITY_RASTER_MODE];
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000092 }
93
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010094 gfx::Rect opaque_rect() const { return opaque_rect_; }
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010095 bool has_text(RasterMode mode) const {
96 return managed_state_.tile_versions[mode].has_text_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010097 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000098
99 float contents_scale() const { return contents_scale_; }
100 gfx::Rect content_rect() const { return content_rect_; }
101
102 int layer_id() const { return layer_id_; }
103
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100104 int source_frame_number() const { return source_frame_number_; }
105
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000106 void set_picture_pile(scoped_refptr<PicturePileImpl> pile) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100107 DCHECK(pile->CanRaster(contents_scale_, content_rect_));
108 picture_pile_ = pile;
109 }
110
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100111 size_t GPUMemoryUsageInBytes() const;
112
Ben Murdocheb525c52013-07-10 11:40:50 +0100113 RasterMode GetRasterModeForTesting() const {
114 return managed_state().raster_mode;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000115 }
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100116 ManagedTileState::TileVersion& GetTileVersionForTesting(RasterMode mode) {
117 return managed_state_.tile_versions[mode];
118 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000119
120 private:
121 // Methods called by by tile manager.
122 friend class TileManager;
Ben Murdochbb1529c2013-08-08 10:24:53 +0100123 friend class PrioritizedTileSet;
Ben Murdocheb525c52013-07-10 11:40:50 +0100124 friend class FakeTileManager;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000125 friend class BinComparator;
126 ManagedTileState& managed_state() { return managed_state_; }
127 const ManagedTileState& managed_state() const { return managed_state_; }
128
129 inline size_t bytes_consumed_if_allocated() const {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000130 return 4 * tile_size_.width() * tile_size_.height();
131 }
132
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000133 // Normal private methods.
134 friend class base::RefCounted<Tile>;
135 ~Tile();
136
137 TileManager* tile_manager_;
138 scoped_refptr<PicturePileImpl> picture_pile_;
139 gfx::Rect tile_size_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000140 gfx::Rect content_rect_;
141 float contents_scale_;
142 gfx::Rect opaque_rect_;
143
144 TilePriority priority_[NUM_BIN_PRIORITIES];
145 ManagedTileState managed_state_;
146 int layer_id_;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100147 int source_frame_number_;
Ben Murdocheb525c52013-07-10 11:40:50 +0100148 bool can_use_lcd_text_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100149
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100150 Id id_;
151 static Id s_next_id_;
152
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100153 DISALLOW_COPY_AND_ASSIGN(Tile);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000154};
155
156} // namespace cc
157
158#endif // CC_RESOURCES_TILE_H_