vl/dri3: register present events
authorLeo Liu <leo.liu@amd.com>
Tue, 10 May 2016 18:56:51 +0000 (14:56 -0400)
committerLeo Liu <leo.liu@amd.com>
Mon, 16 May 2016 20:28:51 +0000 (16:28 -0400)
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 980b3b6099624f216e77f6ddeb00e81fc69ebaef..305bbc68e1adf4efd48de18291a590985c58c507 100644 (file)
@@ -46,6 +46,8 @@ struct vl_dri3_screen
    xcb_drawable_t drawable;
 
    uint32_t width, height, depth;
+
+   xcb_special_event_t *special_event;
 };
 
 static bool
@@ -53,6 +55,9 @@ dri3_set_drawable(struct vl_dri3_screen *scrn, Drawable drawable)
 {
    xcb_get_geometry_cookie_t geom_cookie;
    xcb_get_geometry_reply_t *geom_reply;
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *error;
+   xcb_present_event_t peid;
 
    assert(drawable);
 
@@ -71,6 +76,26 @@ dri3_set_drawable(struct vl_dri3_screen *scrn, Drawable drawable)
    scrn->depth = geom_reply->depth;
    free(geom_reply);
 
+   if (scrn->special_event) {
+      xcb_unregister_for_special_event(scrn->conn, scrn->special_event);
+      scrn->special_event = NULL;
+   }
+
+   peid = xcb_generate_id(scrn->conn);
+   cookie =
+      xcb_present_select_input_checked(scrn->conn, peid, scrn->drawable,
+                      XCB_PRESENT_EVENT_MASK_CONFIGURE_NOTIFY |
+                      XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY |
+                      XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY);
+
+   error = xcb_request_check(scrn->conn, cookie);
+   if (error) {
+      free(error);
+      return false;
+   } else
+      scrn->special_event =
+         xcb_register_for_special_xge(scrn->conn, &xcb_present_id, peid, 0);
+
    return true;
 }
 
@@ -132,6 +157,8 @@ vl_dri3_screen_destroy(struct vl_screen *vscreen)
 
    assert(vscreen);
 
+   if (scrn->special_event)
+      xcb_unregister_for_special_event(scrn->conn, scrn->special_event);
    scrn->base.pscreen->destroy(scrn->base.pscreen);
    pipe_loader_release(&scrn->base.dev, 1);
    FREE(scrn);