xref: /aosp_15_r20/external/skia/tools/trace/SkPerfettoTrace.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/trace/SkPerfettoTrace.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include <fcntl.h>
11*c8dee2aaSAndroid Build Coastguard Worker #include <fstream>
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEvent.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTraceEventCommon.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker PERFETTO_TRACK_EVENT_STATIC_STORAGE();
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(perfettoOutputDir, "./",
19*c8dee2aaSAndroid Build Coastguard Worker                      "Output directory for perfetto trace file(s).\n"
20*c8dee2aaSAndroid Build Coastguard Worker                      "Note: not the name of the file itself.\n"
21*c8dee2aaSAndroid Build Coastguard Worker                      "Will only have an effect if perfetto tracing is enabled. See --trace.");
22*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(perfettoOutputFileName, "trace",
23*c8dee2aaSAndroid Build Coastguard Worker                      "Output file name (excluding path and file extension) for the perfetto trace"
24*c8dee2aaSAndroid Build Coastguard Worker                      "file.\nNote: When splitting trace files by benchmark (see "
25*c8dee2aaSAndroid Build Coastguard Worker                      "--splitPerfettoTracesByBenchmark), file name will be determined by the "
26*c8dee2aaSAndroid Build Coastguard Worker                      "benchmark name.\n"
27*c8dee2aaSAndroid Build Coastguard Worker                      "Will only have an effect if perfetto tracing is enabled. See --trace.");
28*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string(perfettoOutputFileExtension, ".perfetto-trace",
29*c8dee2aaSAndroid Build Coastguard Worker                      "Output file extension for perfetto trace file(s).\n"
30*c8dee2aaSAndroid Build Coastguard Worker                      "Will only have an effect if perfetto tracing is enabled. See --trace.");
31*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_bool(longPerfettoTrace, false,
32*c8dee2aaSAndroid Build Coastguard Worker                    "Perfetto within Skia is optimized for tracing performance of 'smaller' traces"
33*c8dee2aaSAndroid Build Coastguard Worker                    "(~10 seconds or less). Set this flag to true to optimize for longer tracing"
34*c8dee2aaSAndroid Build Coastguard Worker                    "sessions.\n"
35*c8dee2aaSAndroid Build Coastguard Worker                    "Will only have an effect if perfetto tracing is enabled. See --trace.");
36*c8dee2aaSAndroid Build Coastguard Worker 
SkPerfettoTrace()37*c8dee2aaSAndroid Build Coastguard Worker SkPerfettoTrace::SkPerfettoTrace() {
38*c8dee2aaSAndroid Build Coastguard Worker     fOutputPath = FLAGS_perfettoOutputDir[0];
39*c8dee2aaSAndroid Build Coastguard Worker     fOutputFileExtension = FLAGS_perfettoOutputFileExtension[0];
40*c8dee2aaSAndroid Build Coastguard Worker     this->openNewTracingSession(FLAGS_perfettoOutputFileName[0]);
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker 
~SkPerfettoTrace()43*c8dee2aaSAndroid Build Coastguard Worker SkPerfettoTrace::~SkPerfettoTrace() {
44*c8dee2aaSAndroid Build Coastguard Worker     this->closeTracingSession();
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker 
openNewTracingSession(const std::string & baseFileName)47*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::openNewTracingSession(const std::string& baseFileName) {
48*c8dee2aaSAndroid Build Coastguard Worker     perfetto::TracingInitArgs args;
49*c8dee2aaSAndroid Build Coastguard Worker     /* Store the current tracing session's output file path as a member attribute so it can
50*c8dee2aaSAndroid Build Coastguard Worker      * be referenced when closing a tracing session (needed for short traces where writing to
51*c8dee2aaSAndroid Build Coastguard Worker      * the output file occurs at the end of all tracing). */
52*c8dee2aaSAndroid Build Coastguard Worker     fCurrentSessionFullOutputPath = fOutputPath + baseFileName + fOutputFileExtension;
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     /* Enable using only the in-process backend (recording only within the app itself). This is as
55*c8dee2aaSAndroid Build Coastguard Worker      * opposed to additionally including perfetto::kSystemBackend, which uses a Perfetto daemon. */
56*c8dee2aaSAndroid Build Coastguard Worker     args.backends |= perfetto::kInProcessBackend;
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     if (FLAGS_longPerfettoTrace) {
59*c8dee2aaSAndroid Build Coastguard Worker         /* Set the shared memory buffer size higher than the default of 256 KB to
60*c8dee2aaSAndroid Build Coastguard Worker         reduce trace writer packet loss occurrences associated with larger traces. */
61*c8dee2aaSAndroid Build Coastguard Worker         args.shmem_size_hint_kb = 2000;
62*c8dee2aaSAndroid Build Coastguard Worker     }
63*c8dee2aaSAndroid Build Coastguard Worker     perfetto::Tracing::Initialize(args);
64*c8dee2aaSAndroid Build Coastguard Worker     perfetto::TrackEvent::Register();
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     // Set up event tracing configuration.
67*c8dee2aaSAndroid Build Coastguard Worker     perfetto::protos::gen::TrackEventConfig track_event_cfg;
68*c8dee2aaSAndroid Build Coastguard Worker     perfetto::TraceConfig cfg;
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     /* Set the central memory buffer size - will record up to this amount of data. */
71*c8dee2aaSAndroid Build Coastguard Worker     cfg.add_buffers()->set_size_kb(32000);
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     if (FLAGS_longPerfettoTrace) {
74*c8dee2aaSAndroid Build Coastguard Worker         /* Enable continuous file writing/"streaming mode" to output trace data throughout the
75*c8dee2aaSAndroid Build Coastguard Worker          * program instead of one large dump at the end. */
76*c8dee2aaSAndroid Build Coastguard Worker         cfg.set_write_into_file(true);
77*c8dee2aaSAndroid Build Coastguard Worker         /* If set to a value other than the default, set how often trace data gets written to the
78*c8dee2aaSAndroid Build Coastguard Worker          * output file. */
79*c8dee2aaSAndroid Build Coastguard Worker         cfg.set_file_write_period_ms(5000);
80*c8dee2aaSAndroid Build Coastguard Worker         /* Force periodic commitment of shared memory buffer pages to the central buffer.
81*c8dee2aaSAndroid Build Coastguard Worker          * Helps prevent out-of-order event slices with long traces. */
82*c8dee2aaSAndroid Build Coastguard Worker         cfg.set_flush_period_ms(10000);
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     auto* ds_cfg = cfg.add_data_sources()->mutable_config();
86*c8dee2aaSAndroid Build Coastguard Worker     ds_cfg->set_name("track_event");
87*c8dee2aaSAndroid Build Coastguard Worker     ds_cfg->set_track_event_config_raw(track_event_cfg.SerializeAsString());
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     // Begin a tracing session.
90*c8dee2aaSAndroid Build Coastguard Worker     tracingSession = perfetto::Tracing::NewTrace();
91*c8dee2aaSAndroid Build Coastguard Worker     if (FLAGS_longPerfettoTrace) {
92*c8dee2aaSAndroid Build Coastguard Worker         fd = open(fCurrentSessionFullOutputPath.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600);
93*c8dee2aaSAndroid Build Coastguard Worker         tracingSession->Setup(cfg, fd);
94*c8dee2aaSAndroid Build Coastguard Worker     } else {
95*c8dee2aaSAndroid Build Coastguard Worker         tracingSession->Setup(cfg);
96*c8dee2aaSAndroid Build Coastguard Worker     }
97*c8dee2aaSAndroid Build Coastguard Worker     tracingSession->StartBlocking();
98*c8dee2aaSAndroid Build Coastguard Worker }
99*c8dee2aaSAndroid Build Coastguard Worker 
closeTracingSession()100*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::closeTracingSession() {
101*c8dee2aaSAndroid Build Coastguard Worker     perfetto::TrackEvent::Flush();
102*c8dee2aaSAndroid Build Coastguard Worker     tracingSession->StopBlocking();
103*c8dee2aaSAndroid Build Coastguard Worker     if (!FLAGS_longPerfettoTrace) {
104*c8dee2aaSAndroid Build Coastguard Worker         std::vector<char> trace_data(tracingSession->ReadTraceBlocking());
105*c8dee2aaSAndroid Build Coastguard Worker         std::ofstream output;
106*c8dee2aaSAndroid Build Coastguard Worker         output.open(fCurrentSessionFullOutputPath, std::ios::out | std::ios::binary);
107*c8dee2aaSAndroid Build Coastguard Worker         output.write(&trace_data[0], trace_data.size());
108*c8dee2aaSAndroid Build Coastguard Worker         output.close();
109*c8dee2aaSAndroid Build Coastguard Worker     } else {
110*c8dee2aaSAndroid Build Coastguard Worker         close(fd);
111*c8dee2aaSAndroid Build Coastguard Worker     }
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker 
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)114*c8dee2aaSAndroid Build Coastguard Worker SkEventTracer::Handle SkPerfettoTrace::addTraceEvent(char phase,
115*c8dee2aaSAndroid Build Coastguard Worker                                                      const uint8_t* categoryEnabledFlag,
116*c8dee2aaSAndroid Build Coastguard Worker                                                      const char* name,
117*c8dee2aaSAndroid Build Coastguard Worker                                                      uint64_t id,
118*c8dee2aaSAndroid Build Coastguard Worker                                                      int numArgs,
119*c8dee2aaSAndroid Build Coastguard Worker                                                      const char** argNames,
120*c8dee2aaSAndroid Build Coastguard Worker                                                      const uint8_t* argTypes,
121*c8dee2aaSAndroid Build Coastguard Worker                                                      const uint64_t* argValues,
122*c8dee2aaSAndroid Build Coastguard Worker                                                      uint8_t flags) {
123*c8dee2aaSAndroid Build Coastguard Worker     perfetto::DynamicCategory category{ this->getCategoryGroupName(categoryEnabledFlag) };
124*c8dee2aaSAndroid Build Coastguard Worker     if (TRACE_EVENT_PHASE_COMPLETE == phase ||
125*c8dee2aaSAndroid Build Coastguard Worker         TRACE_EVENT_PHASE_INSTANT == phase) {
126*c8dee2aaSAndroid Build Coastguard Worker         switch (numArgs) {
127*c8dee2aaSAndroid Build Coastguard Worker             case 0: {
128*c8dee2aaSAndroid Build Coastguard Worker                 this->triggerTraceEvent(categoryEnabledFlag, name);
129*c8dee2aaSAndroid Build Coastguard Worker                 break;
130*c8dee2aaSAndroid Build Coastguard Worker             }
131*c8dee2aaSAndroid Build Coastguard Worker             case 1: {
132*c8dee2aaSAndroid Build Coastguard Worker                 this->triggerTraceEvent(categoryEnabledFlag, name, argNames[0], argTypes[0],
133*c8dee2aaSAndroid Build Coastguard Worker                                         argValues[0]);
134*c8dee2aaSAndroid Build Coastguard Worker                 break;
135*c8dee2aaSAndroid Build Coastguard Worker             }
136*c8dee2aaSAndroid Build Coastguard Worker             case 2: {
137*c8dee2aaSAndroid Build Coastguard Worker                 this->triggerTraceEvent(categoryEnabledFlag, name, argNames[0], argTypes[0],
138*c8dee2aaSAndroid Build Coastguard Worker                                         argValues[0], argNames[1], argTypes[1], argValues[1]);
139*c8dee2aaSAndroid Build Coastguard Worker                 break;
140*c8dee2aaSAndroid Build Coastguard Worker             }
141*c8dee2aaSAndroid Build Coastguard Worker         }
142*c8dee2aaSAndroid Build Coastguard Worker     } else if (TRACE_EVENT_PHASE_END == phase) {
143*c8dee2aaSAndroid Build Coastguard Worker         TRACE_EVENT_END(category);
144*c8dee2aaSAndroid Build Coastguard Worker     }
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker     if (TRACE_EVENT_PHASE_INSTANT == phase) {
147*c8dee2aaSAndroid Build Coastguard Worker         TRACE_EVENT_END(category);
148*c8dee2aaSAndroid Build Coastguard Worker     }
149*c8dee2aaSAndroid Build Coastguard Worker     return 0;
150*c8dee2aaSAndroid Build Coastguard Worker }
151*c8dee2aaSAndroid Build Coastguard Worker 
updateTraceEventDuration(const uint8_t * categoryEnabledFlag,const char * name,SkEventTracer::Handle handle)152*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
153*c8dee2aaSAndroid Build Coastguard Worker                                                const char* name,
154*c8dee2aaSAndroid Build Coastguard Worker                                                SkEventTracer::Handle handle) {
155*c8dee2aaSAndroid Build Coastguard Worker     // This is only ever called from a scoped trace event, so we will just end the event.
156*c8dee2aaSAndroid Build Coastguard Worker     perfetto::DynamicCategory category{ this->getCategoryGroupName(categoryEnabledFlag) };
157*c8dee2aaSAndroid Build Coastguard Worker     TRACE_EVENT_END(category);
158*c8dee2aaSAndroid Build Coastguard Worker }
159*c8dee2aaSAndroid Build Coastguard Worker 
getCategoryGroupEnabled(const char * name)160*c8dee2aaSAndroid Build Coastguard Worker const uint8_t* SkPerfettoTrace::getCategoryGroupEnabled(const char* name) {
161*c8dee2aaSAndroid Build Coastguard Worker     return fCategories.getCategoryGroupEnabled(name);
162*c8dee2aaSAndroid Build Coastguard Worker }
163*c8dee2aaSAndroid Build Coastguard Worker 
getCategoryGroupName(const uint8_t * categoryEnabledFlag)164*c8dee2aaSAndroid Build Coastguard Worker const char* SkPerfettoTrace::getCategoryGroupName(const uint8_t* categoryEnabledFlag) {
165*c8dee2aaSAndroid Build Coastguard Worker     return fCategories.getCategoryGroupName(categoryEnabledFlag);
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker 
triggerTraceEvent(const uint8_t * categoryEnabledFlag,const char * eventName)168*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::triggerTraceEvent(const uint8_t* categoryEnabledFlag,
169*c8dee2aaSAndroid Build Coastguard Worker                                         const char* eventName) {
170*c8dee2aaSAndroid Build Coastguard Worker     perfetto::DynamicCategory category{ this->getCategoryGroupName(categoryEnabledFlag) };
171*c8dee2aaSAndroid Build Coastguard Worker     TRACE_EVENT_BEGIN(category, nullptr, [&](perfetto::EventContext ctx) {
172*c8dee2aaSAndroid Build Coastguard Worker         ctx.event()->set_name(eventName);
173*c8dee2aaSAndroid Build Coastguard Worker     });
174*c8dee2aaSAndroid Build Coastguard Worker }
175*c8dee2aaSAndroid Build Coastguard Worker 
triggerTraceEvent(const uint8_t * categoryEnabledFlag,const char * eventName,const char * arg1Name,const uint8_t & arg1Type,const uint64_t & arg1Val)176*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName,
177*c8dee2aaSAndroid Build Coastguard Worker                                         const char* arg1Name, const uint8_t& arg1Type,
178*c8dee2aaSAndroid Build Coastguard Worker                                         const uint64_t& arg1Val) {
179*c8dee2aaSAndroid Build Coastguard Worker     perfetto::DynamicCategory category{ this->getCategoryGroupName(categoryEnabledFlag) };
180*c8dee2aaSAndroid Build Coastguard Worker 
181*c8dee2aaSAndroid Build Coastguard Worker     switch (arg1Type) {
182*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_BOOL: {
183*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr, arg1Name, SkToBool(arg1Val),
184*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
185*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
186*c8dee2aaSAndroid Build Coastguard Worker             break;
187*c8dee2aaSAndroid Build Coastguard Worker         }
188*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_UINT: {
189*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val,
190*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
191*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
192*c8dee2aaSAndroid Build Coastguard Worker             break;
193*c8dee2aaSAndroid Build Coastguard Worker         }
194*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_INT: {
195*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr, arg1Name, static_cast<int64_t>(arg1Val),
196*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
197*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
198*c8dee2aaSAndroid Build Coastguard Worker             break;
199*c8dee2aaSAndroid Build Coastguard Worker         }
200*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_DOUBLE: {
201*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr, arg1Name, sk_bit_cast<double>(arg1Val),
202*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
203*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
204*c8dee2aaSAndroid Build Coastguard Worker             break;
205*c8dee2aaSAndroid Build Coastguard Worker         }
206*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_POINTER: {
207*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr,
208*c8dee2aaSAndroid Build Coastguard Worker                               arg1Name, skia_private::TraceValueAsPointer(arg1Val),
209*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
210*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
211*c8dee2aaSAndroid Build Coastguard Worker             break;
212*c8dee2aaSAndroid Build Coastguard Worker         }
213*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_COPY_STRING: [[fallthrough]]; // Perfetto always copies string data
214*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_STRING: {
215*c8dee2aaSAndroid Build Coastguard Worker             TRACE_EVENT_BEGIN(category, nullptr,
216*c8dee2aaSAndroid Build Coastguard Worker                               arg1Name, skia_private::TraceValueAsString(arg1Val),
217*c8dee2aaSAndroid Build Coastguard Worker                               [&](perfetto::EventContext ctx) {
218*c8dee2aaSAndroid Build Coastguard Worker                               ctx.event()->set_name(eventName); });
219*c8dee2aaSAndroid Build Coastguard Worker             break;
220*c8dee2aaSAndroid Build Coastguard Worker         }
221*c8dee2aaSAndroid Build Coastguard Worker         default: {
222*c8dee2aaSAndroid Build Coastguard Worker             SkUNREACHABLE;
223*c8dee2aaSAndroid Build Coastguard Worker         }
224*c8dee2aaSAndroid Build Coastguard Worker     }
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker namespace {
228*c8dee2aaSAndroid Build Coastguard Worker /* Define a template to help handle all the possible TRACE_EVENT_BEGIN macro call
229*c8dee2aaSAndroid Build Coastguard Worker  * combinations with 2 arguments of all the types supported by SetTraceValue.
230*c8dee2aaSAndroid Build Coastguard Worker  */
231*c8dee2aaSAndroid Build Coastguard Worker template <typename T>
begin_event_with_second_arg(const char * categoryName,const char * eventName,const char * arg1Name,T arg1Val,const char * arg2Name,const uint8_t & arg2Type,const uint64_t & arg2Val)232*c8dee2aaSAndroid Build Coastguard Worker void begin_event_with_second_arg(const char * categoryName, const char* eventName,
233*c8dee2aaSAndroid Build Coastguard Worker                                  const char* arg1Name, T arg1Val, const char* arg2Name,
234*c8dee2aaSAndroid Build Coastguard Worker                                  const uint8_t& arg2Type, const uint64_t& arg2Val) {
235*c8dee2aaSAndroid Build Coastguard Worker       perfetto::DynamicCategory category{categoryName};
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker       switch (arg2Type) {
238*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_BOOL: {
239*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val, arg2Name, SkToBool(arg2Val),
240*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
241*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
242*c8dee2aaSAndroid Build Coastguard Worker               break;
243*c8dee2aaSAndroid Build Coastguard Worker           }
244*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_UINT: {
245*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val, arg2Name, arg2Val,
246*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
247*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
248*c8dee2aaSAndroid Build Coastguard Worker               break;
249*c8dee2aaSAndroid Build Coastguard Worker           }
250*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_INT: {
251*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val,
252*c8dee2aaSAndroid Build Coastguard Worker                                 arg2Name, static_cast<int64_t>(arg2Val),
253*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
254*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
255*c8dee2aaSAndroid Build Coastguard Worker               break;
256*c8dee2aaSAndroid Build Coastguard Worker           }
257*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_DOUBLE: {
258*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val,
259*c8dee2aaSAndroid Build Coastguard Worker                                 arg2Name, sk_bit_cast<double>(arg2Val),
260*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
261*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
262*c8dee2aaSAndroid Build Coastguard Worker               break;
263*c8dee2aaSAndroid Build Coastguard Worker           }
264*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_POINTER: {
265*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val,
266*c8dee2aaSAndroid Build Coastguard Worker                                 arg2Name, skia_private::TraceValueAsPointer(arg2Val),
267*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
268*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
269*c8dee2aaSAndroid Build Coastguard Worker               break;
270*c8dee2aaSAndroid Build Coastguard Worker           }
271*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_COPY_STRING: [[fallthrough]];
272*c8dee2aaSAndroid Build Coastguard Worker           case TRACE_VALUE_TYPE_STRING: {
273*c8dee2aaSAndroid Build Coastguard Worker               TRACE_EVENT_BEGIN(category, nullptr, arg1Name, arg1Val,
274*c8dee2aaSAndroid Build Coastguard Worker                                 arg2Name, skia_private::TraceValueAsString(arg2Val),
275*c8dee2aaSAndroid Build Coastguard Worker                                 [&](perfetto::EventContext ctx) {
276*c8dee2aaSAndroid Build Coastguard Worker                                 ctx.event()->set_name(eventName); });
277*c8dee2aaSAndroid Build Coastguard Worker               break;
278*c8dee2aaSAndroid Build Coastguard Worker           }
279*c8dee2aaSAndroid Build Coastguard Worker           default: {
280*c8dee2aaSAndroid Build Coastguard Worker               SkUNREACHABLE;
281*c8dee2aaSAndroid Build Coastguard Worker               break;
282*c8dee2aaSAndroid Build Coastguard Worker           }
283*c8dee2aaSAndroid Build Coastguard Worker       }
284*c8dee2aaSAndroid Build Coastguard Worker }
285*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
286*c8dee2aaSAndroid Build Coastguard Worker 
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)287*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::triggerTraceEvent(const uint8_t* categoryEnabledFlag,
288*c8dee2aaSAndroid Build Coastguard Worker                                         const char* eventName, const char* arg1Name,
289*c8dee2aaSAndroid Build Coastguard Worker                                         const uint8_t& arg1Type, const uint64_t& arg1Val,
290*c8dee2aaSAndroid Build Coastguard Worker                                         const char* arg2Name, const uint8_t& arg2Type,
291*c8dee2aaSAndroid Build Coastguard Worker                                         const uint64_t& arg2Val) {
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker     const char * category{ this->getCategoryGroupName(categoryEnabledFlag) };
294*c8dee2aaSAndroid Build Coastguard Worker 
295*c8dee2aaSAndroid Build Coastguard Worker     switch (arg1Type) {
296*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_BOOL: {
297*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName, arg1Name, SkToBool(arg1Val),
298*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
299*c8dee2aaSAndroid Build Coastguard Worker             break;
300*c8dee2aaSAndroid Build Coastguard Worker         }
301*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_UINT: {
302*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName, arg1Name, arg1Val,
303*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
304*c8dee2aaSAndroid Build Coastguard Worker             break;
305*c8dee2aaSAndroid Build Coastguard Worker         }
306*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_INT: {
307*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName,
308*c8dee2aaSAndroid Build Coastguard Worker                                         arg1Name, static_cast<int64_t>(arg1Val),
309*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
310*c8dee2aaSAndroid Build Coastguard Worker             break;
311*c8dee2aaSAndroid Build Coastguard Worker         }
312*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_DOUBLE: {
313*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName, arg1Name, sk_bit_cast<double>(arg1Val),
314*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
315*c8dee2aaSAndroid Build Coastguard Worker             break;
316*c8dee2aaSAndroid Build Coastguard Worker         }
317*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_POINTER: {
318*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName,
319*c8dee2aaSAndroid Build Coastguard Worker                                         arg1Name, skia_private::TraceValueAsPointer(arg1Val),
320*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
321*c8dee2aaSAndroid Build Coastguard Worker             break;
322*c8dee2aaSAndroid Build Coastguard Worker         }
323*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_COPY_STRING: [[fallthrough]];
324*c8dee2aaSAndroid Build Coastguard Worker         case TRACE_VALUE_TYPE_STRING: {
325*c8dee2aaSAndroid Build Coastguard Worker             begin_event_with_second_arg(category, eventName,
326*c8dee2aaSAndroid Build Coastguard Worker                                         arg1Name, skia_private::TraceValueAsString(arg1Val),
327*c8dee2aaSAndroid Build Coastguard Worker                                         arg2Name, arg2Type, arg2Val);
328*c8dee2aaSAndroid Build Coastguard Worker             break;
329*c8dee2aaSAndroid Build Coastguard Worker         }
330*c8dee2aaSAndroid Build Coastguard Worker         default: {
331*c8dee2aaSAndroid Build Coastguard Worker             SkUNREACHABLE;
332*c8dee2aaSAndroid Build Coastguard Worker         }
333*c8dee2aaSAndroid Build Coastguard Worker     }
334*c8dee2aaSAndroid Build Coastguard Worker }
335*c8dee2aaSAndroid Build Coastguard Worker 
newTracingSection(const char * name)336*c8dee2aaSAndroid Build Coastguard Worker void SkPerfettoTrace::newTracingSection(const char* name) {
337*c8dee2aaSAndroid Build Coastguard Worker     if (perfetto::Tracing::IsInitialized()) {
338*c8dee2aaSAndroid Build Coastguard Worker         this->closeTracingSession();
339*c8dee2aaSAndroid Build Coastguard Worker     }
340*c8dee2aaSAndroid Build Coastguard Worker     this->openNewTracingSession(name);
341*c8dee2aaSAndroid Build Coastguard Worker }
342