static uint64_t vl_dri2_screen_get_timestamp(struct vl_screen *vscreen, void *drawable) { struct vl_dri_screen *scrn = (struct vl_dri_screen *)vscreen; xcb_dri2_get_msc_cookie_t cookie; xcb_dri2_get_msc_reply_t *reply; assert(scrn); vl_dri2_set_drawable(scrn, (Drawable)drawable); if (!scrn->last_ust) { cookie = xcb_dri2_get_msc_unchecked(scrn->conn, (Drawable)drawable); reply = xcb_dri2_get_msc_reply(scrn->conn, cookie, NULL); if (reply) { vl_dri2_handle_stamps(scrn, reply->ust_hi, reply->ust_lo, reply->msc_hi, reply->msc_lo); free(reply); } } return scrn->last_ust; }
static xcb_dri2_get_buffers_reply_t * vl_dri2_get_flush_reply(struct vl_dri_screen *scrn) { xcb_dri2_wait_sbc_reply_t *wait_sbc_reply; assert(scrn); if (!scrn->flushed) return NULL; scrn->flushed = false; free(xcb_dri2_swap_buffers_reply(scrn->conn, scrn->swap_cookie, NULL)); wait_sbc_reply = xcb_dri2_wait_sbc_reply(scrn->conn, scrn->wait_cookie, NULL); if (!wait_sbc_reply) return NULL; vl_dri2_handle_stamps(scrn, wait_sbc_reply->ust_hi, wait_sbc_reply->ust_lo, wait_sbc_reply->msc_hi, wait_sbc_reply->msc_lo); free(wait_sbc_reply); return xcb_dri2_get_buffers_reply(scrn->conn, scrn->buffers_cookie, NULL); }