ovrgpuprofiler
. If not using a shell, precede all commands in this topic with adb shell <command>
.ovrgpuprofiler -m
47 metrics supported:
1 Clocks / Second
2 GPU % Bus Busy
3 % Vertex Fetch Stall
4 % Texture Fetch Stall
5 L1 Texture Cache Miss Per Pixel
6 % Texture L1 Miss
7 % Texture L2 Miss
8 % Stalled on System Memory
9 Pre-clipped Polygons/Second
10 % Prims Trivially Rejected
11 % Prims Clipped
ovrgpuprofiler -m -v
can be used to provide the same list with more verbose descriptions for each metric.`ovrgpuprofiler -r<metric ID number>`
ovrgpuprofiler -r4
and data will be printed in the console every second until Ctrl-C is pressed.ovrgpuprofiler -r"4,5,6"
. The following shows output from ovrgpuprofiler -r"4,5,6"
:$ ovrgpuprofiler -r"4,5,6"
% Texture Fetch Stall : 2.449
L1 Texture Cache Miss Per Pixel : 0.124
% Texture L1 Miss : 20.338
% Texture Fetch Stall : 2.369
L1 Texture Cache Miss Per Pixel : 0.122
% Texture L1 Miss : 20.130
% Texture Fetch Stall : 2.580
L1 Texture Cache Miss Per Pixel : 0.127
% Texture L1 Miss
ovrgpuprofiler
supports render stage GPU tracing on a tile-per-tile level. Unlike direct-mode GPUs, which execute draw calls sequentially, tile-based renderers batch draw calls for an entire surface, then that surface is split into tiles that are computed sequentially, where each tile executes all the draw calls that touched that tile. ovrgpuprofiler
can tell you how much time was spent in each rendering stage for each surface rendered during a trace’s duration.ovrgpuprofiler -e
ovrgpuprofiler -i
shows if detailed GPU profiling mode is enabled, and ovrgpuprofiler -d
disables it.ovrgpuprofiler
must have the <uses-permission android:name="android.permission.INTERNET" />
permission in their manifest.ovrgpuprofiler -t
-t
argument. For example, ovrgpuprofiler -t1.2
would run a trace for 1.2 seconds. Surface 1 | 1216x1344 | color 32bit, depth 24bit, stencil 0 bit, MSAA 4 | 60 128x224 bins | 5.08 ms | 130 stages : Binning : 0.623ms Render : 1.877ms StoreColor : 0.309ms Blit : 0.002ms Preempt : 1.286ms
ovrgpuprofiler
will output one surface line per slice for multiview apps. This means that there will be one surface for each eye. You must add the render times of two eye surfaces for the total frame time.ovrgpuprofiler
will output one surface line for both views of the surface, due to how the Adreno650 GPU processes multiview commands (Hardware Multiview). On Quest 2, bins of multiview surfaces are shared between both views, so really135 96x176 bins
135 96x176x2 bins
ovrgpuprofiler
:Argument | Description |
-r/--realtime | Prints the value of the real-time metrics every second. Accepts an optional comma-separated list of metrics IDs to track. |
-m/--metrics | Prints the list of available real-time metrics IDs, their name, and their description. |
-v/--verbose | Adds more detailed information to most other commands. |
-e/--enable-detailed | Enables detailed profiling mode on the GPU driver; required for render stage tracing. Only applies to applications started after this mode is started. |
-i/--is-detailed | Queries if the GPU driver is in detailed profiling mode. |
-t/--trace | Executes a render stage trace, with an optional trace length as argument in seconds. |
-c/--continuous | If you specify this along with -t/--trace, the results of the render stage trace are polled periodically to reduce memory pressure. |
-l/--low-overhead | If you specify this along with -t/--trace, the render stage trace is performed in low-overhead mode, which omits many details in exchange for a more accurate measurement. |