Reading the EGL delivery trace (BLINKGTK_GX_LOG)

Start with BLINKGTK_GX_LOG=1 and BlinkGTK writes one line per event for the
EGL delivery path. Use it to see how far a frame got when nothing appears on
screen, or when presentation is slow.

BJGX <event> t=<ms since start> buf=<wl_buffer wire id> submit=<serial> …

Events and fields

Event Fields on the line
bind t= iface= name=
clock t= clk_id=
commit t= buf= submit= op= w= h= stride= fmt= mod=
t= buf= submit= op= w= h= src=
discard t= buf= submit=
present t= buf= submit= tv= refresh= msc= flags= flagnames= clk=
probe t= buf= submit= result= w= h= stride=
release t= buf= submit=
skip t= buf= submit= reason=

What each event means

Event When it appears
commit A buffer was attached to the surface and committed
present The compositor reported that it was displayed
discard The compositor reported that it was not displayed
release The compositor returned the buffer (safe to reuse)
skip Nothing was sent. reason= says why
probe Content inspection result. result= carries the verdict
bind A Wayland interface was bound
clock Clock id used for presentation timestamps

present and discard are mutually exclusive — exactly one of them arrives
for a given content update.

Things that trip parsers

Deciding whether content reached the screen

Look for present lines.

content_present (probe#N=YES/BLANK) judges by reading buffer contents from
the CPU side. On some systems that read is not possible at all (virtualised
GPUs, for example). There it stays UNKNOWN, so using it as the criterion reads
as "nothing was displayed" when in fact everything was.

present comes from the compositor, so it holds on those systems too.

This table is generated from the implementation

The table above is produced by release/scripts/gen-gx-log-format.sh from the
format strings in the source. A hand-copied table drifts from the code, so it is
a generated artifact.