mirror of
https://github.com/X11Libre/xf86-video-ati.git
synced 2026-03-24 01:24:43 +00:00
dri2: Call drm_queue_handle_deferred in dri2_deferred_event
drm_queue_handler just puts the event on the signalled list; without
calling drm_queue_handle_deferred, actual processing of the event may be
delayed indefinitely, e.g. until another event arrives from the kernel.
This could result in DRI2 clients hanging during DPMS off.
Fixes: ba83a866af "Add radeon_drm_handle_event wrapper for
drmHandleEvent"
(Ported from amdgpu commit 09be74a3d1dd9604336d9a27f98d132b262dcbaf)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Michel Dänzer
parent
705020b624
commit
c301b8af25
@@ -979,12 +979,18 @@ CARD32 radeon_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||||
"%s cannot get current time\n", __func__);
|
"%s cannot get current time\n", __func__);
|
||||||
if (event_info->drm_queue_seq)
|
|
||||||
|
if (event_info->drm_queue_seq) {
|
||||||
drmmode_crtc->drmmode->event_context.
|
drmmode_crtc->drmmode->event_context.
|
||||||
vblank_handler(pRADEONEnt->fd, 0, 0, 0,
|
vblank_handler(pRADEONEnt->fd, 0, 0, 0,
|
||||||
(void*)event_info->drm_queue_seq);
|
(void*)event_info->drm_queue_seq);
|
||||||
else
|
drmmode_crtc->wait_flip_nesting_level++;
|
||||||
|
radeon_drm_queue_handle_deferred(crtc);
|
||||||
|
|
||||||
|
} else {
|
||||||
radeon_dri2_frame_event_handler(crtc, 0, 0, data);
|
radeon_dri2_frame_event_handler(crtc, 0, 0, data);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -995,13 +1001,18 @@ CARD32 radeon_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data)
|
|||||||
delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
|
delta_seq = delta_t * drmmode_crtc->dpms_last_fps;
|
||||||
delta_seq /= 1000000;
|
delta_seq /= 1000000;
|
||||||
frame = (CARD64)drmmode_crtc->dpms_last_seq + delta_seq;
|
frame = (CARD64)drmmode_crtc->dpms_last_seq + delta_seq;
|
||||||
if (event_info->drm_queue_seq)
|
|
||||||
|
if (event_info->drm_queue_seq) {
|
||||||
drmmode_crtc->drmmode->event_context.
|
drmmode_crtc->drmmode->event_context.
|
||||||
vblank_handler(pRADEONEnt->fd, frame, drm_now / 1000000,
|
vblank_handler(pRADEONEnt->fd, frame, drm_now / 1000000,
|
||||||
drm_now % 1000000,
|
drm_now % 1000000,
|
||||||
(void*)event_info->drm_queue_seq);
|
(void*)event_info->drm_queue_seq);
|
||||||
else
|
drmmode_crtc->wait_flip_nesting_level++;
|
||||||
|
radeon_drm_queue_handle_deferred(crtc);
|
||||||
|
} else {
|
||||||
radeon_dri2_frame_event_handler(crtc, frame, drm_now, data);
|
radeon_dri2_frame_event_handler(crtc, frame, drm_now, data);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user