@ -730,6 +730,43 @@ static bool drm_connector_move_cursor(struct wlr_output *output,
return ok ;
return ok ;
}
}
static void drm_connector_schedule_frame ( struct wlr_output * output ) {
struct wlr_drm_connector * conn = get_drm_connector_from_output ( output ) ;
struct wlr_drm_backend * drm = get_drm_backend_from_backend ( output - > backend ) ;
if ( ! drm - > session - > active ) {
return ;
}
// We need to figure out where we are in the vblank cycle
// TODO: try using drmWaitVBlank and fallback to pageflipping
struct wlr_drm_crtc * crtc = conn - > crtc ;
if ( ! crtc ) {
return ;
}
struct wlr_drm_plane * plane = crtc - > primary ;
struct gbm_bo * bo = plane - > surf . back ;
if ( ! bo ) {
// We haven't swapped buffers yet -- can't do a pageflip
wlr_output_send_frame ( output ) ;
return ;
}
uint32_t fb_id = get_fb_for_bo ( bo ) ;
if ( conn - > pageflip_pending ) {
wlr_log ( WLR_ERROR , " Skipping pageflip on output '%s' " ,
conn - > output . name ) ;
return ;
}
if ( ! drm - > iface - > crtc_pageflip ( drm , conn , crtc , fb_id , NULL ) ) {
return ;
}
conn - > pageflip_pending = true ;
wlr_output_update_enabled ( output , true ) ;
}
static void drm_connector_destroy ( struct wlr_output * output ) {
static void drm_connector_destroy ( struct wlr_output * output ) {
struct wlr_drm_connector * conn = get_drm_connector_from_output ( output ) ;
struct wlr_drm_connector * conn = get_drm_connector_from_output ( output ) ;
drm_connector_cleanup ( conn ) ;
drm_connector_cleanup ( conn ) ;
@ -751,6 +788,7 @@ static const struct wlr_output_impl output_impl = {
. set_gamma = set_drm_connector_gamma ,
. set_gamma = set_drm_connector_gamma ,
. get_gamma_size = drm_connector_get_gamma_size ,
. get_gamma_size = drm_connector_get_gamma_size ,
. export_dmabuf = drm_connector_export_dmabuf ,
. export_dmabuf = drm_connector_export_dmabuf ,
. schedule_frame = drm_connector_schedule_frame ,
} ;
} ;
bool wlr_output_is_drm ( struct wlr_output * output ) {
bool wlr_output_is_drm ( struct wlr_output * output ) {