vl/dri3: implement flushing for queued events
authorLeo Liu <leo.liu@amd.com>
Mon, 25 Apr 2016 17:46:36 +0000 (13:46 -0400)
committerLeo Liu <leo.liu@amd.com>
Mon, 16 May 2016 20:28:51 +0000 (16:28 -0400)
also place holder for present events handling

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 305bbc6..06c2ec9 100644 (file)
@@ -50,6 +50,38 @@ struct vl_dri3_screen
    xcb_special_event_t *special_event;
 };
 
+static void
+dri3_handle_present_event(struct vl_dri3_screen *scrn,
+                          xcb_present_generic_event_t *ge)
+{
+   switch (ge->evtype) {
+   case XCB_PRESENT_CONFIGURE_NOTIFY: {
+      /* TODO */
+      break;
+   }
+   case XCB_PRESENT_COMPLETE_NOTIFY: {
+      /* TODO */
+      break;
+   }
+   case XCB_PRESENT_EVENT_IDLE_NOTIFY: {
+      /* TODO */
+      break;
+   }
+   }
+   free(ge);
+}
+
+static void
+dri3_flush_present_events(struct vl_dri3_screen *scrn)
+{
+   if (scrn->special_event) {
+      xcb_generic_event_t *ev;
+      while ((ev = xcb_poll_for_special_event(
+                   scrn->conn, scrn->special_event)) != NULL)
+         dri3_handle_present_event(scrn, (xcb_present_generic_event_t *)ev);
+   }
+}
+
 static bool
 dri3_set_drawable(struct vl_dri3_screen *scrn, Drawable drawable)
 {
@@ -96,6 +128,8 @@ dri3_set_drawable(struct vl_dri3_screen *scrn, Drawable drawable)
       scrn->special_event =
          xcb_register_for_special_xge(scrn->conn, &xcb_present_id, peid, 0);
 
+   dri3_flush_present_events(scrn);
+
    return true;
 }
 
@@ -157,6 +191,8 @@ vl_dri3_screen_destroy(struct vl_screen *vscreen)
 
    assert(vscreen);
 
+   dri3_flush_present_events(scrn);
+
    if (scrn->special_event)
       xcb_unregister_for_special_event(scrn->conn, scrn->special_event);
    scrn->base.pscreen->destroy(scrn->base.pscreen);