glx/present: Only send GLX_BufferSwapComplete for PresentCompleteKindPixmap

Present didn't provide the 'kind' argument to the
present_complete_notify hook that GLX uses to construct
GLX_BufferSwapComplete events, so GLX was reporting events for
PresentCompleteKindMSC notifications, which resulted in duplicate
GLX_BufferSwapComplete events and crashes in clutter.

See the gnome bug: https://bugzilla.gnome.org/show_bug.cgi?id=733282

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Keith Packard 2014-09-04 08:36:07 -07:00
parent 7a0c79c8c4
commit bf338efc67
3 changed files with 7 additions and 3 deletions

View File

@ -2508,13 +2508,16 @@ __glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust,
#if PRESENT #if PRESENT
static void static void
__glXpresentCompleteNotify(WindowPtr window, CARD8 present_mode, CARD32 serial, __glXpresentCompleteNotify(WindowPtr window, CARD8 present_kind, CARD8 present_mode,
uint64_t ust, uint64_t msc) CARD32 serial, uint64_t ust, uint64_t msc)
{ {
__GLXdrawable *drawable; __GLXdrawable *drawable;
int glx_type; int glx_type;
int rc; int rc;
if (present_kind != PresentCompleteKindPixmap)
return;
rc = dixLookupResourceByType((void **) &drawable, window->drawable.id, rc = dixLookupResourceByType((void **) &drawable, window->drawable.id,
__glXDrawableRes, serverClient, DixGetAttrAccess); __glXDrawableRes, serverClient, DixGetAttrAccess);

View File

@ -116,6 +116,7 @@ extern _X_EXPORT Bool
present_screen_init(ScreenPtr screen, present_screen_info_ptr info); present_screen_init(ScreenPtr screen, present_screen_info_ptr info);
typedef void (*present_complete_notify_proc)(WindowPtr window, typedef void (*present_complete_notify_proc)(WindowPtr window,
CARD8 kind,
CARD8 mode, CARD8 mode,
CARD32 serial, CARD32 serial,
uint64_t ust, uint64_t ust,

View File

@ -174,7 +174,7 @@ present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 se
} }
} }
if (complete_notify) if (complete_notify)
(*complete_notify)(window, mode, serial, ust, msc); (*complete_notify)(window, kind, mode, serial, ust, msc);
} }
void void