vl/dri3: handle PresentCompleteNotify event
authorLeo Liu <leo.liu@amd.com>
Mon, 9 May 2016 19:53:48 +0000 (15:53 -0400)
committerLeo Liu <leo.liu@amd.com>
Mon, 16 May 2016 20:28:51 +0000 (16:28 -0400)
and get timestamp calculated based on the event's reply

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/auxiliary/vl/vl_winsys_dri3.c

index f892d398d4490178acad2fc4ed14db0352da156d..7a3a6ba313a830c1a15ef68e16b3e383797a3c2e 100644 (file)
@@ -75,6 +75,10 @@ struct vl_dri3_screen
 
    struct vl_dri3_buffer *front_buffer;
    bool is_pixmap;
+
+   uint32_t send_msc_serial, recv_msc_serial;
+   uint64_t send_sbc, recv_sbc;
+   int64_t last_ust, ns_frame, last_msc, next_msc;
 };
 
 static void
@@ -97,6 +101,19 @@ dri3_free_back_buffer(struct vl_dri3_screen *scrn,
    FREE(buffer);
 }
 
+static void
+dri3_handle_stamps(struct vl_dri3_screen *scrn, uint64_t ust, uint64_t msc)
+{
+   int64_t ust_ns =  ust * 1000;
+
+   if (scrn->last_ust && (ust_ns > scrn->last_ust) &&
+       scrn->last_msc && (msc > scrn->last_msc))
+      scrn->ns_frame = (ust_ns - scrn->last_ust) / (msc - scrn->last_msc);
+
+   scrn->last_ust = ust_ns;
+   scrn->last_msc = msc;
+}
+
 static void
 dri3_handle_present_event(struct vl_dri3_screen *scrn,
                           xcb_present_generic_event_t *ge)
@@ -109,7 +126,16 @@ dri3_handle_present_event(struct vl_dri3_screen *scrn,
       break;
    }
    case XCB_PRESENT_COMPLETE_NOTIFY: {
-      /* TODO */
+      xcb_present_complete_notify_event_t *ce = (void *) ge;
+      if (ce->kind == XCB_PRESENT_COMPLETE_KIND_PIXMAP) {
+         scrn->recv_sbc = (scrn->send_sbc & 0xffffffff00000000LL) | ce->serial;
+         if (scrn->recv_sbc > scrn->send_sbc)
+            scrn->recv_sbc -= 0x100000000;
+         dri3_handle_stamps(scrn, ce->ust, ce->msc);
+      } else if (ce->kind == XCB_PRESENT_COMPLETE_KIND_NOTIFY_MSC) {
+         scrn->recv_msc_serial = ce->serial;
+         dri3_handle_stamps(scrn, ce->ust, ce->msc);
+      }
       break;
    }
    case XCB_PRESENT_EVENT_IDLE_NOTIFY: {