8000 Reland ""Add support for trace counters with variable arguments and i… · flutter/engine@906d684 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 906d684

Browse files
authored
Reland ""Add support for trace counters with variable arguments and instrument the raster cache." (#8145)
This reverts commit bc90132 and fixes the discovered on Windows builds.
1 parent 3c93817 commit 906d684

File tree

5 files changed

+129
-21
lines changed

5 files changed

+129
-21
lines changed

flow/raster_cache.cc

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ static RasterCacheResult Rasterize(
9797
bool checkerboard,
9898
const SkRect& logical_rect,
9999
std::function<void(SkCanvas*)> draw_function) {
100+
TRACE_EVENT0("flutter", "RasterCachePopulate");
100101
SkIRect cache_rect = RasterCache::GetDeviceBounds(logical_rect, ctm);
101102

102103
const SkImageInfo image_info = SkImageInfo::MakeN32Premul(
@@ -129,8 +130,6 @@ RasterCacheResult RasterizePicture(SkPicture* picture,
129130
const SkMatrix& ctm,
130131
SkColorSpace* dst_color_space,
131132
bool checkerboard) {
132-
TRACE_EVENT0("flutter", "RasterCachePopulate");
133-
134133
return Rasterize(context, ctm, dst_color_space, checkerboard,
135134
picture->cullRect(),
136135
[=](SkCanvas* canvas) { canvas->drawPicture(picture); });
@@ -240,6 +239,7 @@ void RasterCache::SweepAfterFrame() {
240239
SweepOneCacheAfterFrame<PictureCache, PictureCache::iterator>(picture_cache_);
241240
SweepOneCacheAfterFrame<LayerCache, LayerCache::iterator>(layer_cache_);
242241
picture_cached_this_frame_ = 0;
242+
TraceStatsToTimeline();
243243
}
244244

245245
void RasterCache::Clear() {
@@ -259,4 +259,35 @@ void RasterCache::SetCheckboardCacheImages(bool checkerboard) {
259259
Clear();
260260
}
261261

262+
void RasterCache::TraceStatsToTimeline() const {
263+
#if FLUTTER_RUNTIME_MODE != FLUTTER_RUNTIME_MODE_RELEASE
264+
265+
size_t layer_cache_count = 0;
266+
size_t layer_cache_bytes = 0;
267+
size_t picture_cache_count = 0;
268+
size_t picture_cache_bytes = 0;
269+
270+
for (const auto& item : layer_cache_) {
271+
const auto dimensions = item.second.image.image_dimensions();
272+
layer_cache_count++;
273+
layer_cache_bytes += dimensions.width() * dimensions.height() * 4;
274+
}
275+
276+
for (const auto& item : picture_cache_) {
277+
const auto dimensions = item.second.image.image_dimensions();
278+
picture_cache_count++;
279+
picture_cache_bytes += dimensions.width() * dimensions.height() * 4;
280+
}
281+
282+
FML_TRACE_COUNTER("flutter", "RasterCache",
283+
reinterpret_cast<int64_t>(this), //
284+
"LayerCount", layer_cache_count, //
285+
"LayerMBytes", layer_cache_bytes * 1e-6, //
286+
"PictureCount", picture_cache_count, //
287+
"PictureMBytes", picture_cache_bytes * 1e-6 //
288+
);
289+
290+
#endif // FLUTTER_RUNTIME_MODE != FLUTTER_RUNTIME_MODE_RELEASE
291+
}
292+
262293
} // namespace flow

flow/raster_cache.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class RasterCacheResult {
3333

3434
void draw(SkCanvas& canvas, const SkPaint* paint = nullptr) const;
3535

36+
SkISize image_dimensions() const {
37+
return image_ ? image_->dimensions() : SkISize::Make(0, 0);
38+
};
39+
3640
private:
3741
sk_sp<SkImage> image_;
3842
SkRect logical_rect_;
@@ -87,6 +91,7 @@ class RasterCache {
8791
void Prepare(PrerollContext* context, Layer* layer, const SkMatrix& ctm);
8892

8993
RasterCacheResult Get(const SkPicture& picture, const SkMatrix& ctm) const;
94+
9095
RasterCacheResult Get(Layer* layer, const SkMatrix& ctm) const;
9196

9297
void SweepAfterFrame();
@@ -127,6 +132,8 @@ class RasterCache {
127132
bool checkerboard_images_;
128133
fml::WeakPtrFactory<RasterCache> weak_factory_;
129134

135+
void TraceStatsToTimeline() const;
136+
130137
FML_DISALLOW_COPY_AND_ASSIGN(RasterCache);
131138
};
132139

fml/trace_event.cc

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,36 @@
44

55
#include "flutter/fml/trace_event.h"
66

7-
#include "third_party/dart/runtime/include/dart_tools_api.h"
7+
#include <algorithm>
8+
9+
#include "flutter/fml/logging.h"
810

911
namespace fml {
1012
namespace tracing {
1113

12-
void TraceCounter(TraceArg category_group, TraceArg name, TraceIDArg count) {
13-
auto count_string = std::to_string(count);
14-
const char* arg_names[] = {name};
15-
const char* arg_values[] = {count_string.c_str()};
16-
Dart_TimelineEvent(name, // label
17-
Dart_TimelineGetMicros(), // timestamp0
18-
0, // timestamp1_or_async_id
19-
Dart_Timeline_Event_Counter, // event type
20-
1, // argument_count
21-
arg_names, // argument_names
22-
arg_values // argument_values
14+
void TraceTimelineEvent(TraceArg category_group,
15+
TraceArg name,
16+
TraceIDArg identifier,
17+
Dart_Timeline_Event_Type type,
18+
const std::vector<const char*>& c_names,
19+
const std::vector<std::string>& values) {
20+
const auto argument_count = std::min(c_names.size(), values.size());
21+
22+
std::vector<const char*> c_values;
23+
c_values.resize(argument_count, nullptr);
24+
25+
for (size_t i = 0; i < argument_count; i++) {
26+
c_values[i] = values[i].c_str();
27+
}
28+
29+
Dart_TimelineEvent(
30+
name, // label
31+
Dart_TimelineGetMicros(), // timestamp0
32+
identifier, // timestamp1_or_async_id
33+
type, // event type
34+
argument_count, // argument_count
35+
const_cast<const char**>(c_names.data()), // argument_names
36+
c_values.data() // argument_values
2337
);
2438
}
2539

fml/trace_event.h

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
#include <trace/event.h>
1515

16-
#define FML_TRACE_COUNTER(category_group, name, count) \
17-
TRACE_COUNTER(category_group, name, 0u, name, count)
1816
#define TRACE_EVENT0(a, b) TRACE_DURATION(a, b)
1917
#define TRACE_EVENT1(a, b, c, d) TRACE_DURATION(a, b, c, d)
2018
#define TRACE_EVENT2(a, b, c, d, e, f) TRACE_DURATION(a, b, c, d, e, f)
@@ -28,8 +26,11 @@
2826
#include <cstddef>
2927
#include <cstdint>
3028
#include <string>
29+
#include <type_traits>
30+
#include <vector>
3131

3232
#include "flutter/fml/macros.h"
33+
#include "third_party/dart/runtime/include/dart_tools_api.h"
3334

3435
#if !defined(OS_FUCHSIA)
3536

@@ -45,8 +46,9 @@
4546
// from trace/event.h on Fuchsia.
4647
//
4748
// TODO(chinmaygarde): All macros here should have the FML prefix.
48-
#define FML_TRACE_COUNTER(category_group, name, count) \
49-
::fml::tracing::TraceCounter(category_group, name, count);
49+
#define FML_TRACE_COUNTER(category_group, name, counter_id, arg1, ...) \
50+
::fml::tracing::TraceCounter((category_group), (name), (counter_id), (arg1), \
51+
__VA_ARGS__);
5052

5153
#define TRACE_EVENT0(category_group, name) \
5254
::fml::tracing::TraceEvent0(category_group, name); \
@@ -99,7 +101,63 @@ namespace tracing {
99101
using TraceArg = const char*;
100102
using TraceIDArg = int64_t;
101103

102-
void TraceCounter(TraceArg category_group, TraceArg name, TraceIDArg count);
104+
void TraceTimelineEvent(TraceArg category_group,
105+
TraceArg name,
106+
TraceIDArg id,
107+
Dart_Timeline_Event_Type type,
108+
const std::vector<const char*>& names,
109+
const std::vector<std::string>& values);
110+
111+
inline std::string TraceToString(const char* string) {
112+
return std::string{string};
113+
}
114+
115+
inline std::string TraceToString(std::string string) {
116+
return string;
117+
}
118+
119+
template <typename T, typename = std::enable_if_t<std::is_arithmetic<T>::value>>
120+
std::string TraceToString(T string) {
121+
return std::to_string(string);
122+
}
123+
124+
inline void SplitArgumentsCollect(std::vector<const char*>& keys,
125+
std::vector<std::string>& values) {}
126+
127+
template <typename Key, typename Value, typename... Args>
128+
void SplitArgumentsCollect(std::vector<const char*>& keys,
129+
std::vector<std::string>& values,
130+
Key key,
131+
Value value,
132+
Args... args) {
133+
keys.emplace_back(key);
134+
values.emplace_back(TraceToString(value));
135+
SplitArgumentsCollect(keys, values, args...);
136+
}
137+
138+
inline std::pair<std::vector<const char*>, std::vector<std::string>>
139+
SplitArguments() {
140+
return {};
141+
}
142+
143+
template <typename Key, typename Value, typename... Args>
144+
std::pair<std::vector<const char*>, std::vector<std::string>>
145+
SplitArguments(Key key, Value value, Args... args) {
146+
std::vector<const char*> keys;
147+
std::vector<std::string> values;
148+
SplitArgumentsCollect(keys, values, key, value, args...);
149+
return std::make_pair(std::move(keys), std::move(values));
150+
}
151+
152+
template <typename... Args>
153+
void TraceCounter(TraceArg category,
154+
TraceArg name,
155+
TraceIDArg identifier,
156+
Args... args) {
157+
auto split = SplitArguments(args...);
158+
TraceTimelineEvent(category, name, identifier, Dart_Timeline_Event_Counter,
159+
split.first, split.second);
160+
}
103161

104162
void TraceEvent0(TraceArg category_group, TraceArg name);
105163

tools/gn

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,6 @@ def to_gn_args(args):
9393

9494
if not sys.platform.startswith(('cygwin', 'win')):
9595
gn_args['use_clang_static_analyzer'] = args.clang_static_analyzer
96-
else:
97-
gn_args['use_clang_static_analyzer'] = False
9896

9997
gn_args['embedder_for_target'] = args.embedder_for_target
10098

0 commit comments

Comments
 (0)
0