diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2019-02-28 17:31:55 +0100 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2019-03-01 09:53:38 +0000 |
commit | 09be74a3d1dd9604336d9a27f98d132b262dcbaf (patch) | |
tree | 8e77c4922efcc94ed2c11b1dcd26d7420c0c5033 /src | |
parent | a636f42b496b0604ca00a144690ece61d1a88a27 (diff) |
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: 739181c8d3334 "Add amdgpu_drm_handle_event wrapper for
drmHandleEvent"
Reviewed-by: Aaron Liu <aaron.liu@amd.com>
Tested-by: Aaron Liu <aaron.liu@amd.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/amdgpu_dri2.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c index a6b76a1..44316ac 100644 --- a/src/amdgpu_dri2.c +++ b/src/amdgpu_dri2.c @@ -884,12 +884,18 @@ CARD32 amdgpu_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) if (ret) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "%s cannot get current time\n", __func__); - if (event_info->drm_queue_seq) + + if (event_info->drm_queue_seq) { drmmode_crtc->drmmode->event_context. vblank_handler(pAMDGPUEnt->fd, 0, 0, 0, (void*)event_info->drm_queue_seq); - else + drmmode_crtc->wait_flip_nesting_level++; + amdgpu_drm_queue_handle_deferred(crtc); + + } else { amdgpu_dri2_frame_event_handler(crtc, 0, 0, data); + } + return 0; } /* @@ -900,13 +906,18 @@ CARD32 amdgpu_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) delta_seq = delta_t * drmmode_crtc->dpms_last_fps; delta_seq /= 1000000; 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. vblank_handler(pAMDGPUEnt->fd, frame, drm_now / 1000000, drm_now % 1000000, (void*)event_info->drm_queue_seq); - else + drmmode_crtc->wait_flip_nesting_level++; + amdgpu_drm_queue_handle_deferred(crtc); + } else { amdgpu_dri2_frame_event_handler(crtc, frame, drm_now, data); + } + return 0; } |