提交 536fb276 编写于 作者: C Chinmay Garde 提交者: GitHub

Visualize image decoding and texture upload using trace flows. (#3907)

上级 53c9a702
......@@ -23,7 +23,10 @@ using tonic::ToDart;
namespace blink {
namespace {
sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer) {
static constexpr const char* kDecodeImageTraceTag = "DecodeImage";
sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer, size_t trace_id) {
TRACE_FLOW_STEP("flutter", kDecodeImageTraceTag, trace_id);
TRACE_EVENT0("blink", "DecodeImage");
if (buffer == nullptr || buffer->isEmpty()) {
......@@ -42,10 +45,13 @@ sk_sp<SkImage> DecodeImage(sk_sp<SkData> buffer) {
}
void InvokeImageCallback(sk_sp<SkImage> image,
std::unique_ptr<DartPersistentValue> callback) {
std::unique_ptr<DartPersistentValue> callback,
size_t trace_id) {
tonic::DartState* dart_state = callback->dart_state().get();
if (!dart_state)
if (!dart_state) {
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
return;
}
tonic::DartState::Scope scope(dart_state);
if (!image) {
DartInvoke(callback->value(), {Dart_Null()});
......@@ -54,30 +60,37 @@ void InvokeImageCallback(sk_sp<SkImage> image,
resultImage->set_image(std::move(image));
DartInvoke(callback->value(), {ToDart(resultImage)});
}
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
}
void DecodeImageAndInvokeImageCallback(
std::unique_ptr<DartPersistentValue> callback,
sk_sp<SkData> buffer) {
sk_sp<SkImage> image = DecodeImage(std::move(buffer));
Threads::UI()->PostTask(
ftl::MakeCopyable([ callback = std::move(callback), image ]() mutable {
InvokeImageCallback(image, std::move(callback));
}));
sk_sp<SkData> buffer,
size_t trace_id) {
sk_sp<SkImage> image = DecodeImage(std::move(buffer), trace_id);
Threads::UI()->PostTask(ftl::MakeCopyable([
callback = std::move(callback), image, trace_id
]() mutable { InvokeImageCallback(image, std::move(callback), trace_id); }));
}
void DecodeImageFromList(Dart_NativeArguments args) {
static size_t trace_counter = 1;
const size_t trace_id = trace_counter++;
TRACE_FLOW_BEGIN("flutter", kDecodeImageTraceTag, trace_id);
Dart_Handle exception = nullptr;
tonic::Uint8List list =
tonic::DartConverter<tonic::Uint8List>::FromArguments(args, 0, exception);
if (exception) {
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
Dart_ThrowException(exception);
return;
}
Dart_Handle callback_handle = Dart_GetNativeArgument(args, 1);
if (!Dart_IsClosure(callback_handle)) {
TRACE_FLOW_END("flutter", kDecodeImageTraceTag, trace_id);
Dart_ThrowException(ToDart("Callback must be a function"));
return;
}
......@@ -87,9 +100,10 @@ void DecodeImageFromList(Dart_NativeArguments args) {
Threads::IO()->PostTask(ftl::MakeCopyable([
callback = std::make_unique<DartPersistentValue>(
tonic::DartState::Current(), callback_handle),
buffer = std::move(buffer)
buffer = std::move(buffer), trace_id
]() mutable {
DecodeImageAndInvokeImageCallback(std::move(callback), std::move(buffer));
DecodeImageAndInvokeImageCallback(std::move(callback), std::move(buffer),
trace_id);
}));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册