···326326 void (*mark_delivered)(struct u_pacing_app *upa, int64_t frame_id, uint64_t when_ns);
327327328328 /*!
329329+ * A frame has been completed rendered by the GPU, this can happen after `xrEndFrame` has returned.
330330+ *
331331+ * @param upa Render timing helper.
332332+ * @param[in] frame_id The frame ID to mark as delivered.
333333+ * @param[in] when_ns The time when it the gpu was finished, nominally from @ref os_monotonic_get_ns
334334+ */
335335+ void (*mark_gpu_done)(struct u_pacing_app *upa, int64_t frame_id, uint64_t when_ns);
336336+337337+ /*!
329338 * Add a new sample point from the main render loop.
330339 *
331340 * This is called in the main renderer loop that tightly submits frames to the
···414423u_pa_mark_delivered(struct u_pacing_app *upa, int64_t frame_id, uint64_t when_ns)
415424{
416425 upa->mark_delivered(upa, frame_id, when_ns);
426426+}
427427+428428+/*!
429429+ * @copydoc u_pacing_app::mark_gpu_done
430430+ *
431431+ * Helper for calling through the function pointer.
432432+ *
433433+ * @public @memberof u_pacing_app
434434+ * @ingroup aux_pacing
435435+ */
436436+static inline void
437437+u_pa_mark_gpu_done(struct u_pacing_app *upa, int64_t frame_id, uint64_t when_ns)
438438+{
439439+ upa->mark_gpu_done(upa, frame_id, when_ns);
417440}
418441419442/*!