diff --git a/.gitignore b/.gitignore index bf49e5c..b5a1298 100644 --- a/.gitignore +++ b/.gitignore @@ -4,12 +4,12 @@ # Python directories __pycache__ +pve # CMake build directories build* # Data files and build outputs -*.gputl *.log *.metadata *.perfetto 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 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. 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 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 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 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