Add a tag argument to Skia shader trace events for use by DevTools (flutter/engine#26590)

This commit is contained in:
Jason Simmons 2021-06-09 17:54:02 -07:00 committed by GitHub
parent 32d589e08b
commit 02ce01fd73

View File

@ -48,6 +48,18 @@ namespace {
// Defined in Skia's src/core/SkTraceEvent.h.
constexpr std::string_view kTraceCategoryPrefix = "disabled-by-default-";
// Category name used for shader compilation events.
constexpr std::string_view kShaderCategoryName =
"disabled-by-default-skia.shaders";
#if !defined(OS_FUCHSIA)
// Argument name of the tag used by DevTools.
constexpr char kDevtoolsTagArg[] = "devtoolsTag";
// DevtoolsTag value for shader events.
constexpr char kShadersDevtoolsTag[] = "shaders";
#endif // !defined(OS_FUCHSIA)
#if defined(OS_FUCHSIA)
template <class T, class U>
inline T BitCast(const U& u) {
@ -68,7 +80,7 @@ class FlutterEventTracer : public SkEventTracer {
static constexpr uint8_t kNo = 0;
FlutterEventTracer(bool enabled, const std::vector<std::string>& allowlist)
: enabled_(enabled ? kYes : kNo) {
: enabled_(enabled ? kYes : kNo), shaders_category_flag_(nullptr) {
for (const std::string& category : allowlist) {
allowlist_.insert(std::string(kTraceCategoryPrefix) + category);
}
@ -195,22 +207,47 @@ class FlutterEventTracer : public SkEventTracer {
trace_release_context(trace_context);
#else // defined(OS_FUCHSIA)
const char* devtoolsTag = nullptr;
if (shaders_category_flag_ &&
category_enabled_flag == shaders_category_flag_) {
devtoolsTag = kShadersDevtoolsTag;
}
switch (phase) {
case TRACE_EVENT_PHASE_BEGIN:
case TRACE_EVENT_PHASE_COMPLETE:
fml::tracing::TraceEvent0(kSkiaTag, name);
if (devtoolsTag) {
fml::tracing::TraceEvent1(kSkiaTag, name, kDevtoolsTagArg,
devtoolsTag);
} else {
fml::tracing::TraceEvent0(kSkiaTag, name);
}
break;
case TRACE_EVENT_PHASE_END:
fml::tracing::TraceEventEnd(name);
break;
case TRACE_EVENT_PHASE_INSTANT:
fml::tracing::TraceEventInstant0(kSkiaTag, name);
if (devtoolsTag) {
fml::tracing::TraceEventInstant1(kSkiaTag, name, kDevtoolsTagArg,
devtoolsTag);
} else {
fml::tracing::TraceEventInstant0(kSkiaTag, name);
}
break;
case TRACE_EVENT_PHASE_ASYNC_BEGIN:
fml::tracing::TraceEventAsyncBegin0(kSkiaTag, name, id);
if (devtoolsTag) {
fml::tracing::TraceEventAsyncBegin1(kSkiaTag, name, id,
kDevtoolsTagArg, devtoolsTag);
} else {
fml::tracing::TraceEventAsyncBegin0(kSkiaTag, name, id);
}
break;
case TRACE_EVENT_PHASE_ASYNC_END:
fml::tracing::TraceEventAsyncEnd0(kSkiaTag, name, id);
if (devtoolsTag) {
fml::tracing::TraceEventAsyncEnd1(kSkiaTag, name, id, kDevtoolsTagArg,
devtoolsTag);
} else {
fml::tracing::TraceEventAsyncEnd0(kSkiaTag, name, id);
}
break;
default:
break;
@ -243,7 +280,11 @@ class FlutterEventTracer : public SkEventTracer {
allowed = false;
}
flag_it = category_flag_map_.insert(std::make_pair(name, allowed)).first;
reverse_flag_map_.insert(std::make_pair(&flag_it->second, name));
const uint8_t* flag = &flag_it->second;
reverse_flag_map_.insert(std::make_pair(flag, name));
if (kShaderCategoryName == name) {
shaders_category_flag_ = flag;
}
}
return &flag_it->second;
}
@ -263,6 +304,7 @@ class FlutterEventTracer : public SkEventTracer {
std::set<std::string> allowlist_;
std::map<const char*, uint8_t> category_flag_map_;
std::map<const uint8_t*, const char*> reverse_flag_map_;
const uint8_t* shaders_category_flag_;
FML_DISALLOW_COPY_AND_ASSIGN(FlutterEventTracer);
};