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