xref: /aosp_15_r20/external/perfetto/test/synth_common.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker#
4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker#
8*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker#
10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard Workerimport argparse
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Workerfrom collections import namedtuple
19*6dbdd20aSAndroid Build Coastguard Workerfrom google.protobuf import descriptor_pb2, message_factory, descriptor_pool
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard WorkerCLONE_THREAD = 0x00010000
22*6dbdd20aSAndroid Build Coastguard WorkerCLONE_VFORK = 0x00004000
23*6dbdd20aSAndroid Build Coastguard WorkerCLONE_VM = 0x00000100
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Worker# For compatibility with older pb module versions.
27*6dbdd20aSAndroid Build Coastguard Workerdef get_message_class(pool, msg):
28*6dbdd20aSAndroid Build Coastguard Worker  if hasattr(message_factory, "GetMessageClass"):
29*6dbdd20aSAndroid Build Coastguard Worker    return message_factory.GetMessageClass(msg)
30*6dbdd20aSAndroid Build Coastguard Worker  else:
31*6dbdd20aSAndroid Build Coastguard Worker    return message_factory.MessageFactory(pool).GetPrototype(msg)
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker
34*6dbdd20aSAndroid Build Coastguard Workerdef ms_to_ns(time_in_ms):
35*6dbdd20aSAndroid Build Coastguard Worker  return int(time_in_ms * 1000000)
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Worker
38*6dbdd20aSAndroid Build Coastguard Workerdef s_to_ns(time_in_s):
39*6dbdd20aSAndroid Build Coastguard Worker  return int(time_in_s * 1000000000)
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Workerclass Trace(object):
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker  def __init__(self, trace, prototypes):
45*6dbdd20aSAndroid Build Coastguard Worker    self.trace = trace
46*6dbdd20aSAndroid Build Coastguard Worker    self.prototypes = prototypes
47*6dbdd20aSAndroid Build Coastguard Worker    self.proc_map = {}
48*6dbdd20aSAndroid Build Coastguard Worker    self.proc_map[0] = 'idle_thread'
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker  def add_system_info(self, arch="", fingerprint=""):
51*6dbdd20aSAndroid Build Coastguard Worker    self.packet = self.trace.packet.add()
52*6dbdd20aSAndroid Build Coastguard Worker    self.packet.system_info.utsname.machine = arch
53*6dbdd20aSAndroid Build Coastguard Worker    self.packet.system_info.android_build_fingerprint = fingerprint
54*6dbdd20aSAndroid Build Coastguard Worker
55*6dbdd20aSAndroid Build Coastguard Worker  def add_ftrace_packet(self, cpu):
56*6dbdd20aSAndroid Build Coastguard Worker    self.packet = self.trace.packet.add()
57*6dbdd20aSAndroid Build Coastguard Worker    self.packet.ftrace_events.cpu = cpu
58*6dbdd20aSAndroid Build Coastguard Worker
59*6dbdd20aSAndroid Build Coastguard Worker  def add_packet(self, ts=None):
60*6dbdd20aSAndroid Build Coastguard Worker    self.packet = self.trace.packet.add()
61*6dbdd20aSAndroid Build Coastguard Worker    if ts is not None:
62*6dbdd20aSAndroid Build Coastguard Worker      self.packet.timestamp = ts
63*6dbdd20aSAndroid Build Coastguard Worker    return self.packet
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker  def __add_ftrace_event(self, ts, tid):
66*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.packet.ftrace_events.event.add()
67*6dbdd20aSAndroid Build Coastguard Worker    ftrace.timestamp = ts
68*6dbdd20aSAndroid Build Coastguard Worker    ftrace.pid = tid
69*6dbdd20aSAndroid Build Coastguard Worker    return ftrace
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard Worker  def add_rss_stat(self, ts, tid, member, size, mm_id=None, curr=None):
72*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
73*6dbdd20aSAndroid Build Coastguard Worker    rss_stat = ftrace.rss_stat
74*6dbdd20aSAndroid Build Coastguard Worker    rss_stat.member = member
75*6dbdd20aSAndroid Build Coastguard Worker    rss_stat.size = size
76*6dbdd20aSAndroid Build Coastguard Worker    if mm_id is not None:
77*6dbdd20aSAndroid Build Coastguard Worker      rss_stat.mm_id = mm_id
78*6dbdd20aSAndroid Build Coastguard Worker    if curr is not None:
79*6dbdd20aSAndroid Build Coastguard Worker      rss_stat.curr = curr
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard Worker  def add_ion_event(self, ts, tid, heap_name, len, size=0):
82*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
83*6dbdd20aSAndroid Build Coastguard Worker    ion = ftrace.ion_heap_grow
84*6dbdd20aSAndroid Build Coastguard Worker    ion.heap_name = heap_name
85*6dbdd20aSAndroid Build Coastguard Worker    ion.len = len
86*6dbdd20aSAndroid Build Coastguard Worker    ion.total_allocated = size
87*6dbdd20aSAndroid Build Coastguard Worker
88*6dbdd20aSAndroid Build Coastguard Worker  def add_oom_score_update(self, ts, oom_score_adj, pid):
89*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, pid)
90*6dbdd20aSAndroid Build Coastguard Worker    oom_score = ftrace.oom_score_adj_update
91*6dbdd20aSAndroid Build Coastguard Worker    oom_score.comm = self.proc_map[pid]
92*6dbdd20aSAndroid Build Coastguard Worker    oom_score.oom_score_adj = oom_score_adj
93*6dbdd20aSAndroid Build Coastguard Worker    oom_score.pid = pid
94*6dbdd20aSAndroid Build Coastguard Worker
95*6dbdd20aSAndroid Build Coastguard Worker  def add_sched(self,
96*6dbdd20aSAndroid Build Coastguard Worker                ts,
97*6dbdd20aSAndroid Build Coastguard Worker                prev_pid,
98*6dbdd20aSAndroid Build Coastguard Worker                next_pid,
99*6dbdd20aSAndroid Build Coastguard Worker                prev_comm=None,
100*6dbdd20aSAndroid Build Coastguard Worker                next_comm=None,
101*6dbdd20aSAndroid Build Coastguard Worker                prev_state=None):
102*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, 0)
103*6dbdd20aSAndroid Build Coastguard Worker    ss = ftrace.sched_switch
104*6dbdd20aSAndroid Build Coastguard Worker    ss.prev_comm = prev_comm or self.proc_map[prev_pid]
105*6dbdd20aSAndroid Build Coastguard Worker    ss.prev_pid = prev_pid
106*6dbdd20aSAndroid Build Coastguard Worker    ss.next_pid = next_pid
107*6dbdd20aSAndroid Build Coastguard Worker    ss.next_comm = next_comm or self.proc_map[next_pid]
108*6dbdd20aSAndroid Build Coastguard Worker    if prev_state:
109*6dbdd20aSAndroid Build Coastguard Worker      if prev_state == 'R':
110*6dbdd20aSAndroid Build Coastguard Worker        ss.prev_state = 0
111*6dbdd20aSAndroid Build Coastguard Worker      elif prev_state == 'S':
112*6dbdd20aSAndroid Build Coastguard Worker        ss.prev_state = 1
113*6dbdd20aSAndroid Build Coastguard Worker      elif prev_state == 'U' or prev_state == 'D':
114*6dbdd20aSAndroid Build Coastguard Worker        ss.prev_state = 2
115*6dbdd20aSAndroid Build Coastguard Worker      else:
116*6dbdd20aSAndroid Build Coastguard Worker        raise Exception('Invalid prev state {}'.format(prev_state))
117*6dbdd20aSAndroid Build Coastguard Worker
118*6dbdd20aSAndroid Build Coastguard Worker  def add_cpufreq(self, ts, freq, cpu):
119*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, 0)
120*6dbdd20aSAndroid Build Coastguard Worker    cpufreq = ftrace.cpu_frequency
121*6dbdd20aSAndroid Build Coastguard Worker    cpufreq.state = freq
122*6dbdd20aSAndroid Build Coastguard Worker    cpufreq.cpu_id = cpu
123*6dbdd20aSAndroid Build Coastguard Worker
124*6dbdd20aSAndroid Build Coastguard Worker  def add_kernel_lmk(self, ts, tid):
125*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
126*6dbdd20aSAndroid Build Coastguard Worker    lowmemory_kill = ftrace.lowmemory_kill
127*6dbdd20aSAndroid Build Coastguard Worker    lowmemory_kill.pid = tid
128*6dbdd20aSAndroid Build Coastguard Worker
129*6dbdd20aSAndroid Build Coastguard Worker  def add_sys_enter(self, ts, tid, id):
130*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
131*6dbdd20aSAndroid Build Coastguard Worker    sys_enter = ftrace.sys_enter
132*6dbdd20aSAndroid Build Coastguard Worker    sys_enter.id = id
133*6dbdd20aSAndroid Build Coastguard Worker
134*6dbdd20aSAndroid Build Coastguard Worker  def add_sys_exit(self, ts, tid, id, ret):
135*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
136*6dbdd20aSAndroid Build Coastguard Worker    sys_exit = ftrace.sys_exit
137*6dbdd20aSAndroid Build Coastguard Worker    sys_exit.id = id
138*6dbdd20aSAndroid Build Coastguard Worker    sys_exit.ret = ret
139*6dbdd20aSAndroid Build Coastguard Worker
140*6dbdd20aSAndroid Build Coastguard Worker  def add_newtask(self, ts, tid, new_tid, new_comm, flags):
141*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
142*6dbdd20aSAndroid Build Coastguard Worker    newtask = ftrace.task_newtask
143*6dbdd20aSAndroid Build Coastguard Worker    newtask.pid = new_tid
144*6dbdd20aSAndroid Build Coastguard Worker    newtask.comm = new_comm
145*6dbdd20aSAndroid Build Coastguard Worker    newtask.clone_flags = flags
146*6dbdd20aSAndroid Build Coastguard Worker
147*6dbdd20aSAndroid Build Coastguard Worker  def add_process_free(self, ts, tid, comm, prio):
148*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
149*6dbdd20aSAndroid Build Coastguard Worker    sched_process_free = ftrace.sched_process_free
150*6dbdd20aSAndroid Build Coastguard Worker    sched_process_free.pid = tid
151*6dbdd20aSAndroid Build Coastguard Worker    sched_process_free.comm = comm
152*6dbdd20aSAndroid Build Coastguard Worker    sched_process_free.prio = prio
153*6dbdd20aSAndroid Build Coastguard Worker
154*6dbdd20aSAndroid Build Coastguard Worker  def add_rename(self, ts, tid, old_comm, new_comm, oom_score_adj):
155*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
156*6dbdd20aSAndroid Build Coastguard Worker    task_rename = ftrace.task_rename
157*6dbdd20aSAndroid Build Coastguard Worker    task_rename.pid = tid
158*6dbdd20aSAndroid Build Coastguard Worker    task_rename.oldcomm = old_comm
159*6dbdd20aSAndroid Build Coastguard Worker    task_rename.newcomm = new_comm
160*6dbdd20aSAndroid Build Coastguard Worker    task_rename.oom_score_adj = oom_score_adj
161*6dbdd20aSAndroid Build Coastguard Worker
162*6dbdd20aSAndroid Build Coastguard Worker  def add_print(self, ts, tid, buf):
163*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
164*6dbdd20aSAndroid Build Coastguard Worker    print_event = getattr(ftrace, 'print')
165*6dbdd20aSAndroid Build Coastguard Worker    print_event.buf = buf
166*6dbdd20aSAndroid Build Coastguard Worker
167*6dbdd20aSAndroid Build Coastguard Worker  def add_kmalloc(self, ts, tid, bytes_alloc, bytes_req, call_site, gfp_flags,
168*6dbdd20aSAndroid Build Coastguard Worker                  ptr):
169*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
170*6dbdd20aSAndroid Build Coastguard Worker    kmalloc = ftrace.kmalloc
171*6dbdd20aSAndroid Build Coastguard Worker    kmalloc.bytes_alloc = bytes_alloc
172*6dbdd20aSAndroid Build Coastguard Worker    kmalloc.bytes_req = bytes_req
173*6dbdd20aSAndroid Build Coastguard Worker    kmalloc.call_site = call_site
174*6dbdd20aSAndroid Build Coastguard Worker    kmalloc.gfp_flags = gfp_flags
175*6dbdd20aSAndroid Build Coastguard Worker    kmalloc.ptr = ptr
176*6dbdd20aSAndroid Build Coastguard Worker
177*6dbdd20aSAndroid Build Coastguard Worker  def add_kfree(self, ts, tid, call_site, ptr):
178*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, tid)
179*6dbdd20aSAndroid Build Coastguard Worker    kfree = ftrace.kfree
180*6dbdd20aSAndroid Build Coastguard Worker    kfree.call_site = call_site
181*6dbdd20aSAndroid Build Coastguard Worker    kfree.ptr = ptr
182*6dbdd20aSAndroid Build Coastguard Worker
183*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_counter(self, ts, pid, tid, buf, cnt):
184*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'C|{}|{}|{}'.format(pid, buf, cnt))
185*6dbdd20aSAndroid Build Coastguard Worker
186*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_begin(self, ts, tid, pid, buf):
187*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'B|{}|{}'.format(pid, buf))
188*6dbdd20aSAndroid Build Coastguard Worker
189*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_end(self, ts, tid, pid):
190*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'E|{}'.format(pid))
191*6dbdd20aSAndroid Build Coastguard Worker
192*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_async_begin(self, ts, tid, pid, buf):
193*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'S|{}|{}|0'.format(pid, buf))
194*6dbdd20aSAndroid Build Coastguard Worker
195*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_async_end(self, ts, tid, pid, buf):
196*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'F|{}|{}|0'.format(pid, buf))
197*6dbdd20aSAndroid Build Coastguard Worker
198*6dbdd20aSAndroid Build Coastguard Worker  def add_atrace_instant(self, ts, tid, pid, buf):
199*6dbdd20aSAndroid Build Coastguard Worker    self.add_print(ts, tid, 'I|{}|{}'.format(pid, buf))
200*6dbdd20aSAndroid Build Coastguard Worker
201*6dbdd20aSAndroid Build Coastguard Worker  def add_process(self, pid, ppid, cmdline, uid=None):
202*6dbdd20aSAndroid Build Coastguard Worker    process = self.packet.process_tree.processes.add()
203*6dbdd20aSAndroid Build Coastguard Worker    process.pid = pid
204*6dbdd20aSAndroid Build Coastguard Worker    process.ppid = ppid
205*6dbdd20aSAndroid Build Coastguard Worker    process.cmdline.append(cmdline)
206*6dbdd20aSAndroid Build Coastguard Worker    if uid is not None:
207*6dbdd20aSAndroid Build Coastguard Worker      process.uid = uid
208*6dbdd20aSAndroid Build Coastguard Worker    self.proc_map[pid] = cmdline
209*6dbdd20aSAndroid Build Coastguard Worker
210*6dbdd20aSAndroid Build Coastguard Worker  def add_thread(self, tid, tgid, cmdline, name=None):
211*6dbdd20aSAndroid Build Coastguard Worker    thread = self.packet.process_tree.threads.add()
212*6dbdd20aSAndroid Build Coastguard Worker    thread.tid = tid
213*6dbdd20aSAndroid Build Coastguard Worker    thread.tgid = tgid
214*6dbdd20aSAndroid Build Coastguard Worker    if name is not None:
215*6dbdd20aSAndroid Build Coastguard Worker      thread.name = name
216*6dbdd20aSAndroid Build Coastguard Worker    self.proc_map[tid] = cmdline
217*6dbdd20aSAndroid Build Coastguard Worker
218*6dbdd20aSAndroid Build Coastguard Worker  def add_battery_counters(self, ts, charge_uah, cap_prct, curr_ua, curr_avg_ua,
219*6dbdd20aSAndroid Build Coastguard Worker                           voltage_uv):
220*6dbdd20aSAndroid Build Coastguard Worker    self.packet = self.trace.packet.add()
221*6dbdd20aSAndroid Build Coastguard Worker    self.packet.timestamp = ts
222*6dbdd20aSAndroid Build Coastguard Worker    battery_count = self.packet.battery
223*6dbdd20aSAndroid Build Coastguard Worker    battery_count.charge_counter_uah = charge_uah
224*6dbdd20aSAndroid Build Coastguard Worker    battery_count.capacity_percent = cap_prct
225*6dbdd20aSAndroid Build Coastguard Worker    battery_count.current_ua = curr_ua
226*6dbdd20aSAndroid Build Coastguard Worker    battery_count.current_avg_ua = curr_avg_ua
227*6dbdd20aSAndroid Build Coastguard Worker    battery_count.voltage_uv = voltage_uv
228*6dbdd20aSAndroid Build Coastguard Worker
229*6dbdd20aSAndroid Build Coastguard Worker  def add_binder_transaction(self, transaction_id, ts_start, ts_end, tid, pid,
230*6dbdd20aSAndroid Build Coastguard Worker                             reply_id, reply_ts_start, reply_ts_end, reply_tid,
231*6dbdd20aSAndroid Build Coastguard Worker                             reply_pid):
232*6dbdd20aSAndroid Build Coastguard Worker    # Binder transaction start.
233*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts_start, tid)
234*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction = ftrace.binder_transaction
235*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction.debug_id = transaction_id
236*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction.to_proc = reply_pid
237*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction.to_thread = reply_tid
238*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction.reply = False
239*6dbdd20aSAndroid Build Coastguard Worker
240*6dbdd20aSAndroid Build Coastguard Worker    # Binder reply start
241*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(reply_ts_start, reply_tid)
242*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction_received = ftrace.binder_transaction_received
243*6dbdd20aSAndroid Build Coastguard Worker    binder_transaction_received.debug_id = transaction_id
244*6dbdd20aSAndroid Build Coastguard Worker
245*6dbdd20aSAndroid Build Coastguard Worker    # Binder reply finish
246*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(reply_ts_end, reply_tid)
247*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction = ftrace.binder_transaction
248*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction.debug_id = reply_id
249*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction.to_proc = pid
250*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction.to_thread = tid
251*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction.reply = True
252*6dbdd20aSAndroid Build Coastguard Worker
253*6dbdd20aSAndroid Build Coastguard Worker    # Binder transaction finish
254*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts_end, tid)
255*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction_received = ftrace.binder_transaction_received
256*6dbdd20aSAndroid Build Coastguard Worker    reply_binder_transaction_received.debug_id = reply_id
257*6dbdd20aSAndroid Build Coastguard Worker
258*6dbdd20aSAndroid Build Coastguard Worker  def add_battery_counters_no_curr_ua(self, ts, charge_uah, cap_prct,
259*6dbdd20aSAndroid Build Coastguard Worker                                      curr_avg_ua, voltage_uv):
260*6dbdd20aSAndroid Build Coastguard Worker    self.packet = self.trace.packet.add()
261*6dbdd20aSAndroid Build Coastguard Worker    self.packet.timestamp = ts
262*6dbdd20aSAndroid Build Coastguard Worker    battery_count = self.packet.battery
263*6dbdd20aSAndroid Build Coastguard Worker    battery_count.charge_counter_uah = charge_uah
264*6dbdd20aSAndroid Build Coastguard Worker    battery_count.capacity_percent = cap_prct
265*6dbdd20aSAndroid Build Coastguard Worker    battery_count.current_avg_ua = curr_avg_ua
266*6dbdd20aSAndroid Build Coastguard Worker    battery_count.voltage_uv = voltage_uv
267*6dbdd20aSAndroid Build Coastguard Worker
268*6dbdd20aSAndroid Build Coastguard Worker  def add_power_rails_desc(self, index_val, name):
269*6dbdd20aSAndroid Build Coastguard Worker    power_rails = self.packet.power_rails
270*6dbdd20aSAndroid Build Coastguard Worker    descriptor = power_rails.rail_descriptor.add()
271*6dbdd20aSAndroid Build Coastguard Worker    descriptor.index = index_val
272*6dbdd20aSAndroid Build Coastguard Worker    descriptor.rail_name = name
273*6dbdd20aSAndroid Build Coastguard Worker
274*6dbdd20aSAndroid Build Coastguard Worker  def add_power_rails_data(self, ts, index_val, value):
275*6dbdd20aSAndroid Build Coastguard Worker    power_rails = self.packet.power_rails
276*6dbdd20aSAndroid Build Coastguard Worker    energy_data = power_rails.energy_data.add()
277*6dbdd20aSAndroid Build Coastguard Worker    energy_data.index = index_val
278*6dbdd20aSAndroid Build Coastguard Worker    energy_data.timestamp_ms = ts
279*6dbdd20aSAndroid Build Coastguard Worker    energy_data.energy = value
280*6dbdd20aSAndroid Build Coastguard Worker
281*6dbdd20aSAndroid Build Coastguard Worker  def add_package_list(self, ts, name, uid, version_code):
282*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
283*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
284*6dbdd20aSAndroid Build Coastguard Worker    plist = packet.packages_list
285*6dbdd20aSAndroid Build Coastguard Worker    pinfo = plist.packages.add()
286*6dbdd20aSAndroid Build Coastguard Worker    pinfo.name = name
287*6dbdd20aSAndroid Build Coastguard Worker    pinfo.uid = uid
288*6dbdd20aSAndroid Build Coastguard Worker    pinfo.version_code = version_code
289*6dbdd20aSAndroid Build Coastguard Worker
290*6dbdd20aSAndroid Build Coastguard Worker  def add_debuggable_package_list(self, ts, name, uid, version_code):
291*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
292*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
293*6dbdd20aSAndroid Build Coastguard Worker    plist = packet.packages_list
294*6dbdd20aSAndroid Build Coastguard Worker    pinfo = plist.packages.add()
295*6dbdd20aSAndroid Build Coastguard Worker    pinfo.name = name
296*6dbdd20aSAndroid Build Coastguard Worker    pinfo.uid = uid
297*6dbdd20aSAndroid Build Coastguard Worker    pinfo.version_code = version_code
298*6dbdd20aSAndroid Build Coastguard Worker    pinfo.debuggable = True
299*6dbdd20aSAndroid Build Coastguard Worker
300*6dbdd20aSAndroid Build Coastguard Worker  def add_profile_packet(self, ts):
301*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
302*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
303*6dbdd20aSAndroid Build Coastguard Worker    return packet.profile_packet
304*6dbdd20aSAndroid Build Coastguard Worker
305*6dbdd20aSAndroid Build Coastguard Worker  def add_clock_snapshot(self, clocks, seq_id=None):
306*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
307*6dbdd20aSAndroid Build Coastguard Worker    if seq_id is not None:
308*6dbdd20aSAndroid Build Coastguard Worker      packet.trusted_packet_sequence_id = seq_id
309*6dbdd20aSAndroid Build Coastguard Worker    snap = self.packet.clock_snapshot
310*6dbdd20aSAndroid Build Coastguard Worker    for k, v in clocks.items():
311*6dbdd20aSAndroid Build Coastguard Worker      clock = snap.clocks.add()
312*6dbdd20aSAndroid Build Coastguard Worker      clock.clock_id = k
313*6dbdd20aSAndroid Build Coastguard Worker      clock.timestamp = v
314*6dbdd20aSAndroid Build Coastguard Worker
315*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_counter_spec(self,
316*6dbdd20aSAndroid Build Coastguard Worker                           ts,
317*6dbdd20aSAndroid Build Coastguard Worker                           counter_id,
318*6dbdd20aSAndroid Build Coastguard Worker                           name,
319*6dbdd20aSAndroid Build Coastguard Worker                           description=None,
320*6dbdd20aSAndroid Build Coastguard Worker                           unit_numerators=[],
321*6dbdd20aSAndroid Build Coastguard Worker                           unit_denominators=[]):
322*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
323*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
324*6dbdd20aSAndroid Build Coastguard Worker    gpu_counters = packet.gpu_counter_event
325*6dbdd20aSAndroid Build Coastguard Worker    counter_desc = gpu_counters.counter_descriptor
326*6dbdd20aSAndroid Build Coastguard Worker    spec = counter_desc.specs.add()
327*6dbdd20aSAndroid Build Coastguard Worker    spec.counter_id = counter_id
328*6dbdd20aSAndroid Build Coastguard Worker    spec.name = name
329*6dbdd20aSAndroid Build Coastguard Worker    if description is not None:
330*6dbdd20aSAndroid Build Coastguard Worker      spec.description = description
331*6dbdd20aSAndroid Build Coastguard Worker    spec.numerator_units.extend(unit_numerators)
332*6dbdd20aSAndroid Build Coastguard Worker    spec.denominator_units.extend(unit_denominators)
333*6dbdd20aSAndroid Build Coastguard Worker
334*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_counter(self, ts, counter_id, value, clock_id=None, seq_id=None):
335*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
336*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
337*6dbdd20aSAndroid Build Coastguard Worker    if clock_id is not None:
338*6dbdd20aSAndroid Build Coastguard Worker      packet.timestamp_clock_id = clock_id
339*6dbdd20aSAndroid Build Coastguard Worker    if seq_id is not None:
340*6dbdd20aSAndroid Build Coastguard Worker      packet.trusted_packet_sequence_id = seq_id
341*6dbdd20aSAndroid Build Coastguard Worker    gpu_counters = self.packet.gpu_counter_event
342*6dbdd20aSAndroid Build Coastguard Worker    gpu_counter = gpu_counters.counters.add()
343*6dbdd20aSAndroid Build Coastguard Worker    gpu_counter.counter_id = counter_id
344*6dbdd20aSAndroid Build Coastguard Worker    gpu_counter.int_value = value
345*6dbdd20aSAndroid Build Coastguard Worker
346*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_render_stages_hw_queue_spec(self, specs=[]):
347*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
348*6dbdd20aSAndroid Build Coastguard Worker    spec = self.packet.gpu_render_stage_event.specifications
349*6dbdd20aSAndroid Build Coastguard Worker    for s in specs:
350*6dbdd20aSAndroid Build Coastguard Worker      hw_queue = spec.hw_queue.add()
351*6dbdd20aSAndroid Build Coastguard Worker      hw_queue.name = s.get('name', '')
352*6dbdd20aSAndroid Build Coastguard Worker      if 'description' in s:
353*6dbdd20aSAndroid Build Coastguard Worker        hw_queue.description = s['description']
354*6dbdd20aSAndroid Build Coastguard Worker
355*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_render_stages_stage_spec(self, specs=[]):
356*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
357*6dbdd20aSAndroid Build Coastguard Worker    spec = self.packet.gpu_render_stage_event.specifications
358*6dbdd20aSAndroid Build Coastguard Worker    for s in specs:
359*6dbdd20aSAndroid Build Coastguard Worker      stage = spec.stage.add()
360*6dbdd20aSAndroid Build Coastguard Worker      stage.name = s.get('name', '')
361*6dbdd20aSAndroid Build Coastguard Worker      if 'description' in s:
362*6dbdd20aSAndroid Build Coastguard Worker        stage.description = s['description']
363*6dbdd20aSAndroid Build Coastguard Worker
364*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_render_stages(self,
365*6dbdd20aSAndroid Build Coastguard Worker                            ts,
366*6dbdd20aSAndroid Build Coastguard Worker                            event_id,
367*6dbdd20aSAndroid Build Coastguard Worker                            duration,
368*6dbdd20aSAndroid Build Coastguard Worker                            hw_queue_id,
369*6dbdd20aSAndroid Build Coastguard Worker                            stage_id,
370*6dbdd20aSAndroid Build Coastguard Worker                            context,
371*6dbdd20aSAndroid Build Coastguard Worker                            render_target_handle=None,
372*6dbdd20aSAndroid Build Coastguard Worker                            render_pass_handle=None,
373*6dbdd20aSAndroid Build Coastguard Worker                            render_subpass_index_mask=None,
374*6dbdd20aSAndroid Build Coastguard Worker                            command_buffer_handle=None,
375*6dbdd20aSAndroid Build Coastguard Worker                            submission_id=None,
376*6dbdd20aSAndroid Build Coastguard Worker                            extra_data={}):
377*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
378*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
379*6dbdd20aSAndroid Build Coastguard Worker    render_stage = self.packet.gpu_render_stage_event
380*6dbdd20aSAndroid Build Coastguard Worker    render_stage.event_id = event_id
381*6dbdd20aSAndroid Build Coastguard Worker    render_stage.duration = duration
382*6dbdd20aSAndroid Build Coastguard Worker    render_stage.hw_queue_id = hw_queue_id
383*6dbdd20aSAndroid Build Coastguard Worker    render_stage.stage_id = stage_id
384*6dbdd20aSAndroid Build Coastguard Worker    render_stage.context = context
385*6dbdd20aSAndroid Build Coastguard Worker    if render_target_handle is not None:
386*6dbdd20aSAndroid Build Coastguard Worker      render_stage.render_target_handle = render_target_handle
387*6dbdd20aSAndroid Build Coastguard Worker    if render_pass_handle is not None:
388*6dbdd20aSAndroid Build Coastguard Worker      render_stage.render_pass_handle = render_pass_handle
389*6dbdd20aSAndroid Build Coastguard Worker    if render_subpass_index_mask is not None:
390*6dbdd20aSAndroid Build Coastguard Worker      for mask in render_subpass_index_mask:
391*6dbdd20aSAndroid Build Coastguard Worker        render_stage.render_subpass_index_mask.append(mask)
392*6dbdd20aSAndroid Build Coastguard Worker    if command_buffer_handle is not None:
393*6dbdd20aSAndroid Build Coastguard Worker      render_stage.command_buffer_handle = command_buffer_handle
394*6dbdd20aSAndroid Build Coastguard Worker    if submission_id is not None:
395*6dbdd20aSAndroid Build Coastguard Worker      render_stage.submission_id = submission_id
396*6dbdd20aSAndroid Build Coastguard Worker    for key, value in extra_data.items():
397*6dbdd20aSAndroid Build Coastguard Worker      data = render_stage.extra_data.add()
398*6dbdd20aSAndroid Build Coastguard Worker      data.name = key
399*6dbdd20aSAndroid Build Coastguard Worker      if value is not None:
400*6dbdd20aSAndroid Build Coastguard Worker        data.value = value
401*6dbdd20aSAndroid Build Coastguard Worker
402*6dbdd20aSAndroid Build Coastguard Worker  def add_vk_debug_marker(self, ts, pid, vk_device, obj_type, obj, obj_name):
403*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
404*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
405*6dbdd20aSAndroid Build Coastguard Worker    debug_marker = (self.packet.vulkan_api_event.vk_debug_utils_object_name)
406*6dbdd20aSAndroid Build Coastguard Worker    debug_marker.pid = pid
407*6dbdd20aSAndroid Build Coastguard Worker    debug_marker.vk_device = vk_device
408*6dbdd20aSAndroid Build Coastguard Worker    debug_marker.object_type = obj_type
409*6dbdd20aSAndroid Build Coastguard Worker    debug_marker.object = obj
410*6dbdd20aSAndroid Build Coastguard Worker    debug_marker.object_name = obj_name
411*6dbdd20aSAndroid Build Coastguard Worker
412*6dbdd20aSAndroid Build Coastguard Worker  def add_vk_queue_submit(self, ts, dur, pid, tid, vk_queue, vk_command_buffers,
413*6dbdd20aSAndroid Build Coastguard Worker                          submission_id):
414*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
415*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
416*6dbdd20aSAndroid Build Coastguard Worker    submit = (self.packet.vulkan_api_event.vk_queue_submit)
417*6dbdd20aSAndroid Build Coastguard Worker    submit.duration_ns = dur
418*6dbdd20aSAndroid Build Coastguard Worker    submit.pid = pid
419*6dbdd20aSAndroid Build Coastguard Worker    submit.tid = tid
420*6dbdd20aSAndroid Build Coastguard Worker    for cmd in vk_command_buffers:
421*6dbdd20aSAndroid Build Coastguard Worker      submit.vk_command_buffers.append(cmd)
422*6dbdd20aSAndroid Build Coastguard Worker    submit.submission_id = submission_id
423*6dbdd20aSAndroid Build Coastguard Worker
424*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_log(self, ts, severity, tag, message):
425*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
426*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
427*6dbdd20aSAndroid Build Coastguard Worker    gpu_log = self.packet.gpu_log
428*6dbdd20aSAndroid Build Coastguard Worker    gpu_log.severity = severity
429*6dbdd20aSAndroid Build Coastguard Worker    gpu_log.tag = tag
430*6dbdd20aSAndroid Build Coastguard Worker    gpu_log.log_message = message
431*6dbdd20aSAndroid Build Coastguard Worker
432*6dbdd20aSAndroid Build Coastguard Worker  def add_buffer_event_packet(self, ts, buffer_id, layer_name, frame_number,
433*6dbdd20aSAndroid Build Coastguard Worker                              event_type, duration):
434*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
435*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
436*6dbdd20aSAndroid Build Coastguard Worker    buffer_event = packet.graphics_frame_event.buffer_event
437*6dbdd20aSAndroid Build Coastguard Worker    if buffer_id >= 0:
438*6dbdd20aSAndroid Build Coastguard Worker      buffer_event.buffer_id = buffer_id
439*6dbdd20aSAndroid Build Coastguard Worker    buffer_event.layer_name = layer_name
440*6dbdd20aSAndroid Build Coastguard Worker    buffer_event.frame_number = frame_number
441*6dbdd20aSAndroid Build Coastguard Worker    if event_type >= 0:
442*6dbdd20aSAndroid Build Coastguard Worker      buffer_event.type = event_type
443*6dbdd20aSAndroid Build Coastguard Worker    buffer_event.duration_ns = duration
444*6dbdd20aSAndroid Build Coastguard Worker
445*6dbdd20aSAndroid Build Coastguard Worker  def add_cpu(self, freqs):
446*6dbdd20aSAndroid Build Coastguard Worker    cpu = self.packet.cpu_info.cpus.add()
447*6dbdd20aSAndroid Build Coastguard Worker    for freq in freqs:
448*6dbdd20aSAndroid Build Coastguard Worker      cpu.frequencies.append(freq)
449*6dbdd20aSAndroid Build Coastguard Worker
450*6dbdd20aSAndroid Build Coastguard Worker  def add_process_stats(self, pid, freqs):
451*6dbdd20aSAndroid Build Coastguard Worker    process = self.packet.process_stats.processes.add()
452*6dbdd20aSAndroid Build Coastguard Worker    process.pid = pid
453*6dbdd20aSAndroid Build Coastguard Worker    thread = process.threads.add()
454*6dbdd20aSAndroid Build Coastguard Worker    thread.tid = pid * 10
455*6dbdd20aSAndroid Build Coastguard Worker    for index in freqs:
456*6dbdd20aSAndroid Build Coastguard Worker      thread.cpu_freq_indices.append(index)
457*6dbdd20aSAndroid Build Coastguard Worker      thread.cpu_freq_ticks.append(freqs[index])
458*6dbdd20aSAndroid Build Coastguard Worker
459*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_mem_total_ftrace_event(self, ftrace_pid, pid, ts, size):
460*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, ftrace_pid)
461*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_ftrace_event = ftrace.gpu_mem_total
462*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_ftrace_event.pid = pid
463*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_ftrace_event.size = size
464*6dbdd20aSAndroid Build Coastguard Worker
465*6dbdd20aSAndroid Build Coastguard Worker  def add_gpu_mem_total_event(self, pid, ts, size):
466*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
467*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
468*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_event = packet.gpu_mem_total_event
469*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_event.pid = pid
470*6dbdd20aSAndroid Build Coastguard Worker    gpu_mem_total_event.size = size
471*6dbdd20aSAndroid Build Coastguard Worker
472*6dbdd20aSAndroid Build Coastguard Worker  def add_sched_blocked_reason(self, ts, pid, io_wait, unblock_pid):
473*6dbdd20aSAndroid Build Coastguard Worker    ftrace = self.__add_ftrace_event(ts, unblock_pid)
474*6dbdd20aSAndroid Build Coastguard Worker    sched_blocked_reason = ftrace.sched_blocked_reason
475*6dbdd20aSAndroid Build Coastguard Worker    sched_blocked_reason.pid = pid
476*6dbdd20aSAndroid Build Coastguard Worker    sched_blocked_reason.io_wait = io_wait
477*6dbdd20aSAndroid Build Coastguard Worker
478*6dbdd20aSAndroid Build Coastguard Worker  def add_track_event(self,
479*6dbdd20aSAndroid Build Coastguard Worker                      name=None,
480*6dbdd20aSAndroid Build Coastguard Worker                      ts=None,
481*6dbdd20aSAndroid Build Coastguard Worker                      track=None,
482*6dbdd20aSAndroid Build Coastguard Worker                      trusted_sequence_id=0,
483*6dbdd20aSAndroid Build Coastguard Worker                      cpu_time=None):
484*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet(ts=ts)
485*6dbdd20aSAndroid Build Coastguard Worker    if name is not None:
486*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.name = name
487*6dbdd20aSAndroid Build Coastguard Worker    if track is not None:
488*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.track_uuid = track
489*6dbdd20aSAndroid Build Coastguard Worker    packet.trusted_packet_sequence_id = trusted_sequence_id
490*6dbdd20aSAndroid Build Coastguard Worker    if cpu_time is not None:
491*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.extra_counter_values.append(cpu_time)
492*6dbdd20aSAndroid Build Coastguard Worker    return packet
493*6dbdd20aSAndroid Build Coastguard Worker
494*6dbdd20aSAndroid Build Coastguard Worker  def add_track_descriptor(self, uuid, parent=None):
495*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
496*6dbdd20aSAndroid Build Coastguard Worker    track_descriptor = packet.track_descriptor
497*6dbdd20aSAndroid Build Coastguard Worker    if uuid is not None:
498*6dbdd20aSAndroid Build Coastguard Worker      track_descriptor.uuid = uuid
499*6dbdd20aSAndroid Build Coastguard Worker    if parent is not None:
500*6dbdd20aSAndroid Build Coastguard Worker      track_descriptor.parent_uuid = parent
501*6dbdd20aSAndroid Build Coastguard Worker    return packet
502*6dbdd20aSAndroid Build Coastguard Worker
503*6dbdd20aSAndroid Build Coastguard Worker  def add_process_track_descriptor(self,
504*6dbdd20aSAndroid Build Coastguard Worker                                   process_track,
505*6dbdd20aSAndroid Build Coastguard Worker                                   pid=None,
506*6dbdd20aSAndroid Build Coastguard Worker                                   process_name=None):
507*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_descriptor(process_track)
508*6dbdd20aSAndroid Build Coastguard Worker    if pid is not None:
509*6dbdd20aSAndroid Build Coastguard Worker      packet.track_descriptor.process.pid = pid
510*6dbdd20aSAndroid Build Coastguard Worker    if process_name is not None:
511*6dbdd20aSAndroid Build Coastguard Worker      packet.track_descriptor.process.process_name = process_name
512*6dbdd20aSAndroid Build Coastguard Worker    return packet
513*6dbdd20aSAndroid Build Coastguard Worker
514*6dbdd20aSAndroid Build Coastguard Worker  def add_chrome_process_track_descriptor(
515*6dbdd20aSAndroid Build Coastguard Worker      self,
516*6dbdd20aSAndroid Build Coastguard Worker      process_track,
517*6dbdd20aSAndroid Build Coastguard Worker      pid=None,
518*6dbdd20aSAndroid Build Coastguard Worker      process_type=None,
519*6dbdd20aSAndroid Build Coastguard Worker      host_app_package_name="org.chromium.chrome"):
520*6dbdd20aSAndroid Build Coastguard Worker    if process_type is None:
521*6dbdd20aSAndroid Build Coastguard Worker      process_type = self.prototypes.ChromeProcessDescriptor \
522*6dbdd20aSAndroid Build Coastguard Worker        .ProcessType \
523*6dbdd20aSAndroid Build Coastguard Worker        .PROCESS_RENDERER
524*6dbdd20aSAndroid Build Coastguard Worker
525*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_process_track_descriptor(process_track, pid=pid)
526*6dbdd20aSAndroid Build Coastguard Worker    chrome_process = packet.track_descriptor.chrome_process
527*6dbdd20aSAndroid Build Coastguard Worker    chrome_process.process_type = process_type
528*6dbdd20aSAndroid Build Coastguard Worker    chrome_process.host_app_package_name = host_app_package_name
529*6dbdd20aSAndroid Build Coastguard Worker    return packet
530*6dbdd20aSAndroid Build Coastguard Worker
531*6dbdd20aSAndroid Build Coastguard Worker  def add_thread_track_descriptor(self,
532*6dbdd20aSAndroid Build Coastguard Worker                                  process_track,
533*6dbdd20aSAndroid Build Coastguard Worker                                  thread_track,
534*6dbdd20aSAndroid Build Coastguard Worker                                  trusted_packet_sequence_id=None,
535*6dbdd20aSAndroid Build Coastguard Worker                                  pid=None,
536*6dbdd20aSAndroid Build Coastguard Worker                                  tid=None,
537*6dbdd20aSAndroid Build Coastguard Worker                                  thread_name=None):
538*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_descriptor(thread_track, parent=process_track)
539*6dbdd20aSAndroid Build Coastguard Worker    if trusted_packet_sequence_id is not None:
540*6dbdd20aSAndroid Build Coastguard Worker      packet.trusted_packet_sequence_id = trusted_packet_sequence_id
541*6dbdd20aSAndroid Build Coastguard Worker    if pid is not None:
542*6dbdd20aSAndroid Build Coastguard Worker      packet.track_descriptor.thread.pid = pid
543*6dbdd20aSAndroid Build Coastguard Worker    if tid is not None:
544*6dbdd20aSAndroid Build Coastguard Worker      packet.track_descriptor.thread.tid = tid
545*6dbdd20aSAndroid Build Coastguard Worker    if thread_name is not None:
546*6dbdd20aSAndroid Build Coastguard Worker      packet.track_descriptor.thread.thread_name = thread_name
547*6dbdd20aSAndroid Build Coastguard Worker    return packet
548*6dbdd20aSAndroid Build Coastguard Worker
549*6dbdd20aSAndroid Build Coastguard Worker  def add_chrome_thread_track_descriptor(self,
550*6dbdd20aSAndroid Build Coastguard Worker                                         process_track,
551*6dbdd20aSAndroid Build Coastguard Worker                                         thread_track,
552*6dbdd20aSAndroid Build Coastguard Worker                                         trusted_packet_sequence_id=None,
553*6dbdd20aSAndroid Build Coastguard Worker                                         pid=None,
554*6dbdd20aSAndroid Build Coastguard Worker                                         tid=None,
555*6dbdd20aSAndroid Build Coastguard Worker                                         thread_type=None):
556*6dbdd20aSAndroid Build Coastguard Worker    if thread_type is None:
557*6dbdd20aSAndroid Build Coastguard Worker      thread_type = self.prototypes.ThreadDescriptor \
558*6dbdd20aSAndroid Build Coastguard Worker        .ChromeThreadType \
559*6dbdd20aSAndroid Build Coastguard Worker        .CHROME_THREAD_TYPE_UNSPECIFIED
560*6dbdd20aSAndroid Build Coastguard Worker
561*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_thread_track_descriptor(
562*6dbdd20aSAndroid Build Coastguard Worker        process_track,
563*6dbdd20aSAndroid Build Coastguard Worker        thread_track,
564*6dbdd20aSAndroid Build Coastguard Worker        trusted_packet_sequence_id=trusted_packet_sequence_id,
565*6dbdd20aSAndroid Build Coastguard Worker        pid=pid,
566*6dbdd20aSAndroid Build Coastguard Worker        tid=tid)
567*6dbdd20aSAndroid Build Coastguard Worker    packet.track_descriptor.thread.chrome_thread_type = thread_type
568*6dbdd20aSAndroid Build Coastguard Worker    return packet
569*6dbdd20aSAndroid Build Coastguard Worker
570*6dbdd20aSAndroid Build Coastguard Worker  def add_trace_packet_defaults(self,
571*6dbdd20aSAndroid Build Coastguard Worker                                trusted_packet_sequence_id=None,
572*6dbdd20aSAndroid Build Coastguard Worker                                thread_track=None,
573*6dbdd20aSAndroid Build Coastguard Worker                                counter_track=None):
574*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_descriptor(None)
575*6dbdd20aSAndroid Build Coastguard Worker    packet.trusted_packet_sequence_id = trusted_packet_sequence_id
576*6dbdd20aSAndroid Build Coastguard Worker    track_event_defaults = packet.trace_packet_defaults.track_event_defaults
577*6dbdd20aSAndroid Build Coastguard Worker    track_event_defaults.track_uuid = thread_track
578*6dbdd20aSAndroid Build Coastguard Worker    track_event_defaults.extra_counter_track_uuids.append(counter_track)
579*6dbdd20aSAndroid Build Coastguard Worker    return packet
580*6dbdd20aSAndroid Build Coastguard Worker
581*6dbdd20aSAndroid Build Coastguard Worker  def add_counter_track_descriptor(self,
582*6dbdd20aSAndroid Build Coastguard Worker                                   trusted_packet_sequence_id=None,
583*6dbdd20aSAndroid Build Coastguard Worker                                   thread_track=None,
584*6dbdd20aSAndroid Build Coastguard Worker                                   counter_track=None):
585*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_descriptor(counter_track, parent=thread_track)
586*6dbdd20aSAndroid Build Coastguard Worker    packet.trusted_packet_sequence_id = trusted_packet_sequence_id
587*6dbdd20aSAndroid Build Coastguard Worker    packet.track_descriptor.counter.type = self.prototypes.CounterDescriptor \
588*6dbdd20aSAndroid Build Coastguard Worker      .BuiltinCounterType \
589*6dbdd20aSAndroid Build Coastguard Worker      .COUNTER_THREAD_TIME_NS
590*6dbdd20aSAndroid Build Coastguard Worker    return packet
591*6dbdd20aSAndroid Build Coastguard Worker
592*6dbdd20aSAndroid Build Coastguard Worker  def add_chrome_thread_with_cpu_counter(self,
593*6dbdd20aSAndroid Build Coastguard Worker                                         process_track,
594*6dbdd20aSAndroid Build Coastguard Worker                                         thread_track,
595*6dbdd20aSAndroid Build Coastguard Worker                                         trusted_packet_sequence_id=None,
596*6dbdd20aSAndroid Build Coastguard Worker                                         counter_track=None,
597*6dbdd20aSAndroid Build Coastguard Worker                                         pid=None,
598*6dbdd20aSAndroid Build Coastguard Worker                                         tid=None,
599*6dbdd20aSAndroid Build Coastguard Worker                                         thread_type=None):
600*6dbdd20aSAndroid Build Coastguard Worker    self.add_chrome_thread_track_descriptor(
601*6dbdd20aSAndroid Build Coastguard Worker        process_track,
602*6dbdd20aSAndroid Build Coastguard Worker        thread_track,
603*6dbdd20aSAndroid Build Coastguard Worker        trusted_packet_sequence_id=trusted_packet_sequence_id,
604*6dbdd20aSAndroid Build Coastguard Worker        pid=pid,
605*6dbdd20aSAndroid Build Coastguard Worker        tid=tid,
606*6dbdd20aSAndroid Build Coastguard Worker        thread_type=thread_type)
607*6dbdd20aSAndroid Build Coastguard Worker    self.add_trace_packet_defaults(
608*6dbdd20aSAndroid Build Coastguard Worker        trusted_packet_sequence_id=trusted_packet_sequence_id,
609*6dbdd20aSAndroid Build Coastguard Worker        counter_track=counter_track,
610*6dbdd20aSAndroid Build Coastguard Worker        thread_track=thread_track)
611*6dbdd20aSAndroid Build Coastguard Worker
612*6dbdd20aSAndroid Build Coastguard Worker    self.add_counter_track_descriptor(
613*6dbdd20aSAndroid Build Coastguard Worker        trusted_packet_sequence_id=trusted_packet_sequence_id,
614*6dbdd20aSAndroid Build Coastguard Worker        counter_track=counter_track,
615*6dbdd20aSAndroid Build Coastguard Worker        thread_track=thread_track)
616*6dbdd20aSAndroid Build Coastguard Worker
617*6dbdd20aSAndroid Build Coastguard Worker  def add_track_event_slice_begin(self,
618*6dbdd20aSAndroid Build Coastguard Worker                                  name,
619*6dbdd20aSAndroid Build Coastguard Worker                                  ts,
620*6dbdd20aSAndroid Build Coastguard Worker                                  track=None,
621*6dbdd20aSAndroid Build Coastguard Worker                                  trusted_sequence_id=0,
622*6dbdd20aSAndroid Build Coastguard Worker                                  cpu_time=None):
623*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event(
624*6dbdd20aSAndroid Build Coastguard Worker        name,
625*6dbdd20aSAndroid Build Coastguard Worker        ts=ts,
626*6dbdd20aSAndroid Build Coastguard Worker        track=track,
627*6dbdd20aSAndroid Build Coastguard Worker        trusted_sequence_id=trusted_sequence_id,
628*6dbdd20aSAndroid Build Coastguard Worker        cpu_time=cpu_time)
629*6dbdd20aSAndroid Build Coastguard Worker    packet.track_event.type = self.prototypes.TrackEvent.Type.TYPE_SLICE_BEGIN
630*6dbdd20aSAndroid Build Coastguard Worker    return packet
631*6dbdd20aSAndroid Build Coastguard Worker
632*6dbdd20aSAndroid Build Coastguard Worker  def add_track_event_slice_end(self,
633*6dbdd20aSAndroid Build Coastguard Worker                                ts,
634*6dbdd20aSAndroid Build Coastguard Worker                                track=None,
635*6dbdd20aSAndroid Build Coastguard Worker                                trusted_sequence_id=0,
636*6dbdd20aSAndroid Build Coastguard Worker                                cpu_time=None):
637*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event(
638*6dbdd20aSAndroid Build Coastguard Worker        ts=ts,
639*6dbdd20aSAndroid Build Coastguard Worker        track=track,
640*6dbdd20aSAndroid Build Coastguard Worker        trusted_sequence_id=trusted_sequence_id,
641*6dbdd20aSAndroid Build Coastguard Worker        cpu_time=cpu_time)
642*6dbdd20aSAndroid Build Coastguard Worker    packet.track_event.type = self.prototypes.TrackEvent.Type.TYPE_SLICE_END
643*6dbdd20aSAndroid Build Coastguard Worker    return packet
644*6dbdd20aSAndroid Build Coastguard Worker
645*6dbdd20aSAndroid Build Coastguard Worker  # Returns the start slice packet.
646*6dbdd20aSAndroid Build Coastguard Worker  def add_track_event_slice(self,
647*6dbdd20aSAndroid Build Coastguard Worker                            name,
648*6dbdd20aSAndroid Build Coastguard Worker                            ts,
649*6dbdd20aSAndroid Build Coastguard Worker                            dur,
650*6dbdd20aSAndroid Build Coastguard Worker                            track=None,
651*6dbdd20aSAndroid Build Coastguard Worker                            trusted_sequence_id=0,
652*6dbdd20aSAndroid Build Coastguard Worker                            cpu_start=None,
653*6dbdd20aSAndroid Build Coastguard Worker                            cpu_delta=None):
654*6dbdd20aSAndroid Build Coastguard Worker
655*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event_slice_begin(
656*6dbdd20aSAndroid Build Coastguard Worker        name,
657*6dbdd20aSAndroid Build Coastguard Worker        ts,
658*6dbdd20aSAndroid Build Coastguard Worker        track=track,
659*6dbdd20aSAndroid Build Coastguard Worker        trusted_sequence_id=trusted_sequence_id,
660*6dbdd20aSAndroid Build Coastguard Worker        cpu_time=cpu_start)
661*6dbdd20aSAndroid Build Coastguard Worker
662*6dbdd20aSAndroid Build Coastguard Worker    if dur >= 0:
663*6dbdd20aSAndroid Build Coastguard Worker      cpu_end = cpu_start + cpu_delta if cpu_start is not None else None
664*6dbdd20aSAndroid Build Coastguard Worker      self.add_track_event_slice_end(
665*6dbdd20aSAndroid Build Coastguard Worker          ts + dur,
666*6dbdd20aSAndroid Build Coastguard Worker          track=track,
667*6dbdd20aSAndroid Build Coastguard Worker          trusted_sequence_id=trusted_sequence_id,
668*6dbdd20aSAndroid Build Coastguard Worker          cpu_time=cpu_end)
669*6dbdd20aSAndroid Build Coastguard Worker
670*6dbdd20aSAndroid Build Coastguard Worker    return packet
671*6dbdd20aSAndroid Build Coastguard Worker
672*6dbdd20aSAndroid Build Coastguard Worker  def add_rail_mode_slice(self, ts, dur, track, mode):
673*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event_slice(
674*6dbdd20aSAndroid Build Coastguard Worker        "Scheduler.RAILMode", ts=ts, dur=dur, track=track)
675*6dbdd20aSAndroid Build Coastguard Worker    packet.track_event.chrome_renderer_scheduler_state.rail_mode = mode
676*6dbdd20aSAndroid Build Coastguard Worker
677*6dbdd20aSAndroid Build Coastguard Worker  def add_latency_info_flow(self,
678*6dbdd20aSAndroid Build Coastguard Worker                            ts,
679*6dbdd20aSAndroid Build Coastguard Worker                            dur,
680*6dbdd20aSAndroid Build Coastguard Worker                            track=None,
681*6dbdd20aSAndroid Build Coastguard Worker                            trusted_sequence_id=None,
682*6dbdd20aSAndroid Build Coastguard Worker                            trace_id=None,
683*6dbdd20aSAndroid Build Coastguard Worker                            step=None,
684*6dbdd20aSAndroid Build Coastguard Worker                            flow_ids=[],
685*6dbdd20aSAndroid Build Coastguard Worker                            terminating_flow_ids=[]):
686*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event_slice(
687*6dbdd20aSAndroid Build Coastguard Worker        "LatencyInfo.Flow",
688*6dbdd20aSAndroid Build Coastguard Worker        ts,
689*6dbdd20aSAndroid Build Coastguard Worker        dur,
690*6dbdd20aSAndroid Build Coastguard Worker        track=track,
691*6dbdd20aSAndroid Build Coastguard Worker        trusted_sequence_id=trusted_sequence_id)
692*6dbdd20aSAndroid Build Coastguard Worker    if trace_id is not None:
693*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.chrome_latency_info.trace_id = trace_id
694*6dbdd20aSAndroid Build Coastguard Worker    if step is not None:
695*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.chrome_latency_info.step = step
696*6dbdd20aSAndroid Build Coastguard Worker    for flow_id in flow_ids:
697*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.flow_ids.append(flow_id)
698*6dbdd20aSAndroid Build Coastguard Worker    for flow_id in terminating_flow_ids:
699*6dbdd20aSAndroid Build Coastguard Worker      packet.track_event.terminating_flow_ids.append(flow_id)
700*6dbdd20aSAndroid Build Coastguard Worker    return packet
701*6dbdd20aSAndroid Build Coastguard Worker
702*6dbdd20aSAndroid Build Coastguard Worker  def add_input_latency_event_slice(self,
703*6dbdd20aSAndroid Build Coastguard Worker                                    name,
704*6dbdd20aSAndroid Build Coastguard Worker                                    ts,
705*6dbdd20aSAndroid Build Coastguard Worker                                    dur,
706*6dbdd20aSAndroid Build Coastguard Worker                                    track=None,
707*6dbdd20aSAndroid Build Coastguard Worker                                    trace_id=None,
708*6dbdd20aSAndroid Build Coastguard Worker                                    gesture_scroll_id=None,
709*6dbdd20aSAndroid Build Coastguard Worker                                    touch_id=None,
710*6dbdd20aSAndroid Build Coastguard Worker                                    is_coalesced=None,
711*6dbdd20aSAndroid Build Coastguard Worker                                    gets_to_gpu=True):
712*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_track_event_slice(
713*6dbdd20aSAndroid Build Coastguard Worker        "InputLatency::" + name, ts=ts, dur=dur, track=track)
714*6dbdd20aSAndroid Build Coastguard Worker    latency_info = packet.track_event.chrome_latency_info
715*6dbdd20aSAndroid Build Coastguard Worker    latency_info.trace_id = trace_id
716*6dbdd20aSAndroid Build Coastguard Worker    if gesture_scroll_id is not None:
717*6dbdd20aSAndroid Build Coastguard Worker      latency_info.gesture_scroll_id = gesture_scroll_id
718*6dbdd20aSAndroid Build Coastguard Worker    if touch_id is not None:
719*6dbdd20aSAndroid Build Coastguard Worker      latency_info.touch_id = touch_id
720*6dbdd20aSAndroid Build Coastguard Worker    if gets_to_gpu:
721*6dbdd20aSAndroid Build Coastguard Worker      component = latency_info.component_info.add()
722*6dbdd20aSAndroid Build Coastguard Worker      component.component_type = self.prototypes \
723*6dbdd20aSAndroid Build Coastguard Worker          .ChromeLatencyInfo.ComponentType \
724*6dbdd20aSAndroid Build Coastguard Worker          .COMPONENT_INPUT_EVENT_GPU_SWAP_BUFFER
725*6dbdd20aSAndroid Build Coastguard Worker    if is_coalesced is not None:
726*6dbdd20aSAndroid Build Coastguard Worker      latency_info.is_coalesced = is_coalesced
727*6dbdd20aSAndroid Build Coastguard Worker    return packet
728*6dbdd20aSAndroid Build Coastguard Worker
729*6dbdd20aSAndroid Build Coastguard Worker  def add_chrome_metadata(self, os_name=None):
730*6dbdd20aSAndroid Build Coastguard Worker    metadata = self.add_packet().chrome_events.metadata.add()
731*6dbdd20aSAndroid Build Coastguard Worker    if os_name is not None:
732*6dbdd20aSAndroid Build Coastguard Worker      metadata.name = "os-name"
733*6dbdd20aSAndroid Build Coastguard Worker      metadata.string_value = os_name
734*6dbdd20aSAndroid Build Coastguard Worker
735*6dbdd20aSAndroid Build Coastguard Worker    return metadata
736*6dbdd20aSAndroid Build Coastguard Worker
737*6dbdd20aSAndroid Build Coastguard Worker  def add_expected_display_frame_start_event(self, ts, cookie, token, pid):
738*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
739*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
740*6dbdd20aSAndroid Build Coastguard Worker    event = packet.frame_timeline_event.expected_display_frame_start
741*6dbdd20aSAndroid Build Coastguard Worker    if token != -1:
742*6dbdd20aSAndroid Build Coastguard Worker      event.cookie = cookie
743*6dbdd20aSAndroid Build Coastguard Worker      event.token = token
744*6dbdd20aSAndroid Build Coastguard Worker      event.pid = pid
745*6dbdd20aSAndroid Build Coastguard Worker
746*6dbdd20aSAndroid Build Coastguard Worker  def add_actual_display_frame_start_event(self, ts, cookie, token, pid,
747*6dbdd20aSAndroid Build Coastguard Worker                                           present_type, on_time_finish,
748*6dbdd20aSAndroid Build Coastguard Worker                                           gpu_composition, jank_type,
749*6dbdd20aSAndroid Build Coastguard Worker                                           prediction_type):
750*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
751*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
752*6dbdd20aSAndroid Build Coastguard Worker    event = packet.frame_timeline_event.actual_display_frame_start
753*6dbdd20aSAndroid Build Coastguard Worker    if token != -1:
754*6dbdd20aSAndroid Build Coastguard Worker      event.cookie = cookie
755*6dbdd20aSAndroid Build Coastguard Worker      event.token = token
756*6dbdd20aSAndroid Build Coastguard Worker      event.pid = pid
757*6dbdd20aSAndroid Build Coastguard Worker      event.present_type = present_type
758*6dbdd20aSAndroid Build Coastguard Worker      event.on_time_finish = on_time_finish
759*6dbdd20aSAndroid Build Coastguard Worker      event.gpu_composition = gpu_composition
760*6dbdd20aSAndroid Build Coastguard Worker      event.jank_type = jank_type
761*6dbdd20aSAndroid Build Coastguard Worker      event.prediction_type = prediction_type
762*6dbdd20aSAndroid Build Coastguard Worker
763*6dbdd20aSAndroid Build Coastguard Worker  def add_expected_surface_frame_start_event(self, ts, cookie, token,
764*6dbdd20aSAndroid Build Coastguard Worker                                             display_frame_token, pid,
765*6dbdd20aSAndroid Build Coastguard Worker                                             layer_name):
766*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
767*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
768*6dbdd20aSAndroid Build Coastguard Worker    event = packet.frame_timeline_event.expected_surface_frame_start
769*6dbdd20aSAndroid Build Coastguard Worker    if token != -1 and display_frame_token != -1:
770*6dbdd20aSAndroid Build Coastguard Worker      event.cookie = cookie
771*6dbdd20aSAndroid Build Coastguard Worker      event.token = token
772*6dbdd20aSAndroid Build Coastguard Worker      event.display_frame_token = display_frame_token
773*6dbdd20aSAndroid Build Coastguard Worker      event.pid = pid
774*6dbdd20aSAndroid Build Coastguard Worker      event.layer_name = layer_name
775*6dbdd20aSAndroid Build Coastguard Worker
776*6dbdd20aSAndroid Build Coastguard Worker  def add_actual_surface_frame_start_event(self,
777*6dbdd20aSAndroid Build Coastguard Worker                                           ts,
778*6dbdd20aSAndroid Build Coastguard Worker                                           cookie,
779*6dbdd20aSAndroid Build Coastguard Worker                                           token,
780*6dbdd20aSAndroid Build Coastguard Worker                                           display_frame_token,
781*6dbdd20aSAndroid Build Coastguard Worker                                           pid,
782*6dbdd20aSAndroid Build Coastguard Worker                                           layer_name,
783*6dbdd20aSAndroid Build Coastguard Worker                                           present_type,
784*6dbdd20aSAndroid Build Coastguard Worker                                           on_time_finish,
785*6dbdd20aSAndroid Build Coastguard Worker                                           gpu_composition,
786*6dbdd20aSAndroid Build Coastguard Worker                                           jank_type,
787*6dbdd20aSAndroid Build Coastguard Worker                                           prediction_type,
788*6dbdd20aSAndroid Build Coastguard Worker                                           jank_severity_type=None):
789*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
790*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
791*6dbdd20aSAndroid Build Coastguard Worker    event = packet.frame_timeline_event.actual_surface_frame_start
792*6dbdd20aSAndroid Build Coastguard Worker    if token != -1 and display_frame_token != -1:
793*6dbdd20aSAndroid Build Coastguard Worker      event.cookie = cookie
794*6dbdd20aSAndroid Build Coastguard Worker      event.token = token
795*6dbdd20aSAndroid Build Coastguard Worker      event.display_frame_token = display_frame_token
796*6dbdd20aSAndroid Build Coastguard Worker      event.pid = pid
797*6dbdd20aSAndroid Build Coastguard Worker      event.layer_name = layer_name
798*6dbdd20aSAndroid Build Coastguard Worker      event.present_type = present_type
799*6dbdd20aSAndroid Build Coastguard Worker      event.on_time_finish = on_time_finish
800*6dbdd20aSAndroid Build Coastguard Worker      event.gpu_composition = gpu_composition
801*6dbdd20aSAndroid Build Coastguard Worker      event.jank_type = jank_type
802*6dbdd20aSAndroid Build Coastguard Worker      # jank severity type is not available on every trace.
803*6dbdd20aSAndroid Build Coastguard Worker      # When not set, default to none if no jank; otherwise default to unknown
804*6dbdd20aSAndroid Build Coastguard Worker      if jank_severity_type is None:
805*6dbdd20aSAndroid Build Coastguard Worker        event.jank_severity_type = 1 if event.jank_type == 1 else 0
806*6dbdd20aSAndroid Build Coastguard Worker      else:
807*6dbdd20aSAndroid Build Coastguard Worker        event.jank_severity_type = jank_severity_type
808*6dbdd20aSAndroid Build Coastguard Worker      event.prediction_type = prediction_type
809*6dbdd20aSAndroid Build Coastguard Worker
810*6dbdd20aSAndroid Build Coastguard Worker  def add_frame_end_event(self, ts, cookie):
811*6dbdd20aSAndroid Build Coastguard Worker    packet = self.add_packet()
812*6dbdd20aSAndroid Build Coastguard Worker    packet.timestamp = ts
813*6dbdd20aSAndroid Build Coastguard Worker    event = packet.frame_timeline_event.frame_end
814*6dbdd20aSAndroid Build Coastguard Worker    event.cookie = cookie
815*6dbdd20aSAndroid Build Coastguard Worker
816*6dbdd20aSAndroid Build Coastguard Worker
817*6dbdd20aSAndroid Build Coastguard Workerdef read_descriptor(file_name):
818*6dbdd20aSAndroid Build Coastguard Worker  with open(file_name, 'rb') as f:
819*6dbdd20aSAndroid Build Coastguard Worker    contents = f.read()
820*6dbdd20aSAndroid Build Coastguard Worker
821*6dbdd20aSAndroid Build Coastguard Worker  descriptor = descriptor_pb2.FileDescriptorSet()
822*6dbdd20aSAndroid Build Coastguard Worker  descriptor.MergeFromString(contents)
823*6dbdd20aSAndroid Build Coastguard Worker
824*6dbdd20aSAndroid Build Coastguard Worker  return descriptor
825*6dbdd20aSAndroid Build Coastguard Worker
826*6dbdd20aSAndroid Build Coastguard Worker
827*6dbdd20aSAndroid Build Coastguard Workerdef create_pool(args):
828*6dbdd20aSAndroid Build Coastguard Worker  trace_descriptor = read_descriptor(args.trace_descriptor)
829*6dbdd20aSAndroid Build Coastguard Worker
830*6dbdd20aSAndroid Build Coastguard Worker  pool = descriptor_pool.DescriptorPool()
831*6dbdd20aSAndroid Build Coastguard Worker  for file in trace_descriptor.file:
832*6dbdd20aSAndroid Build Coastguard Worker    pool.Add(file)
833*6dbdd20aSAndroid Build Coastguard Worker
834*6dbdd20aSAndroid Build Coastguard Worker  return pool
835*6dbdd20aSAndroid Build Coastguard Worker
836*6dbdd20aSAndroid Build Coastguard Worker
837*6dbdd20aSAndroid Build Coastguard Workerdef create_trace():
838*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
839*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
840*6dbdd20aSAndroid Build Coastguard Worker      'trace_descriptor', type=str, help='location of trace descriptor')
841*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
842*6dbdd20aSAndroid Build Coastguard Worker
843*6dbdd20aSAndroid Build Coastguard Worker  pool = create_pool(args)
844*6dbdd20aSAndroid Build Coastguard Worker  ProtoTrace = get_message_class(
845*6dbdd20aSAndroid Build Coastguard Worker      pool, pool.FindMessageTypeByName('perfetto.protos.Trace'))
846*6dbdd20aSAndroid Build Coastguard Worker
847*6dbdd20aSAndroid Build Coastguard Worker  class EnumPrototype(object):
848*6dbdd20aSAndroid Build Coastguard Worker
849*6dbdd20aSAndroid Build Coastguard Worker    def from_descriptor(desc):
850*6dbdd20aSAndroid Build Coastguard Worker      res = EnumPrototype()
851*6dbdd20aSAndroid Build Coastguard Worker      for desc in desc.values:
852*6dbdd20aSAndroid Build Coastguard Worker        setattr(res, desc.name, desc.number)
853*6dbdd20aSAndroid Build Coastguard Worker      return res
854*6dbdd20aSAndroid Build Coastguard Worker
855*6dbdd20aSAndroid Build Coastguard Worker  ChromeLatencyInfo = namedtuple('ChromeLatencyInfo', [
856*6dbdd20aSAndroid Build Coastguard Worker      'ComponentType',
857*6dbdd20aSAndroid Build Coastguard Worker      'Step',
858*6dbdd20aSAndroid Build Coastguard Worker  ])
859*6dbdd20aSAndroid Build Coastguard Worker
860*6dbdd20aSAndroid Build Coastguard Worker  Prototypes = namedtuple('Prototypes', [
861*6dbdd20aSAndroid Build Coastguard Worker      'TrackEvent',
862*6dbdd20aSAndroid Build Coastguard Worker      'ChromeRAILMode',
863*6dbdd20aSAndroid Build Coastguard Worker      'ChromeLatencyInfo',
864*6dbdd20aSAndroid Build Coastguard Worker      'ChromeProcessDescriptor',
865*6dbdd20aSAndroid Build Coastguard Worker      'CounterDescriptor',
866*6dbdd20aSAndroid Build Coastguard Worker      'ThreadDescriptor',
867*6dbdd20aSAndroid Build Coastguard Worker  ])
868*6dbdd20aSAndroid Build Coastguard Worker
869*6dbdd20aSAndroid Build Coastguard Worker  chrome_latency_info_prototypes = ChromeLatencyInfo(
870*6dbdd20aSAndroid Build Coastguard Worker      ComponentType=EnumPrototype.from_descriptor(
871*6dbdd20aSAndroid Build Coastguard Worker          pool.FindEnumTypeByName(
872*6dbdd20aSAndroid Build Coastguard Worker              'perfetto.protos.ChromeLatencyInfo.LatencyComponentType')),
873*6dbdd20aSAndroid Build Coastguard Worker      Step=EnumPrototype.from_descriptor(
874*6dbdd20aSAndroid Build Coastguard Worker          pool.FindEnumTypeByName('perfetto.protos.ChromeLatencyInfo.Step')),
875*6dbdd20aSAndroid Build Coastguard Worker  )
876*6dbdd20aSAndroid Build Coastguard Worker
877*6dbdd20aSAndroid Build Coastguard Worker  prototypes = Prototypes(
878*6dbdd20aSAndroid Build Coastguard Worker      TrackEvent=get_message_class(
879*6dbdd20aSAndroid Build Coastguard Worker          pool, pool.FindMessageTypeByName('perfetto.protos.TrackEvent')),
880*6dbdd20aSAndroid Build Coastguard Worker      ChromeRAILMode=EnumPrototype.from_descriptor(
881*6dbdd20aSAndroid Build Coastguard Worker          pool.FindEnumTypeByName('perfetto.protos.ChromeRAILMode')),
882*6dbdd20aSAndroid Build Coastguard Worker      ChromeLatencyInfo=chrome_latency_info_prototypes,
883*6dbdd20aSAndroid Build Coastguard Worker      ChromeProcessDescriptor=get_message_class(
884*6dbdd20aSAndroid Build Coastguard Worker          pool,
885*6dbdd20aSAndroid Build Coastguard Worker          pool.FindMessageTypeByName(
886*6dbdd20aSAndroid Build Coastguard Worker              'perfetto.protos.ChromeProcessDescriptor')),
887*6dbdd20aSAndroid Build Coastguard Worker      CounterDescriptor=get_message_class(
888*6dbdd20aSAndroid Build Coastguard Worker          pool,
889*6dbdd20aSAndroid Build Coastguard Worker          pool.FindMessageTypeByName('perfetto.protos.CounterDescriptor')),
890*6dbdd20aSAndroid Build Coastguard Worker      ThreadDescriptor=get_message_class(
891*6dbdd20aSAndroid Build Coastguard Worker          pool, pool.FindMessageTypeByName('perfetto.protos.ThreadDescriptor')),
892*6dbdd20aSAndroid Build Coastguard Worker  )
893*6dbdd20aSAndroid Build Coastguard Worker  return Trace(ProtoTrace(), prototypes)
894