Skip to content

Commit 536fb27

Browse files
authored
Visualize image decoding and texture upload using trace flows. (flutter#3907)
1 parent 53c9a70 commit 536fb27

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

lib/ui/painting/image_decoding.cc

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ using tonic::ToDart;
2323
namespace blink {
2424
namespace {
2525

26-
sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer) {
26+
static constexpr const char* kDecodeImageTraceTag = "DecodeImage";
27+
28+
sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer, size_t trace_id) {
29+
TRACE_FLOW_STEP("flutter", kDecodeImageTraceTag, trace_id);
2730
TRACE_EVENT0("blink", "DecodeImage");
2831

2932
if (buffer == nullptr || buffer->isEmpty()) {
@@ -42,10 +45,13 @@ sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer) {
4245
}
4346

4447
void InvokeImageCallback(sk_sp<SkImage> image,
45-
std::unique_ptr<DartPersistentValue> callback) {
48+
std::unique_ptr<DartPersistentValue> callback,
49+
size_t trace_id) {
4650
tonic::DartState* dart_state = callback->dart_state().get();
47-
if (!dart_state)
51+
if (!dart_state) {
52+
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
4853
return;
54+
}
4955
tonic::DartState::Scope scope(dart_state);
5056
if (!image) {
5157
DartInvoke(callback->value(), {Dart_Null()});
@@ -54,30 +60,37 @@ void InvokeImageCallback(sk_sp<SkImage> image,
5460
resultImage->set_image(std::move(image));
5561
DartInvoke(callback->value(), {ToDart(resultImage)});
5662
}
63+
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
5764
}
5865

5966
void DecodeImageAndInvokeImageCallback(
6067
std::unique_ptr<DartPersistentValue> callback,
61-
sk_sp<SkData> buffer) {
62-
sk_sp<SkImage> image = DecodeImage(std::move(buffer));
63-
Threads::UI()->PostTask(
64-
ftl::MakeCopyable([ callback = std::move(callback), image ]() mutable {
65-
InvokeImageCallback(image, std::move(callback));
66-
}));
68+
sk_sp<SkData> buffer,
69+
size_t trace_id) {
70+
sk_sp<SkImage> image = DecodeImage(std::move(buffer), trace_id);
71+
Threads::UI()->PostTask(ftl::MakeCopyable([
72+
callback = std::move(callback), image, trace_id
73+
]() mutable { InvokeImageCallback(image, std::move(callback), trace_id); }));
6774
}
6875

6976
void DecodeImageFromList(Dart_NativeArguments args) {
77+
static size_t trace_counter = 1;
78+
const size_t trace_id = trace_counter++;
79+
TRACE_FLOW_BEGIN("flutter", kDecodeImageTraceTag, trace_id);
80+
7081
Dart_Handle exception = nullptr;
7182

7283
tonic::Uint8List list =
7384
tonic::DartConverter<tonic::Uint8List>::FromArguments(args, 0, exception);
7485
if (exception) {
86+
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
7587
Dart_ThrowException(exception);
7688
return;
7789
}
7890

7991
Dart_Handle callback_handle = Dart_GetNativeArgument(args, 1);
8092
if (!Dart_IsClosure(callback_handle)) {
93+
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
8194
Dart_ThrowException(ToDart("Callback must be a function"));
8295
return;
8396
}
@@ -87,9 +100,10 @@ void DecodeImageFromList(Dart_NativeArguments args) {
87100
Threads::IO()->PostTask(ftl::MakeCopyable([
88101
callback = std::make_unique<DartPersistentValue>(
89102
tonic::DartState::Current(), callback_handle),
90-
buffer = std::move(buffer)
103+
buffer = std::move(buffer), trace_id
91104
]() mutable {
92-
DecodeImageAndInvokeImageCallback(std::move(callback), std::move(buffer));
105+
DecodeImageAndInvokeImageCallback(std::move(callback), std::move(buffer),
106+
trace_id);
93107
}));
94108
}
95109

0 commit comments

Comments
 (0)