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
cc / raster / raster_source.h [blame]
// Copyright 2014 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_RASTER_RASTER_SOURCE_H_
#define CC_RASTER_RASTER_SOURCE_H_
#include <stddef.h>
#include <memory>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "cc/cc_export.h"
#include "cc/debug/rendering_stats_instrumentation.h"
#include "cc/layers/recording_source.h"
#include "cc/paint/image_id.h"
#include "cc/paint/scroll_offset_map.h"
#include "gpu/command_buffer/client/raster_interface.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "ui/gfx/color_space.h"
namespace base {
namespace trace_event {
class TracedValue;
} // namespace trace_event
} // namespace base
namespace gfx {
class AxisTransform2d;
} // namespace gfx
namespace cc {
class DisplayItemList;
class ImageProvider;
class CC_EXPORT RasterSource : public base::RefCountedThreadSafe<RasterSource> {
public:
struct CC_EXPORT PlaybackSettings {
PlaybackSettings();
PlaybackSettings(const PlaybackSettings&);
PlaybackSettings(PlaybackSettings&&);
~PlaybackSettings();
// If set to true, we should use LCD text.
bool use_lcd_text = true;
// Specifies the sample count if MSAA is enabled for this tile.
int msaa_sample_count = 0;
// Visible hint, GPU may use it as a hint to schedule raster tasks.
bool visible = false;
// The HDR headroom to use when tone mapping content.
float hdr_headroom = 1.f;
raw_ptr<ImageProvider> image_provider = nullptr;
raw_ptr<const ScrollOffsetMap> raster_inducing_scroll_offsets = nullptr;
};
RasterSource(const RasterSource&) = delete;
RasterSource& operator=(const RasterSource&) = delete;
// This is useful for rastering into tiles. |canvas| is expected to be backed
// by a tile, with a default state. |raster_transform| will be applied to the
// display list, rastering the list into the "content space".
// |canvas_bitmap_rect| defines the extent of the tile in the content space,
// i.e. contents in the rect will be cropped and translated onto the canvas.
// |canvas_playback_rect| can be used to replay only part of the recording in,
// the content space, so only a sub-rect of the tile gets rastered.
//
// Note that this should only be called after the image decode controller has
// been set, which happens during commit.
void PlaybackToCanvas(SkCanvas* canvas,
const gfx::Size& content_size,
const gfx::Rect& canvas_bitmap_rect,
const gfx::Rect& canvas_playback_rect,
const gfx::AxisTransform2d& raster_transform,
const PlaybackSettings& settings) const;
// Returns whether the given rect at given scale is of solid color in
// this raster source, as well as the solid color value.
//
// If max_ops_to_analyze is set, changes the default maximum number of
// operations to analyze before giving up. Careful: even very simple lists can
// have more than one operation, so 1 may not be the value you're looking
// for. For instance, solid color tiles generated for views have 3
// operations. See comments in TileManager::AssignGpuMemoryToTils() for
// details.
bool PerformSolidColorAnalysis(gfx::Rect content_rect,
SkColor4f* color,
int max_ops_to_analyze = 1) const;
// Returns true iff the whole raster source is of solid color.
bool IsSolidColor() const;
// Returns the color of the raster source if it is solid color. The results
// are unspecified if IsSolidColor returns false.
SkColor4f GetSolidColor() const;
// Returns the recorded layer size of this raster source.
gfx::Size size() const { return size_; }
// Returns the content size of this raster source at a particular scale.
gfx::Size GetContentSize(const gfx::Vector2dF& content_scale) const;
// Return true iff this raster source can raster the given rect in layer
// space.
bool IntersectsRect(const gfx::Rect& layer_rect) const;
// Returns true if this raster source has anything to rasterize.
bool HasRecordings() const;
// Valid rectangle in which anything is recorded and can be rastered from.
gfx::Rect recorded_bounds() const {
// TODO(crbug.com/41490692): Create tiling for directly composited images
// based on the recorded bounds.
return directly_composited_image_info_ ? gfx::Rect(size_)
: recorded_bounds_;
}
// Tracing functionality.
void DidBeginTracing();
void AsValueInto(base::trace_event::TracedValue* array) const;
const scoped_refptr<const DisplayItemList>& GetDisplayItemList() const {
return display_list_;
}
float recording_scale_factor() const { return recording_scale_factor_; }
SkColor4f background_color() const { return background_color_; }
bool requires_clear() const { return requires_clear_; }
size_t* max_op_size_hint() { return &max_op_size_hint_; }
const std::optional<DirectlyCompositedImageInfo>&
directly_composited_image_info() const {
return directly_composited_image_info_;
}
void set_debug_name(const std::string& name) { debug_name_ = name; }
const std::string& debug_name() const { return debug_name_; }
protected:
// RecordingSource is the only class that can create a raster source.
friend class RecordingSource;
friend class base::RefCountedThreadSafe<RasterSource>;
explicit RasterSource(const RecordingSource& other);
virtual ~RasterSource();
void ClearForOpaqueRaster(SkCanvas* raster_canvas,
const gfx::AxisTransform2d& raster_transform,
const gfx::Size& content_size,
const gfx::Rect& canvas_bitmap_rect,
const gfx::Rect& canvas_playback_rect) const;
// Raster the display list of this raster source into the given canvas.
// Canvas states such as CTM and clip region will be respected.
// This function will replace pixels in the clip region without blending.
//
// Virtual for testing.
virtual void PlaybackDisplayListToCanvas(
SkCanvas* canvas,
const PlaybackSettings& settings) const;
// The serialized size for the largest op in this RasterSource. This is
// accessed only on the raster threads with the context lock acquired.
size_t max_op_size_hint_ =
gpu::raster::RasterInterface::kDefaultMaxOpSizeHint;
// These members are const as this raster source may be in use on another
// thread and so should not be touched after construction.
const scoped_refptr<const DisplayItemList> display_list_;
const SkColor4f background_color_;
const bool requires_clear_;
const bool is_solid_color_;
const SkColor4f solid_color_;
const gfx::Rect recorded_bounds_;
const gfx::Size size_;
const int slow_down_raster_scale_factor_for_debug_;
const float recording_scale_factor_;
std::optional<DirectlyCompositedImageInfo> directly_composited_image_info_;
// Used for debugging and tracing.
std::string debug_name_;
};
} // namespace cc
#endif // CC_RASTER_RASTER_SOURCE_H_