1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 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 {NUM_NULL, STR_NULL} from '../../trace_processor/query_result'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from '../../public/trace'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {Slice} from '../../public/track'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoPlugin} from '../../public/plugin'; 19*6dbdd20aSAndroid Build Coastguard Workerimport { 20*6dbdd20aSAndroid Build Coastguard Worker NAMED_ROW, 21*6dbdd20aSAndroid Build Coastguard Worker NamedRow, 22*6dbdd20aSAndroid Build Coastguard Worker NamedSliceTrack, 23*6dbdd20aSAndroid Build Coastguard Worker} from '../../components/tracks/named_slice_track'; 24*6dbdd20aSAndroid Build Coastguard Workerimport {TrackNode} from '../../public/workspace'; 25*6dbdd20aSAndroid Build Coastguard Workerclass GpuPidTrack extends NamedSliceTrack { 26*6dbdd20aSAndroid Build Coastguard Worker constructor( 27*6dbdd20aSAndroid Build Coastguard Worker trace: Trace, 28*6dbdd20aSAndroid Build Coastguard Worker uri: string, 29*6dbdd20aSAndroid Build Coastguard Worker protected readonly upid: number, 30*6dbdd20aSAndroid Build Coastguard Worker ) { 31*6dbdd20aSAndroid Build Coastguard Worker super(trace, uri); 32*6dbdd20aSAndroid Build Coastguard Worker this.upid = upid; 33*6dbdd20aSAndroid Build Coastguard Worker } 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker protected getRowSpec(): NamedRow { 36*6dbdd20aSAndroid Build Coastguard Worker return NAMED_ROW; 37*6dbdd20aSAndroid Build Coastguard Worker } 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker protected rowToSlice(row: NamedRow): Slice { 40*6dbdd20aSAndroid Build Coastguard Worker return this.rowToSliceBase(row); 41*6dbdd20aSAndroid Build Coastguard Worker } 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker getSqlSource(): string { 44*6dbdd20aSAndroid Build Coastguard Worker return ` 45*6dbdd20aSAndroid Build Coastguard Worker SELECT * 46*6dbdd20aSAndroid Build Coastguard Worker FROM gpu_slice 47*6dbdd20aSAndroid Build Coastguard Worker WHERE upid = ${this.upid} 48*6dbdd20aSAndroid Build Coastguard Worker `; 49*6dbdd20aSAndroid Build Coastguard Worker } 50*6dbdd20aSAndroid Build Coastguard Worker} 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Workerexport default class implements PerfettoPlugin { 53*6dbdd20aSAndroid Build Coastguard Worker static readonly id = 'dev.perfetto.GpuByProcess'; 54*6dbdd20aSAndroid Build Coastguard Worker async onTraceLoad(ctx: Trace): Promise<void> { 55*6dbdd20aSAndroid Build Coastguard Worker // Find all unique upid values in gpu_slices and join with process table. 56*6dbdd20aSAndroid Build Coastguard Worker const results = await ctx.engine.query(` 57*6dbdd20aSAndroid Build Coastguard Worker WITH slice_upids AS ( 58*6dbdd20aSAndroid Build Coastguard Worker SELECT DISTINCT upid FROM gpu_slice 59*6dbdd20aSAndroid Build Coastguard Worker ) 60*6dbdd20aSAndroid Build Coastguard Worker SELECT upid, pid, name FROM slice_upids JOIN process USING (upid) 61*6dbdd20aSAndroid Build Coastguard Worker `); 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker const it = results.iter({ 64*6dbdd20aSAndroid Build Coastguard Worker upid: NUM_NULL, 65*6dbdd20aSAndroid Build Coastguard Worker pid: NUM_NULL, 66*6dbdd20aSAndroid Build Coastguard Worker name: STR_NULL, 67*6dbdd20aSAndroid Build Coastguard Worker }); 68*6dbdd20aSAndroid Build Coastguard Worker 69*6dbdd20aSAndroid Build Coastguard Worker // For each upid, create a GpuPidTrack. 70*6dbdd20aSAndroid Build Coastguard Worker for (; it.valid(); it.next()) { 71*6dbdd20aSAndroid Build Coastguard Worker if (it.upid == null) { 72*6dbdd20aSAndroid Build Coastguard Worker continue; 73*6dbdd20aSAndroid Build Coastguard Worker } 74*6dbdd20aSAndroid Build Coastguard Worker 75*6dbdd20aSAndroid Build Coastguard Worker const upid = it.upid; 76*6dbdd20aSAndroid Build Coastguard Worker let processName = 'Unknown'; 77*6dbdd20aSAndroid Build Coastguard Worker if (it.name != null) { 78*6dbdd20aSAndroid Build Coastguard Worker processName = it.name; 79*6dbdd20aSAndroid Build Coastguard Worker } else if (it.pid != null) { 80*6dbdd20aSAndroid Build Coastguard Worker processName = `${it.pid}`; 81*6dbdd20aSAndroid Build Coastguard Worker } 82*6dbdd20aSAndroid Build Coastguard Worker 83*6dbdd20aSAndroid Build Coastguard Worker const uri = `dev.perfetto.GpuByProcess#${upid}`; 84*6dbdd20aSAndroid Build Coastguard Worker const title = `GPU ${processName}`; 85*6dbdd20aSAndroid Build Coastguard Worker ctx.tracks.registerTrack({ 86*6dbdd20aSAndroid Build Coastguard Worker uri, 87*6dbdd20aSAndroid Build Coastguard Worker title, 88*6dbdd20aSAndroid Build Coastguard Worker track: new GpuPidTrack(ctx, uri, upid), 89*6dbdd20aSAndroid Build Coastguard Worker }); 90*6dbdd20aSAndroid Build Coastguard Worker const track = new TrackNode({uri, title}); 91*6dbdd20aSAndroid Build Coastguard Worker ctx.workspace.addChildInOrder(track); 92*6dbdd20aSAndroid Build Coastguard Worker } 93*6dbdd20aSAndroid Build Coastguard Worker } 94*6dbdd20aSAndroid Build Coastguard Worker} 95