From 4a7d3f0b9f3eb926c352e094be3bce1bc6d878b1 Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Thu, 31 Jul 2025 10:22:31 +0100 Subject: [PATCH 1/7] Add shbang to lgl_mali_timeline_viewer.py --- lgl_mali_timeline_viewer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lgl_mali_timeline_viewer.py b/lgl_mali_timeline_viewer.py index bbd98ce..1849b2f 100644 --- a/lgl_mali_timeline_viewer.py +++ b/lgl_mali_timeline_viewer.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # SPDX-License-Identifier: MIT # ----------------------------------------------------------------------------- # Copyright (c) 2024-2025 Arm Limited From f223bf63e3272047fa6e3939a231537859b3c0dc Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Thu, 31 Jul 2025 13:40:32 +0100 Subject: [PATCH 2/7] Timeline viewer: Split event dependency for QueueSubmit and QueuePresent --- lglpy/timeline/gui/timeline/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lglpy/timeline/gui/timeline/view.py b/lglpy/timeline/gui/timeline/view.py index 7c94465..077ac4e 100644 --- a/lglpy/timeline/gui/timeline/view.py +++ b/lglpy/timeline/gui/timeline/view.py @@ -438,7 +438,7 @@ def load(self, trace_data=None): workload = 'window' style = self.timeline_styles.get_style('Submit', 0, workload) draw = TLSpec.get_box( - 'Submit', stime, etime, style, '', '', submit) + 'Submit', stime, etime, style, '', '', present) channel.add_object(draw) # Add scheduling channels From bc87f39e78d3d292fb474548bcb73a4f17ecb5c5 Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Mon, 4 Aug 2025 17:40:04 +0100 Subject: [PATCH 3/7] Add Python venv to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index bf49e5c..2b88c0a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Python directories __pycache__ +pve # CMake build directories build* From 1cc495a5e00a8ef230f5aa4459f445e2a8c140c8 Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Mon, 4 Aug 2025 17:44:54 +0100 Subject: [PATCH 4/7] Standardize on .metadata as filename for GPU timeline --- .gitignore | 1 - lglpy/timeline/gui/window.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 2b88c0a..b5a1298 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ pve build* # Data files and build outputs -*.gputl *.log *.metadata *.perfetto diff --git a/lglpy/timeline/gui/window.py b/lglpy/timeline/gui/window.py index 6b3c9d2..da149d8 100644 --- a/lglpy/timeline/gui/window.py +++ b/lglpy/timeline/gui/window.py @@ -339,7 +339,7 @@ def load_file(self, trace_file, metadata_file=None): if not metadata_file: postfix = '.perfetto' if trace_file.endswith(postfix): - metadata_file = f'{trace_file[:-len(postfix)]}.gputl' + metadata_file = f'{trace_file[:-len(postfix)]}.metadata' if not os.path.exists(metadata_file): metadata_file = None From 8f100273981e2ff57396aaa15b8c168e12147115 Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Mon, 4 Aug 2025 17:45:25 +0100 Subject: [PATCH 5/7] Remove unused Perfetto data source --- lglpy/android/perfetto.cfg | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lglpy/android/perfetto.cfg b/lglpy/android/perfetto.cfg index a823207..31ffa16 100644 --- a/lglpy/android/perfetto.cfg +++ b/lglpy/android/perfetto.cfg @@ -16,12 +16,6 @@ data_sources: { producer_name_filter: "{{PACKAGE}}" } -data_sources: { - config { - name: "android.surfaceflinger.frametimeline" - } -} - duration_ms: 60000 write_into_file: true file_write_period_ms: 1000 From b8b964952207848ce9c51381a74e02240292ab8f Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Mon, 4 Aug 2025 17:57:47 +0100 Subject: [PATCH 6/7] Timeline layer: Add error log for multi-header connections --- lglpy/comms/service_gpu_timeline.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lglpy/comms/service_gpu_timeline.py b/lglpy/comms/service_gpu_timeline.py index 20ce567..fad9cd6 100644 --- a/lglpy/comms/service_gpu_timeline.py +++ b/lglpy/comms/service_gpu_timeline.py @@ -327,7 +327,10 @@ def handle_header(self, msg: Any) -> None: msg: The Python decode of a Timeline PB payload. ''' assert msg.version_no == timeline_pb2.HeaderVersionNo.version_1 - assert not self.seen_header + assert not self.seen_header, ( + "Handshaking header has already been seen. To start a new " + "timeline, you need to restart this script." + ) self.seen_header = True From 59eea2b0657ceb8becf2a9ee1e8400fd9336cfa5 Mon Sep 17 00:00:00 2001 From: Peter Harris Date: Mon, 4 Aug 2025 17:58:29 +0100 Subject: [PATCH 7/7] lglpy: Generate error message if adb not available --- lglpy/android/adb.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lglpy/android/adb.py b/lglpy/android/adb.py index a048394..3061237 100644 --- a/lglpy/android/adb.py +++ b/lglpy/android/adb.py @@ -29,6 +29,7 @@ from collections.abc import Iterable import os import shlex +import shutil import subprocess as sp from typing import Optional @@ -64,10 +65,17 @@ def __init__(self, device: Optional[str] = None, None for non-specific use. package: The package name, as returned by `adb shell pm list packages` or None for non-specific use. + + Raise: + FileNotFoundError will be raised if adb is not available on the + environment PATH. ''' self.device = device self.package = package + if not shutil.which('adb'): + raise FileNotFoundError('Android adb not found on the PATH') + def set_device(self, device: Optional[str]) -> None: ''' Set the device for this connection.