diff --git a/src/intel.h b/src/intel.h index 970e519e..ba23ac11 100644 --- a/src/intel.h +++ b/src/intel.h @@ -439,6 +439,7 @@ enum { }; extern Bool intel_mode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp); +extern void intel_mode_init(struct intel_screen_private *intel); extern void intel_mode_remove_fb(intel_screen_private *intel); extern void intel_mode_fini(intel_screen_private *intel); diff --git a/src/intel_display.c b/src/intel_display.c index 6e7ec2a0..3676d994 100644 --- a/src/intel_display.c +++ b/src/intel_display.c @@ -1515,19 +1515,33 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp) xf86DrvMsg(scrn->scrnIndex, X_INFO, "Kernel page flipping support detected, enabling\n"); intel->use_pageflipping = TRUE; - mode->flip_count = 0; + mode->event_context.version = DRM_EVENT_CONTEXT_VERSION; mode->event_context.vblank_handler = intel_vblank_handler; mode->event_context.page_flip_handler = intel_page_flip_handler; - AddGeneralSocket(fd); - RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, - drm_wakeup_handler, mode); } intel->modes = mode; return TRUE; } +void +intel_mode_init(struct intel_screen_private *intel) +{ + if (intel->use_pageflipping) { + struct intel_mode *mode = intel->modes; + + /* We need to re-register the mode->fd for the synchronisation + * feedback on every server generation, so perform the + * registration within ScreenInit and not PreInit. + */ + mode->flip_count = 0; + AddGeneralSocket(mode->fd); + RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, + drm_wakeup_handler, mode); + } +} + void intel_mode_remove_fb(intel_screen_private *intel) { diff --git a/src/intel_driver.c b/src/intel_driver.c index 1ef16ed4..23df87be 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -1019,6 +1019,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) if (serverGeneration == 1) xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options); + intel_mode_init(intel); + intel->suspended = FALSE; return uxa_resources_init(screen);