xref: /aosp_15_r20/external/perfetto/ui/src/plugins/dev.perfetto.AndroidDmabuf/index.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport {
16*6dbdd20aSAndroid Build Coastguard Worker  createQueryCounterTrack,
17*6dbdd20aSAndroid Build Coastguard Worker  SqlDataSource,
18*6dbdd20aSAndroid Build Coastguard Worker} from '../../components/tracks/query_counter_track';
19*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin';
20*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace';
21*6dbdd20aSAndroid Build Coastguard Workerimport {TrackNode} from '../../public/workspace';
22*6dbdd20aSAndroid Build Coastguard Workerimport {NUM_NULL} from '../../trace_processor/query_result';
23*6dbdd20aSAndroid Build Coastguard Workerimport ProcessThreadGroupsPlugin from '../dev.perfetto.ProcessThreadGroups';
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Workerasync function registerAllocsTrack(
26*6dbdd20aSAndroid Build Coastguard Worker  ctx: Trace,
27*6dbdd20aSAndroid Build Coastguard Worker  uri: string,
28*6dbdd20aSAndroid Build Coastguard Worker  dataSource: SqlDataSource,
29*6dbdd20aSAndroid Build Coastguard Worker) {
30*6dbdd20aSAndroid Build Coastguard Worker  const track = await createQueryCounterTrack({
31*6dbdd20aSAndroid Build Coastguard Worker    trace: ctx,
32*6dbdd20aSAndroid Build Coastguard Worker    uri,
33*6dbdd20aSAndroid Build Coastguard Worker    data: dataSource,
34*6dbdd20aSAndroid Build Coastguard Worker  });
35*6dbdd20aSAndroid Build Coastguard Worker  ctx.tracks.registerTrack({
36*6dbdd20aSAndroid Build Coastguard Worker    uri,
37*6dbdd20aSAndroid Build Coastguard Worker    title: `dmabuf allocs`,
38*6dbdd20aSAndroid Build Coastguard Worker    track: track,
39*6dbdd20aSAndroid Build Coastguard Worker  });
40*6dbdd20aSAndroid Build Coastguard Worker}
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin {
43*6dbdd20aSAndroid Build Coastguard Worker  static readonly id = 'dev.perfetto.AndroidDmabuf';
44*6dbdd20aSAndroid Build Coastguard Worker  static readonly dependencies = [ProcessThreadGroupsPlugin];
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard Worker  async onTraceLoad(ctx: Trace): Promise<void> {
47*6dbdd20aSAndroid Build Coastguard Worker    const e = ctx.engine;
48*6dbdd20aSAndroid Build Coastguard Worker    await e.query(`INCLUDE PERFETTO MODULE android.memory.dmabuf`);
49*6dbdd20aSAndroid Build Coastguard Worker    await e.query(`
50*6dbdd20aSAndroid Build Coastguard Worker      CREATE PERFETTO TABLE _android_memory_cumulative_dmabuf AS
51*6dbdd20aSAndroid Build Coastguard Worker      SELECT
52*6dbdd20aSAndroid Build Coastguard Worker        upid, utid, ts,
53*6dbdd20aSAndroid Build Coastguard Worker        SUM(buf_size) OVER(PARTITION BY COALESCE(upid, utid) ORDER BY ts) AS value
54*6dbdd20aSAndroid Build Coastguard Worker      FROM android_dmabuf_allocs;`);
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker    const pids = await e.query(
57*6dbdd20aSAndroid Build Coastguard Worker      `SELECT DISTINCT upid, IIF(upid IS NULL, utid, NULL) AS utid FROM _android_memory_cumulative_dmabuf`,
58*6dbdd20aSAndroid Build Coastguard Worker    );
59*6dbdd20aSAndroid Build Coastguard Worker    const it = pids.iter({upid: NUM_NULL, utid: NUM_NULL});
60*6dbdd20aSAndroid Build Coastguard Worker    for (; it.valid(); it.next()) {
61*6dbdd20aSAndroid Build Coastguard Worker      if (it.upid != null) {
62*6dbdd20aSAndroid Build Coastguard Worker        const uri = `/android_process_dmabuf_upid_${it.upid}`;
63*6dbdd20aSAndroid Build Coastguard Worker        const config: SqlDataSource = {
64*6dbdd20aSAndroid Build Coastguard Worker          sqlSource: `SELECT ts, value FROM _android_memory_cumulative_dmabuf
65*6dbdd20aSAndroid Build Coastguard Worker                 WHERE upid = ${it.upid}`,
66*6dbdd20aSAndroid Build Coastguard Worker        };
67*6dbdd20aSAndroid Build Coastguard Worker        await registerAllocsTrack(ctx, uri, config);
68*6dbdd20aSAndroid Build Coastguard Worker        ctx.plugins
69*6dbdd20aSAndroid Build Coastguard Worker          .getPlugin(ProcessThreadGroupsPlugin)
70*6dbdd20aSAndroid Build Coastguard Worker          .getGroupForProcess(it.upid)
71*6dbdd20aSAndroid Build Coastguard Worker          ?.addChildInOrder(new TrackNode({uri, title: 'dmabuf allocs'}));
72*6dbdd20aSAndroid Build Coastguard Worker      } else if (it.utid != null) {
73*6dbdd20aSAndroid Build Coastguard Worker        const uri = `/android_process_dmabuf_utid_${it.utid}`;
74*6dbdd20aSAndroid Build Coastguard Worker        const config: SqlDataSource = {
75*6dbdd20aSAndroid Build Coastguard Worker          sqlSource: `SELECT ts, value FROM _android_memory_cumulative_dmabuf
76*6dbdd20aSAndroid Build Coastguard Worker                 WHERE utid = ${it.utid}`,
77*6dbdd20aSAndroid Build Coastguard Worker        };
78*6dbdd20aSAndroid Build Coastguard Worker        await registerAllocsTrack(ctx, uri, config);
79*6dbdd20aSAndroid Build Coastguard Worker        ctx.plugins
80*6dbdd20aSAndroid Build Coastguard Worker          .getPlugin(ProcessThreadGroupsPlugin)
81*6dbdd20aSAndroid Build Coastguard Worker          .getGroupForThread(it.utid)
82*6dbdd20aSAndroid Build Coastguard Worker          ?.addChildInOrder(new TrackNode({uri, title: 'dmabuf allocs'}));
83*6dbdd20aSAndroid Build Coastguard Worker      }
84*6dbdd20aSAndroid Build Coastguard Worker    }
85*6dbdd20aSAndroid Build Coastguard Worker  }
86*6dbdd20aSAndroid Build Coastguard Worker}
87