1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_TILES_TILE_H_
#define CC_TILES_TILE_H_
#include <stddef.h>
#include <stdint.h>
#include <algorithm>
#include <utility>
#include <vector>
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/ref_counted.h"
#include "cc/paint/draw_image.h"
#include "cc/raster/tile_task.h"
#include "cc/tiles/tile_draw_info.h"
#include "ui/gfx/geometry/axis_transform2d.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace cc {
class PictureLayerTiling;
class TileManager;
class CC_EXPORT Tile {
public:
struct CreateInfo {
// RAW_PTR_EXCLUSION: Performance reasons: on-stack pointer + based on
// analysis of sampling profiler data
// (PictureLayerTilingSet::UpdateTilePriorities ->
// PictureLayerTiling::ComputeTilePriorityRects ->
// PictureLayerTiling::SetLiveTilesRect -> creates Tile::CreateInfo).
RAW_PTR_EXCLUSION const PictureLayerTiling* tiling = nullptr;
int tiling_i_index = 0;
int tiling_j_index = 0;
gfx::Rect enclosing_layer_rect;
gfx::Rect content_rect;
gfx::AxisTransform2d raster_transform;
bool can_use_lcd_text = false;
};
enum TileRasterFlags { USE_PICTURE_ANALYSIS = 1 << 0, IS_OPAQUE = 1 << 1 };
typedef uint64_t Id;
Tile(const Tile&) = delete;
~Tile();
Tile& operator=(const Tile&) = delete;
Id id() const {
return id_;
}
// TODO(vmpstr): Move this to the iterators.
bool required_for_activation() const { return required_for_activation_; }
void set_required_for_activation(bool is_required) {
required_for_activation_ = is_required;
}
bool required_for_draw() const { return required_for_draw_; }
void set_required_for_draw(bool is_required) {
required_for_draw_ = is_required;
}
bool is_prepaint() const {
return !required_for_activation() && !required_for_draw();
}
bool use_picture_analysis() const {
return !!(flags_ & USE_PICTURE_ANALYSIS);
}
bool is_opaque() const { return !!(flags_ & IS_OPAQUE); }
void AsValueInto(base::trace_event::TracedValue* value) const;
const TileDrawInfo& draw_info() const { return draw_info_; }
TileDrawInfo& draw_info() { return draw_info_; }
float contents_scale_key() const {
const gfx::Vector2dF& scale = raster_transform_.scale();
return std::max(scale.x(), scale.y());
}
const gfx::AxisTransform2d& raster_transform() const {
return raster_transform_;
}
const gfx::Rect& content_rect() const { return content_rect_; }
const gfx::Rect& enclosing_layer_rect() const {
return enclosing_layer_rect_;
}
int layer_id() const { return layer_id_; }
int source_frame_number() const { return source_frame_number_; }
bool IsReadyToDraw() const { return draw_info().IsReadyToDraw(); }
size_t GPUMemoryUsageInBytes() const;
const gfx::Size& desired_texture_size() const { return content_rect_.size(); }
int tiling_i_index() const { return tiling_i_index_; }
int tiling_j_index() const { return tiling_j_index_; }
void SetInvalidated(const gfx::Rect& invalid_content_rect,
Id previous_tile_id) {
invalidated_content_rect_ = invalid_content_rect;
invalidated_id_ = previous_tile_id;
}
Id invalidated_id() const { return invalidated_id_; }
const gfx::Rect& invalidated_content_rect() const {
return invalidated_content_rect_;
}
bool HasRasterTask() const { return !!raster_task_.get(); }
bool HasMissingLCPCandidateImages() const;
void set_solid_color_analysis_performed(bool performed) {
is_solid_color_analysis_performed_ = performed;
}
bool is_solid_color_analysis_performed() const {
return is_solid_color_analysis_performed_;
}
bool can_use_lcd_text() const { return can_use_lcd_text_; }
bool set_raster_task_scheduled_with_checker_images(bool has_checker_images) {
bool previous_value = raster_task_scheduled_with_checker_images_;
raster_task_scheduled_with_checker_images_ = has_checker_images;
return previous_value;
}
bool raster_task_scheduled_with_checker_images() const {
return raster_task_scheduled_with_checker_images_;
}
const PictureLayerTiling* tiling() const { return tiling_; }
void set_tiling(const PictureLayerTiling* tiling) { tiling_ = tiling; }
void mark_used() { used_ = true; }
void clear_used() { used_ = false; }
bool used() const { return used_; }
bool deleted() const { return deleted_; }
private:
friend class TileManager;
friend class FakeTileManager;
friend class FakePictureLayerImpl;
// Methods called by by tile manager.
Tile(TileManager* tile_manager,
const CreateInfo& info,
int layer_id,
int source_frame_number,
int flags);
// RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling
// profiler data (PictureLayerTilingSet::UpdateTilePriorities ->
// PictureLayerTiling::ComputeTilePriorityRects ->
// PictureLayerTiling::SetLiveTilesRect -> PictureLayerTiling::CreateTile ->
// allocates Tile).
RAW_PTR_EXCLUSION TileManager* const tile_manager_;
RAW_PTR_EXCLUSION const PictureLayerTiling* tiling_;
const gfx::Rect content_rect_;
const gfx::Rect enclosing_layer_rect_;
const gfx::AxisTransform2d raster_transform_;
TileDrawInfo draw_info_;
const int layer_id_;
const int source_frame_number_;
const int flags_;
const int tiling_i_index_;
const int tiling_j_index_;
// The |id_| of the Tile that was invalidated and replaced by this tile.
Id invalidated_id_ = 0;
unsigned scheduled_priority_ = 0;
bool required_for_activation_ : 1 = false;
bool required_for_draw_ : 1 = false;
bool is_solid_color_analysis_performed_ : 1 = false;
const bool can_use_lcd_text_ : 1;
// Set to true if there is a raster task scheduled for this tile that will
// rasterize a resource with checker images.
bool raster_task_scheduled_with_checker_images_ : 1 = false;
// Set to true in destructor.
bool deleted_ : 1 = false;
Id id_;
// List of Rect-Transform pairs, representing unoccluded parts of the
// tile, to support raster culling. See Bug: 1071932
std::vector<std::pair<const gfx::Rect, const gfx::AxisTransform2d>>
raster_rects_;
// The rect bounding the changes in this Tile vs the previous tile it
// replaced.
gfx::Rect invalidated_content_rect_;
scoped_refptr<TileTask> raster_task_;
bool used_ = false;
};
} // namespace cc
#endif // CC_TILES_TILE_H_
|