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:
parent
cde86e68fc
commit
3dd5bfe540
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -399,6 +399,9 @@ GlxExtensionInit(void)
|
|||
|
||||
__glXErrorBase = extEntry->errorBase;
|
||||
__glXEventBase = extEntry->eventBase;
|
||||
#if PRESENT
|
||||
__glXregisterPresentCompleteNotify();
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user