+static void
+vl_dri2_handle_stamps(struct vl_dri_screen* scrn,
+ uint32_t ust_hi, uint32_t ust_lo,
+ uint32_t msc_hi, uint32_t msc_lo)
+{
+ int64_t ust = ((((uint64_t)ust_hi) << 32) | ust_lo) * 1000;
+ int64_t msc = (((uint64_t)msc_hi) << 32) | msc_lo;
+
+ if (scrn->last_ust && scrn->last_msc && (ust > scrn->last_ust) && (msc > scrn->last_msc))
+ scrn->ns_frame = (ust - scrn->last_ust) / (msc - scrn->last_msc);
+
+ if (scrn->next_msc && (scrn->next_msc < msc))
+ scrn->skew_msc++;
+
+ scrn->last_ust = ust;
+ scrn->last_msc = msc;
+}
+
+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);
+}
+