/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkPerfettoTrace_DEFINED #define SkPerfettoTrace_DEFINED #include "include/utils/SkEventTracer.h" #include "tools/trace/EventTracingPriv.h" #include "perfetto.h" PERFETTO_DEFINE_CATEGORIES(); /** * This class is used to support Perfetto tracing. It hooks into the SkEventTracer system. */ class SkPerfettoTrace : public SkEventTracer { public: SkPerfettoTrace(); ~SkPerfettoTrace() override; SkEventTracer::Handle addTraceEvent(char phase, const uint8_t* categoryEnabledFlag, const char* name, uint64_t id, int numArgs, const char** argNames, const uint8_t* argTypes, const uint64_t* argValues, uint8_t flags) override; void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, const char* name, SkEventTracer::Handle handle) override; const uint8_t* getCategoryGroupEnabled(const char* name) override; const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override; void newTracingSection(const char* name) override; private: SkPerfettoTrace(const SkPerfettoTrace&) = delete; SkPerfettoTrace& operator=(const SkPerfettoTrace&) = delete; SkEventTracingCategories fCategories; std::unique_ptr tracingSession; int fd{-1}; /** Store the perfetto trace file output path, name, and extension separately. This isolation * of name components becomes useful when splitting traces up by sections, where we want to * alter the base file name but keep the trace output path and file extension the same. */ std::string fOutputPath; std::string fOutputFileExtension; std::string fCurrentSessionFullOutputPath; void openNewTracingSession(const std::string& baseFileName); void closeTracingSession(); /** Overloaded private methods to initiate a trace event with 0-2 arguments. Perfetto supports * adding an arbitrary number of debug annotations or arguments, but the existing Skia trace * structure only supports 0-2 so that is all we accommodate. */ void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName); void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName, const char* arg1Name, const uint8_t& arg1Type, const uint64_t& arg1Val); void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName, const char* arg1Name, const uint8_t& arg1Type, const uint64_t& arg1Val, const char* arg2Name, const uint8_t& arg2Type, const uint64_t& arg2Val); }; #endif