present: Send GLX_BufferSwapComplete events from present extension

This allows GL to support the GLX_INTEL_swap_event extension.

v2: Return GLX_BLIT_COMPLETE_INTEL for unknown swap types

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Keith Packard 2013-11-21 22:48:31 -08:00
parent cde86e68fc
commit 3dd5bfe540
7 changed files with 107 additions and 25 deletions

View File

@ -20,7 +20,8 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/hw/xfree86/os-support/bus \
-I$(top_srcdir)/hw/xfree86/common \
-I$(top_srcdir)/hw/xfree86/dri \
-I$(top_srcdir)/mi
-I$(top_srcdir)/mi \
-I$(top_srcdir)/present
if DRI2_AIGLX
AM_CPPFLAGS += -I$(top_srcdir)/hw/xfree86/dri2

View File

@ -2468,3 +2468,64 @@ __glXDisp_ClientInfo(__GLXclientState * cl, GLbyte * pc)
return Success;
}
#include <GL/glxtokens.h>
void
__glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust,
CARD64 msc, CARD32 sbc)
{
ClientPtr client = clients[CLIENT_ID(drawable->drawId)];
xGLXBufferSwapComplete2 wire = {
.type = __glXEventBase + GLX_BufferSwapComplete
};
if (!client)
return;
if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
return;
wire.event_type = type;
wire.drawable = drawable->drawId;
wire.ust_hi = ust >> 32;
wire.ust_lo = ust & 0xffffffff;
wire.msc_hi = msc >> 32;
wire.msc_lo = msc & 0xffffffff;
wire.sbc = sbc;
WriteEventsToClient(client, 1, (xEvent *) &wire);
}
#if PRESENT
static void
__glXpresentCompleteNotify(WindowPtr window, CARD8 present_mode, CARD32 serial,
uint64_t ust, uint64_t msc)
{
__GLXdrawable *drawable;
int glx_type;
int rc;
rc = dixLookupResourceByType((pointer *) &drawable, window->drawable.id,
__glXDrawableRes, serverClient, DixGetAttrAccess);
if (rc != Success)
return;
if (present_mode == PresentCompleteModeFlip)
glx_type = GLX_FLIP_COMPLETE_INTEL;
else
glx_type = GLX_BLIT_COMPLETE_INTEL;
__glXsendSwapEvent(drawable, glx_type, ust, msc, serial);
}
#include <present.h>
void
__glXregisterPresentCompleteNotify(void)
{
present_register_complete_notify(__glXpresentCompleteNotify);
}
#endif

View File

@ -177,36 +177,25 @@ __glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
CARD64 msc, CARD32 sbc)
{
__GLXdrawable *drawable = data;
xGLXBufferSwapComplete2 wire = {
.type = __glXEventBase + GLX_BufferSwapComplete
};
if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
return;
int glx_type;
switch (type) {
case DRI2_EXCHANGE_COMPLETE:
wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL;
break;
case DRI2_BLIT_COMPLETE:
wire.event_type = GLX_BLIT_COMPLETE_INTEL;
break;
case DRI2_FLIP_COMPLETE:
wire.event_type = GLX_FLIP_COMPLETE_INTEL;
glx_type = GLX_EXCHANGE_COMPLETE_INTEL;
break;
default:
/* unknown swap completion type */
wire.event_type = 0;
/* unknown swap completion type,
* BLIT is a reasonable default, so
* fall through ...
*/
case DRI2_BLIT_COMPLETE:
glx_type = GLX_BLIT_COMPLETE_INTEL;
break;
case DRI2_FLIP_COMPLETE:
glx_type = GLX_FLIP_COMPLETE_INTEL;
break;
}
wire.drawable = drawable->drawId;
wire.ust_hi = ust >> 32;
wire.ust_lo = ust & 0xffffffff;
wire.msc_hi = msc >> 32;
wire.msc_lo = msc & 0xffffffff;
wire.sbc = sbc;
WriteEventsToClient(client, 1, (xEvent *) &wire);
__glXsendSwapEvent(drawable, glx_type, ust, msc, sbc);
}
/*

View File

@ -399,6 +399,9 @@ GlxExtensionInit(void)
__glXErrorBase = extEntry->errorBase;
__glXEventBase = extEntry->eventBase;
#if PRESENT
__glXregisterPresentCompleteNotify();
#endif
}
/************************************************************************/

View File

@ -120,6 +120,15 @@ void glxResumeClients(void);
void __glXsetGetProcAddress(void (*(*get_proc_address) (const char *)) (void));
void *__glGetProcAddress(const char *);
void
__glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust,
CARD64 msc, CARD32 sbc);
#if PRESENT
void
__glXregisterPresentCompleteNotify(void);
#endif
/*
** State kept per client.
*/

View File

@ -115,4 +115,13 @@ present_event_abandon(RRCrtcPtr crtc);
extern _X_EXPORT Bool
present_screen_init(ScreenPtr screen, present_screen_info_ptr info);
typedef void (*present_complete_notify_proc)(WindowPtr window,
CARD8 mode,
CARD32 serial,
uint64_t ust,
uint64_t msc);
extern _X_EXPORT void
present_register_complete_notify(present_complete_notify_proc proc);
#endif /* _PRESENT_H_ */

View File

@ -137,6 +137,14 @@ present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw,
}
}
static present_complete_notify_proc complete_notify;
void
present_register_complete_notify(present_complete_notify_proc proc)
{
complete_notify = proc;
}
void
present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc)
{
@ -165,6 +173,8 @@ present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 se
}
}
}
if (complete_notify)
(*complete_notify)(window, mode, serial, ust, msc);
}
void