xf86-video-ati: Branch 'master' - 3 commits
Michel Dänzer
daenzer at kemper.freedesktop.org
Sat Feb 27 06:23:08 UTC 2016
src/radeon_dri2.c | 5 +++--
src/radeon_drm_queue.c | 18 +++++++++++++-----
src/radeon_kms.c | 9 +--------
3 files changed, 17 insertions(+), 15 deletions(-)
New commits:
commit e87365117acbd80b7d80fbb5eb30890ef7153291
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Thu Feb 25 16:49:16 2016 +0900
DRI2: Also clear dri2_flipping when client disconnects before event
Fixes the following problem:
With DRI3 enabled, run glxgears with LIBGL_DRI3_DISABLE=1, make it
fullscreen and press Escape while it's still fullscreen. This could
result in dri2_flipping not getting cleared, spuriously preventing apps
using DRI3 from flipping.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index d30bbd0..740a9d3 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -647,6 +647,9 @@ xf86CrtcPtr radeon_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
static void
radeon_dri2_flip_event_abort(ScrnInfoPtr scrn, void *event_data)
{
+ RADEONInfoPtr info = RADEONPTR(scrn);
+
+ info->drmmode.dri2_flipping = FALSE;
free(event_data);
}
@@ -654,7 +657,6 @@ static void
radeon_dri2_flip_event_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec,
void *event_data)
{
- RADEONInfoPtr info = RADEONPTR(scrn);
DRI2FrameEventPtr flip = event_data;
unsigned tv_sec, tv_usec;
DrawablePtr drawable;
@@ -698,7 +700,6 @@ radeon_dri2_flip_event_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec,
DRI2SwapComplete(flip->client, drawable, frame, tv_sec, tv_usec,
DRI2_FLIP_COMPLETE, flip->event_complete,
flip->event_data);
- info->drmmode.dri2_flipping = FALSE;
break;
default:
xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: unknown vblank event received\n", __func__);
commit d5dbb07db22d5420c81dfebc060f0dd86e7b8a20
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Thu Feb 25 18:02:12 2016 +0900
Remove radeon_scanout_flip_handler
No longer necessary now that radeon_drm_queue_handler can handle
e->handler == NULL.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 38f5c4e..d93a4ce 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -486,12 +486,6 @@ radeon_scanout_flip_abort(ScrnInfoPtr scrn, void *event_data)
}
static void
-radeon_scanout_flip_handler(ScrnInfoPtr scrn, uint32_t frame, uint64_t usec, void *event_data)
-{
- radeon_scanout_flip_abort(scrn, event_data);
-}
-
-static void
radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
xf86CrtcPtr xf86_crtc)
{
@@ -510,8 +504,7 @@ radeon_scanout_flip(ScreenPtr pScreen, RADEONInfoPtr info,
scrn = xf86_crtc->scrn;
drm_queue_entry = radeon_drm_queue_alloc(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT,
RADEON_DRM_QUEUE_ID_DEFAULT,
- drmmode_crtc,
- radeon_scanout_flip_handler,
+ drmmode_crtc, NULL,
radeon_scanout_flip_abort);
if (!drm_queue_entry) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
commit 3989766edde85d1abe7024577b98fc9b007bc02a
Author: Michel Dänzer <michel.daenzer at amd.com>
Date: Thu Feb 25 16:43:48 2016 +0900
drm_queue: Don't abort events immediately from radeon_drm_abort_client
Keep them around until the DRM event arrives, but then call the abort
functions instead of the handler functions.
This is a prerequisite for the following fix.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
diff --git a/src/radeon_drm_queue.c b/src/radeon_drm_queue.c
index 5e54ef8..a50a1fd 100644
--- a/src/radeon_drm_queue.c
+++ b/src/radeon_drm_queue.c
@@ -64,8 +64,12 @@ radeon_drm_queue_handler(int fd, unsigned int frame, unsigned int sec,
xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
if (e == user_data) {
xorg_list_del(&e->list);
- e->handler(e->scrn, frame,
- (uint64_t)sec * 1000000 + usec, e->data);
+ if (e->handler)
+ e->handler(e->scrn, frame,
+ (uint64_t)sec * 1000000 + usec,
+ e->data);
+ else
+ e->abort(e->scrn, e->data);
free(e);
break;
}
@@ -115,15 +119,19 @@ radeon_drm_abort_one(struct radeon_drm_queue_entry *e)
/*
* Abort drm queue entries for a client
+ *
+ * NOTE: This keeps the entries in the list until the DRM event arrives,
+ * but then it calls the abort functions instead of the handler
+ * functions.
*/
void
radeon_drm_abort_client(ClientPtr client)
{
- struct radeon_drm_queue_entry *e, *tmp;
+ struct radeon_drm_queue_entry *e;
- xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_queue, list) {
+ xorg_list_for_each_entry(e, &radeon_drm_queue, list) {
if (e->client == client)
- radeon_drm_abort_one(e);
+ e->handler = NULL;
}
}
More information about the xorg-commit
mailing list