diff options
author | 2024-07-12 18:46:07 +0000 | |
---|---|---|
committer | 2024-07-12 20:57:22 +0000 | |
commit | 47b6e6881f5d0d6e0388e33ece5154e1938eb901 (patch) | |
tree | 4e008a14e295a026ed7b466ff2c203e7ae743022 | |
parent | da62cb20839940ae274bf1c2307eec7721241a43 (diff) |
Modify sftrace macros to go through tracing_perfetto lib
If the perfetto trace events are not registered, the library will default to
the previous atrace calls. We will enable the perfetto registration with
the aconfig flag perfetto_sdk_tracing.
Flag: android.os.perfetto_sdk_tracing
Bug: 349905670
Test: perfetto
Change-Id: I04c3c0d09f36c95b7ac90ffa06b8be3428ddc950
-rw-r--r-- | libs/tracing_perfetto/include/tracing_perfetto.h | 11 | ||||
-rw-r--r-- | libs/tracing_perfetto/tracing_perfetto.cpp | 61 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/TimeStats/Android.bp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/Tracing/tools/Android.bp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/common/Android.bp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/common/include/common/trace.h | 108 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/Android.bp | 1 |
8 files changed, 121 insertions, 67 deletions
diff --git a/libs/tracing_perfetto/include/tracing_perfetto.h b/libs/tracing_perfetto/include/tracing_perfetto.h index 0b2b0af59d..59c43d6dcc 100644 --- a/libs/tracing_perfetto/include/tracing_perfetto.h +++ b/libs/tracing_perfetto/include/tracing_perfetto.h @@ -14,8 +14,7 @@ * limitations under the License. */ -#ifndef TRACING_PERFETTO_H -#define TRACING_PERFETTO_H +#pragma once #include <stdint.h> @@ -29,6 +28,8 @@ void traceEnd(uint64_t category); void traceAsyncBegin(uint64_t category, const char* name, int32_t cookie); +void traceFormatBegin(uint64_t category, const char* fmt, ...); + void traceAsyncEnd(uint64_t category, const char* name, int32_t cookie); void traceAsyncBeginForTrack(uint64_t category, const char* name, @@ -39,12 +40,14 @@ void traceAsyncEndForTrack(uint64_t category, const char* trackName, void traceInstant(uint64_t category, const char* name); +void traceFormatInstant(uint64_t category, const char* fmt, ...); + void traceInstantForTrack(uint64_t category, const char* trackName, const char* name); void traceCounter(uint64_t category, const char* name, int64_t value); +void traceCounter32(uint64_t category, const char* name, int32_t value); + bool isTagEnabled(uint64_t category); } // namespace tracing_perfetto - -#endif // TRACING_PERFETTO_H diff --git a/libs/tracing_perfetto/tracing_perfetto.cpp b/libs/tracing_perfetto/tracing_perfetto.cpp index fc5336de68..c35e078b02 100644 --- a/libs/tracing_perfetto/tracing_perfetto.cpp +++ b/libs/tracing_perfetto/tracing_perfetto.cpp @@ -17,6 +17,7 @@ #include "tracing_perfetto.h" #include <cutils/trace.h> +#include <cstdarg> #include "perfetto/public/te_category_macros.h" #include "trace_categories.h" @@ -39,6 +40,31 @@ void traceBegin(uint64_t category, const char* name) { } } +void traceFormatBegin(uint64_t category, const char* fmt, ...) { + struct PerfettoTeCategory* perfettoTeCategory = + internal::toPerfettoCategory(category); + const bool preferAtrace = internal::shouldPreferAtrace(perfettoTeCategory, category); + const bool preferPerfetto = internal::isPerfettoCategoryEnabled(perfettoTeCategory); + if (CC_LIKELY(!(preferAtrace || preferPerfetto))) { + return; + } + + const int BUFFER_SIZE = 256; + va_list ap; + char buf[BUFFER_SIZE]; + + va_start(ap, fmt); + vsnprintf(buf, BUFFER_SIZE, fmt, ap); + va_end(ap); + + + if (preferAtrace) { + atrace_begin(category, buf); + } else if (preferPerfetto) { + internal::perfettoTraceBegin(*perfettoTeCategory, buf); + } +} + void traceEnd(uint64_t category) { struct PerfettoTeCategory* perfettoTeCategory = internal::toPerfettoCategory(category); @@ -107,6 +133,30 @@ void traceInstant(uint64_t category, const char* name) { } } +void traceFormatInstant(uint64_t category, const char* fmt, ...) { + struct PerfettoTeCategory* perfettoTeCategory = + internal::toPerfettoCategory(category); + const bool preferAtrace = internal::shouldPreferAtrace(perfettoTeCategory, category); + const bool preferPerfetto = internal::isPerfettoCategoryEnabled(perfettoTeCategory); + if (CC_LIKELY(!(preferAtrace || preferPerfetto))) { + return; + } + + const int BUFFER_SIZE = 256; + va_list ap; + char buf[BUFFER_SIZE]; + + va_start(ap, fmt); + vsnprintf(buf, BUFFER_SIZE, fmt, ap); + va_end(ap); + + if (preferAtrace) { + atrace_instant(category, buf); + } else if (preferPerfetto) { + internal::perfettoTraceInstant(*perfettoTeCategory, buf); + } +} + void traceInstantForTrack(uint64_t category, const char* trackName, const char* name) { struct PerfettoTeCategory* perfettoTeCategory = @@ -130,10 +180,21 @@ void traceCounter(uint64_t category, const char* name, int64_t value) { } } +void traceCounter32(uint64_t category, const char* name, int32_t value) { + struct PerfettoTeCategory* perfettoTeCategory = internal::toPerfettoCategory(category); + if (internal::shouldPreferAtrace(perfettoTeCategory, category)) { + atrace_int(category, name, value); + } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) { + internal::perfettoTraceCounter(*perfettoTeCategory, name, + static_cast<int64_t>(value)); + } +} + bool isTagEnabled(uint64_t category) { struct PerfettoTeCategory* perfettoTeCategory = internal::toPerfettoCategory(category); return internal::isPerfettoCategoryEnabled(perfettoTeCategory) || atrace_is_tag_enabled(category); } + } // namespace tracing_perfetto diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c75c9f5001..ce1d336b8c 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -729,6 +729,7 @@ void SurfaceFlinger::bootFinished() { mBootFinished = true; FlagManager::getMutableInstance().markBootCompleted(); + ::tracing_perfetto::registerWithPerfetto(); mInitBootPropsFuture.wait(); mRenderEnginePrimeCacheFuture.wait(); diff --git a/services/surfaceflinger/TimeStats/Android.bp b/services/surfaceflinger/TimeStats/Android.bp index ea86911bed..a6a0152044 100644 --- a/services/surfaceflinger/TimeStats/Android.bp +++ b/services/surfaceflinger/TimeStats/Android.bp @@ -20,6 +20,7 @@ cc_defaults { "libtimestats_atoms_proto", "libui", "libutils", + "libtracing_perfetto", ], static_libs: [ diff --git a/services/surfaceflinger/Tracing/tools/Android.bp b/services/surfaceflinger/Tracing/tools/Android.bp index 8afca4139c..63c1b37166 100644 --- a/services/surfaceflinger/Tracing/tools/Android.bp +++ b/services/surfaceflinger/Tracing/tools/Android.bp @@ -28,6 +28,7 @@ cc_binary { "libsurfaceflinger_mocks_defaults", "librenderengine_deps", "surfaceflinger_defaults", + "libsurfaceflinger_common_deps", ], srcs: [ ":libsurfaceflinger_sources", diff --git a/services/surfaceflinger/common/Android.bp b/services/surfaceflinger/common/Android.bp index bcf18869f8..f9c99bf2d2 100644 --- a/services/surfaceflinger/common/Android.bp +++ b/services/surfaceflinger/common/Android.bp @@ -18,6 +18,7 @@ cc_defaults { "libSurfaceFlingerProp", "server_configurable_flags", "libaconfig_storage_read_api_cc", + "libtracing_perfetto", ], static_libs: [ "librenderengine_includes", @@ -27,6 +28,7 @@ cc_defaults { ], local_include_dirs: ["include"], export_include_dirs: ["include"], + export_shared_lib_headers: ["libtracing_perfetto"], } cc_library_static { @@ -60,6 +62,7 @@ cc_defaults { shared_libs: [ "server_configurable_flags", "libaconfig_storage_read_api_cc", + "libtracing_perfetto", ], static_libs: [ "libsurfaceflinger_common", @@ -75,6 +78,7 @@ cc_defaults { shared_libs: [ "server_configurable_flags", "libaconfig_storage_read_api_cc", + "libtracing_perfetto", ], static_libs: [ "libsurfaceflinger_common_test", diff --git a/services/surfaceflinger/common/include/common/trace.h b/services/surfaceflinger/common/include/common/trace.h index 344359ed7d..0d7ac9b30e 100644 --- a/services/surfaceflinger/common/include/common/trace.h +++ b/services/surfaceflinger/common/include/common/trace.h @@ -17,43 +17,57 @@ #pragma once -#include <cutils/trace.h> -#include <stdint.h> - #ifndef ATRACE_TAG #define ATRACE_TAG ATRACE_TAG_GRAPHICS #endif -#define SFTRACE_ENABLED() ATRACE_ENABLED() -#define SFTRACE_BEGIN(name) ATRACE_BEGIN(name) -#define SFTRACE_END() ATRACE_END() -#define SFTRACE_ASYNC_BEGIN(name, cookie) ATRACE_ASYNC_BEGIN(name, cookie) -#define SFTRACE_ASYNC_END(name, cookie) ATRACE_ASYNC_END(name, cookie) +#include <cutils/trace.h> +#include <tracing_perfetto.h> + +// prevent using atrace directly, calls should go through tracing_perfetto lib +#undef ATRACE_ENABLED +#undef ATRACE_BEGIN +#undef ATRACE_END +#undef ATRACE_ASYNC_BEGIN +#undef ATRACE_ASYNC_END +#undef ATRACE_ASYNC_FOR_TRACK_BEGIN +#undef ATRACE_ASYNC_FOR_TRACK_END +#undef ATRACE_INSTANT +#undef ATRACE_INSTANT_FOR_TRACK +#undef ATRACE_INT +#undef ATRACE_INT64 +#undef ATRACE_CALL +#undef ATRACE_NAME +#undef ATRACE_FORMAT +#undef ATRACE_FORMAT_INSTANT + +#define SFTRACE_ENABLED() ::tracing_perfetto::isTagEnabled(ATRACE_TAG) +#define SFTRACE_BEGIN(name) ::tracing_perfetto::traceBegin(ATRACE_TAG, name) +#define SFTRACE_END() ::tracing_perfetto::traceEnd(ATRACE_TAG) +#define SFTRACE_ASYNC_BEGIN(name, cookie) \ + ::tracing_perfetto::traceAsyncBegin(ATRACE_TAG, name, cookie) +#define SFTRACE_ASYNC_END(name, cookie) ::tracing_perfetto::traceAsyncEnd(ATRACE_TAG, name, cookie) #define SFTRACE_ASYNC_FOR_TRACK_BEGIN(track_name, name, cookie) \ - ATRACE_ASYNC_FOR_TRACK_BEGIN(track_name, name, cookie) + ::tracing_perfetto::traceAsyncBeginForTrack(ATRACE_TAG, track_name, name, cookie) #define SFTRACE_ASYNC_FOR_TRACK_END(track_name, cookie) \ - ATRACE_ASYNC_FOR_TRACK_END(track_name, cookie) -#define SFTRACE_INSTANT(name) ATRACE_INSTANT(name) -#define SFTRACE_INSTANT_FOR_TRACK(trackName, name) ATRACE_INSTANT_FOR_TRACK(trackName, name) -#define SFTRACE_INT(name, value) ATRACE_INT(name, value) -#define SFTRACE_INT64(name, value) ATRACE_INT64(name, value) + ::tracing_perfetto::traceAsyncEndForTrack(ATRACE_TAG, track_name, cookie) +#define SFTRACE_INSTANT(name) ::tracing_perfetto::traceInstant(ATRACE_TAG, name) +#define SFTRACE_FORMAT_INSTANT(fmt, ...) \ + ::tracing_perfetto::traceFormatInstant(ATRACE_TAG, fmt, ##__VA_ARGS__) +#define SFTRACE_INSTANT_FOR_TRACK(trackName, name) \ + ::tracing_perfetto::traceInstantForTrack(ATRACE_TAG, trackName, name) +#define SFTRACE_INT(name, value) ::tracing_perfetto::traceCounter32(ATRACE_TAG, name, value) +#define SFTRACE_INT64(name, value) ::tracing_perfetto::traceCounter(ATRACE_TAG, name, value) // SFTRACE_NAME traces from its location until the end of its enclosing scope. #define _PASTE(x, y) x##y #define PASTE(x, y) _PASTE(x, y) -#define SFTRACE_NAME(name) ::android::ScopedTrace PASTE(___tracer, __LINE__)(ATRACE_TAG, name) - -// SFTRACE_CALL is an ATRACE_NAME that uses the current function name. +#define SFTRACE_NAME(name) ::android::ScopedTrace PASTE(___tracer, __LINE__)(name) +// SFTRACE_CALL is an SFTRACE_NAME that uses the current function name. #define SFTRACE_CALL() SFTRACE_NAME(__FUNCTION__) -#define SFTRACE_FORMAT(fmt, ...) \ - TraceUtils::TraceEnder traceEnder = \ - (CC_UNLIKELY(ATRACE_ENABLED()) && \ - (TraceUtils::atraceFormatBegin(fmt, ##__VA_ARGS__), true), \ - TraceUtils::TraceEnder()) - -#define SFTRACE_FORMAT_INSTANT(fmt, ...) \ - (CC_UNLIKELY(ATRACE_ENABLED()) && (TraceUtils::instantFormat(fmt, ##__VA_ARGS__), true)) +#define SFTRACE_FORMAT(fmt, ...) \ + ::android::ScopedTrace PASTE(___tracer, __LINE__)(fmt, ##__VA_ARGS__) #define ALOGE_AND_TRACE(fmt, ...) \ do { \ @@ -63,46 +77,14 @@ namespace android { -class TraceUtils { -public: - class TraceEnder { - public: - ~TraceEnder() { ATRACE_END(); } - }; - - static void atraceFormatBegin(const char* fmt, ...) { - const int BUFFER_SIZE = 256; - va_list ap; - char buf[BUFFER_SIZE]; - - va_start(ap, fmt); - vsnprintf(buf, BUFFER_SIZE, fmt, ap); - va_end(ap); - - SFTRACE_BEGIN(buf); - } - - static void instantFormat(const char* fmt, ...) { - const int BUFFER_SIZE = 256; - va_list ap; - char buf[BUFFER_SIZE]; - - va_start(ap, fmt); - vsnprintf(buf, BUFFER_SIZE, fmt, ap); - va_end(ap); - - SFTRACE_INSTANT(buf); - } -}; - class ScopedTrace { public: - inline ScopedTrace(uint64_t tag, const char* name) : mTag(tag) { atrace_begin(mTag, name); } - - inline ~ScopedTrace() { atrace_end(mTag); } - -private: - uint64_t mTag; + template <typename... Args> + inline ScopedTrace(const char* fmt, Args&&... args) { + ::tracing_perfetto::traceFormatBegin(ATRACE_TAG, fmt, std::forward<Args>(args)...); + } + inline ScopedTrace(const char* name) { SFTRACE_BEGIN(name); } + inline ~ScopedTrace() { SFTRACE_END(); } }; } // namespace android diff --git a/services/surfaceflinger/tests/unittests/Android.bp b/services/surfaceflinger/tests/unittests/Android.bp index bc35639a00..518f2a1fb3 100644 --- a/services/surfaceflinger/tests/unittests/Android.bp +++ b/services/surfaceflinger/tests/unittests/Android.bp @@ -209,6 +209,7 @@ cc_defaults { "libsync", "libui", "libutils", + "libtracing_perfetto", ], header_libs: [ "android.hardware.graphics.composer3-command-buffer", |