mirror of
https://gitlab.steamos.cloud/frame-public/frame-developer-tools.git
synced 2026-10-23 07:02:07 +02:00
207 lines
7.2 KiB
Bash
Executable File
207 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
|
|
|
# Check that `gpuvis` is installed
|
|
if [[ -z "$(which gpuvis)" ]]; then
|
|
echo "WARN: gpuvis not found, attempting to install:" >&2
|
|
sudo makerootfsrw
|
|
sudo pacman -Sy gpuvis
|
|
fi
|
|
|
|
## Maximum trace duration to capture
|
|
# If 0, capture continously into circular buffer until key is pressed
|
|
# If >0, capture for specified number of seconds, or less if a key is pressed.
|
|
# Actual length may be limited by circular buffer size.
|
|
MAX_DURATION="${1:-25}"
|
|
|
|
# Circular capture buffer size in kB / cpu
|
|
BUFF_SIZE="${2:-100000}"
|
|
|
|
if [ "${MAX_DURATION}" -gt 0 ]; then
|
|
echo "Capturing for ${MAX_DURATION} seconds into circular buffers of ${BUFF_SIZE} kB / cpu"
|
|
else
|
|
echo "Capturing into circular buffers of ${BUFF_SIZE} kB / cpu until stopped"
|
|
fi
|
|
|
|
TRACE_EVENTS=()
|
|
|
|
# https://github.com/mikesart/gpuvis/wiki/TechDocs-Linux-Scheduler
|
|
TRACE_EVENTS+=( "sched:sched_switch" )
|
|
TRACE_EVENTS+=( "sched:sched_process_fork" )
|
|
TRACE_EVENTS+=( "sched:sched_process_exec" )
|
|
TRACE_EVENTS+=( "sched:sched_process_exit" )
|
|
|
|
TRACE_EVENTS+=( "drm:drm_vblank_event" )
|
|
TRACE_EVENTS+=( "drm:drm_vblank_event_queued" )
|
|
TRACE_EVENTS+=( "drm:drm_vblank_event_delivered" )
|
|
|
|
TRACE_EVENTS+=( "power:cpu_frequency" )
|
|
|
|
# https://github.com/mikesart/gpuvis/wiki/TechDocs-AMDGpu
|
|
TRACE_EVENTS+=( "amdgpu:amdgpu_vm_flush" )
|
|
TRACE_EVENTS+=( "amdgpu:amdgpu_cs_ioctl" )
|
|
TRACE_EVENTS+=( "amdgpu:amdgpu_sched_run_job" )
|
|
TRACE_EVENTS+=( "amdgpu:amdgpu_ttm_bo_move" )
|
|
TRACE_EVENTS+=( "*fence:*fence_signaled" )
|
|
|
|
|
|
#adreno specific
|
|
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_queued" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_submitted" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_retired" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_sync" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_fault" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_cmdbatch_recovery" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_drawctxt_wait_start" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_drawctxt_wait_done" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_drawctxt_switch" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_gpu_fault" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_sp_tp" )
|
|
TRACE_EVENTS+=( "kgsl:kgsl_a3xx_irq_status" )
|
|
TRACE_EVENTS+=( "kgsl:kgsl_a4xx_irq_status" )
|
|
TRACE_EVENTS+=( "kgsl:kgsl_a5xx_irq_status" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_hw_preempt_comp_to_clear" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_hw_preempt_token_submit" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_preempt_trigger" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_preempt_done" )
|
|
TRACE_EVENTS+=( "kgsl:adreno_ifpc_count" )
|
|
|
|
TRACE_EVENTS+=( "sde:sde_perf_set_qos_luts" )
|
|
TRACE_EVENTS+=( "sde:sde_perf_set_danger_luts" )
|
|
TRACE_EVENTS+=( "sde:sde_perf_set_ot" )
|
|
TRACE_EVENTS+=( "sde:sde_perf_update_bus" )
|
|
TRACE_EVENTS+=( "sde:sde_cmd_release_bw" )
|
|
TRACE_EVENTS+=( "sde:sde_encoder_underrun" )
|
|
TRACE_EVENTS+=( "sde:tracing_mark_write" )
|
|
TRACE_EVENTS+=( "sde:sde_evtlog" )
|
|
TRACE_EVENTS+=( "sde:sde_perf_crtc_update" )
|
|
TRACE_EVENTS+=( "sde:sde_perf_calc_crtc" )
|
|
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_flush_commit" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_wait_flush_finish" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_wait_flush_start" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_async_commit_finish" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_async_commit_start" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_commit_tail_finish" )
|
|
TRACE_EVENTS+=( "drm_msm_atomic:msm_atomic_commit_tail_start" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_submit_retired" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_submit_flush" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_submit" )
|
|
#TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_resume" )
|
|
#TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_suspend" )
|
|
#TRACE_EVENTS+=( "drm_msm_gpu:msm_gem_purge_vmaps" )
|
|
#TRACE_EVENTS+=( "drm_msm_gpu:msm_gem_purge" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gmu_freq_change" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_freq_change" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_reset" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_update_debug" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_preempt_debug" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_update_rptr" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_submit_retired" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu2:msm_gpu2_submit_flush" )
|
|
|
|
TRACE_EVENTS+=( "v4l2:vb2_v4l2_qbuf" )
|
|
TRACE_EVENTS+=( "v4l2:vb2_v4l2_dqbuf" )
|
|
TRACE_EVENTS+=( "v4l2:vb2_v4l2_buf_queue" )
|
|
TRACE_EVENTS+=( "v4l2:vb2_v4l2_buf_done" )
|
|
TRACE_EVENTS+=( "v4l2:v4l2_qbuf" )
|
|
TRACE_EVENTS+=( "v4l2:v4l2_dqbuf" )
|
|
|
|
TRACE_EVENTS+=( "qcom_iris:iris_vdec_streamon_input" )
|
|
TRACE_EVENTS+=( "qcom_iris:iris_hfi_response_dequeue" )
|
|
TRACE_EVENTS+=( "qcom_iris:iris_hfi_response_output" )
|
|
TRACE_EVENTS+=( "qcom_iris:iris_hfi_response_input" )
|
|
TRACE_EVENTS+=( "qcom_iris:iris_hfi_queue_buffer" )
|
|
|
|
|
|
#TRACE_EVENTS+=( "batt_iadc:batt_iadc_power_now" )
|
|
#TRACE_EVENTS+=( "batt_iadc:batt_iadc_voltage_now" )
|
|
#TRACE_EVENTS+=( "batt_iadc:batt_iadc_current_now" )
|
|
TRACE_EVENTS+=( "batt_iadc:batt_iadc_power_avg_now" )
|
|
TRACE_EVENTS+=( "batt_iadc:batt_iadc_current_voltage_power_now" )
|
|
|
|
TRACE_EVENTS+=( "dpu2:dpu2_underflow" )
|
|
|
|
TRACE_EVENTS+=( "qcom_qspi:qspi_prepare_message" )
|
|
TRACE_EVENTS+=( "qcom_qspi:qcom_qspi_irq_start" )
|
|
TRACE_EVENTS+=( "qcom_qspi:qcom_qspi_irq_pre_complete" )
|
|
TRACE_EVENTS+=( "qcom_qspi:qcom_qspi_dma_sync_single_for_device" )
|
|
TRACE_EVENTS+=( "qcom_qspi:qcom_qspi_completion_timeout_done" )
|
|
|
|
TRACE_EVENTS+=( "qcom_qdsp6:qcom_qdsp6_irq" )
|
|
|
|
TRACE_EVENTS+=( "qcom_camss:vfe_isr" )
|
|
TRACE_EVENTS+=( "qcom_camss:csid_isr" )
|
|
TRACE_EVENTS+=( "qcom_camss:csid_isr_wm_done" )
|
|
TRACE_EVENTS+=( "qcom_camss:csid_isr_sof" )
|
|
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_preemption_trigger" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_preemption_irq" )
|
|
TRACE_EVENTS+=( "drm_msm_gpu:msm_gpu_devfreq_status" )
|
|
|
|
TRACE_EVENTS+=( "gpuvis:gpuvis_print" )
|
|
TRACE_EVENTS+=( "gpuvis:gpuvis_print_begin_dtime" )
|
|
|
|
TRACE_EVENTS+=( "dpu:dpu_crtc_complete_commit" )
|
|
TRACE_EVENTS+=( "dpu:dpu_crtc_vblank" )
|
|
|
|
# Prepend `-e` to the beginning of all trace events
|
|
TRACE_CMD_ARGS=(
|
|
# Set buffer size
|
|
-b "${BUFF_SIZE}"
|
|
|
|
# Try to disable the function tracer
|
|
-D
|
|
|
|
# Ignore requested events that don't exist
|
|
-i
|
|
|
|
# List of events to trace
|
|
$(printf " -e %s" "${TRACE_EVENTS[@]}")
|
|
)
|
|
|
|
# Ensure tracing clock is set correctly
|
|
echo "Setting ftrace tracing clock to monotonic..."
|
|
echo mono_raw | sudo tee /sys/kernel/tracing/trace_clock >/dev/null
|
|
cat /sys/kernel/tracing/trace_clock
|
|
|
|
# Start trace
|
|
sudo trace-cmd reset
|
|
sudo trace-cmd start "${TRACE_CMD_ARGS[@]}"
|
|
|
|
# Run to end of trace
|
|
if [ ${MAX_DURATION} -gt 0 ]; then
|
|
echo "Capturing for ${MAX_DURATION} seconds... Press any key to end trace early"
|
|
read -sN1 -t "${MAX_DURATION}" </dev/stdin || true
|
|
else
|
|
echo "Press any key to end trace"
|
|
read -sN1 </dev/stdin || true
|
|
fi
|
|
|
|
TRACE_PATH="/tmp/gpuvis-$(date '+%s').trace"
|
|
TRACE_PATH_NEW_FORMAT="${TRACE_PATH}.tmp"
|
|
|
|
# Extract trace (but with wrong format)
|
|
echo "Extracting trace..."
|
|
sudo trace-cmd extract -k -o "${TRACE_PATH_NEW_FORMAT}"
|
|
|
|
# Convert it to the correct format
|
|
echo "Converting to correct format (version 6)..."
|
|
sudo trace-cmd convert --file-version 6 -i "${TRACE_PATH_NEW_FORMAT}" -o "${TRACE_PATH}"
|
|
|
|
# Clear trace buffer
|
|
sudo trace-cmd reset
|
|
sudo trace-cmd snapshot -f
|
|
|
|
# Reset ownership of trace file
|
|
sudo chown $(id -u):$(id -g) "${TRACE_PATH}"
|
|
|
|
echo "gpuvis trace file is located here: '${TRACE_PATH}'"
|
|
du -hs "${TRACE_PATH}"
|
|
|
|
# Launch gpuvis on it
|
|
gpuvis "${TRACE_PATH}"
|