Initial Present infrastructure.

This commit is contained in:
Kim Woelders 2014-11-15 13:29:36 +01:00
parent 9c7cf39e31
commit 1e625f8bb4
5 changed files with 64 additions and 2 deletions

View File

@ -294,6 +294,16 @@ if test "x$enable_composite" = "xyes"; then
fi fi
AM_CONDITIONAL(ENABLE_COMPOSITE, test "x$enable_composite" = "xyes") AM_CONDITIONAL(ENABLE_COMPOSITE, test "x$enable_composite" = "xyes")
AC_ARG_ENABLE(xpresent,
AC_HELP_STRING([--enable-xpresent], [compile with Present support (experimental) @<:@default=no@:>@]),,
enable_xpresent=no)
if test "x$enable_xpresent" = "xyes"; then
PKG_CHECK_MODULES(XPRESENT, xpresent,
AC_DEFINE(USE_XPRESENT, 1, [Present support]),
enable_xpresent=no
AC_MSG_WARN([Present support was requested but not found]) )
fi
AC_ARG_ENABLE(zoom, AC_ARG_ENABLE(zoom,
AC_HELP_STRING([--enable-zoom], [compile with zoom support @<:@default=yes@:>@]),, AC_HELP_STRING([--enable-zoom], [compile with zoom support @<:@default=yes@:>@]),,
enable_zoom=yes) enable_zoom=yes)
@ -514,6 +524,7 @@ echo " GLX .......................... $enable_glx"
echo " ScreenSaver .................. $enable_xscrnsaver" echo " ScreenSaver .................. $enable_xscrnsaver"
echo " D-Bus ........................ $enable_dbus" echo " D-Bus ........................ $enable_dbus"
echo " XI2 .......................... $enable_xi2" echo " XI2 .......................... $enable_xi2"
echo " Present....................... $enable_xpresent"
echo " Use container window ......... $enable_container" echo " Use container window ......... $enable_container"
echo echo
echo "Installation path .............. $prefix" echo "Installation path .............. $prefix"

View File

@ -126,6 +126,7 @@
#define XEXT_RENDER 8 #define XEXT_RENDER 8
#define XEXT_GLX 9 #define XEXT_GLX 9
#define XEXT_XI 10 #define XEXT_XI 10
#define XEXT_PRESENT 11
#define XEXT_CM_ALL 16 #define XEXT_CM_ALL 16

View File

@ -135,6 +135,7 @@ e16_CPPFLAGS = \
$(DBUS_CFLAGS) \ $(DBUS_CFLAGS) \
$(XI_CFLAGS) \ $(XI_CFLAGS) \
$(XRANDR_CFLAGS) \ $(XRANDR_CFLAGS) \
$(XPRESENT_CFLAGS) \
$(X_CFLAGS) $(X_CFLAGS)
LDADD = \ LDADD = \
@ -145,6 +146,7 @@ LDADD = \
$(GLX_LIBS) \ $(GLX_LIBS) \
$(XI_LIBS) \ $(XI_LIBS) \
$(XRANDR_LIBS) \ $(XRANDR_LIBS) \
$(XPRESENT_LIBS) \
$(X_LIBS) \ $(X_LIBS) \
$(SM_LIBS) \ $(SM_LIBS) \
$(XINERAMA_LIBS) \ $(XINERAMA_LIBS) \

View File

@ -57,6 +57,7 @@
#define EDBUG_TYPE_XI2 153 #define EDBUG_TYPE_XI2 153
#define EDBUG_TYPE_ZOOM 154 #define EDBUG_TYPE_ZOOM 154
#define EDBUG_TYPE_ANIM 155 #define EDBUG_TYPE_ANIM 155
#define EDBUG_TYPE_PRESENT 156
#define EDBUG_TYPE_COMPMGR 161 #define EDBUG_TYPE_COMPMGR 161
#define EDBUG_TYPE_COMPMGR2 162 #define EDBUG_TYPE_COMPMGR2 162

View File

@ -50,13 +50,16 @@
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
#include <X11/extensions/Xrender.h> #include <X11/extensions/Xrender.h>
#endif #endif
#if USE_XPRESENT
#include <X11/extensions/Xpresent.h>
#endif
#if USE_GLX #if USE_GLX
#include <GL/glx.h> #include <GL/glx.h>
#endif #endif
#if USE_XI2 #if USE_XI2
#include <X11/extensions/XInput2.h> #include <X11/extensions/XInput2.h>
#endif #endif
#define USE_GENERIC defined(USE_XI2) #define USE_GENERIC defined(USE_XI2) || defined(USE_XPRESENT)
#if ENABLE_DEBUG_EVENTS #if ENABLE_DEBUG_EVENTS
static const char *EventName(unsigned int type); static const char *EventName(unsigned int type);
@ -78,7 +81,7 @@ typedef struct {
void (*init) (int avaliable); void (*init) (int avaliable);
} EServerExt; } EServerExt;
static EServerExtData ExtData[11]; static EServerExtData ExtData[12];
#define event_base_shape ExtData[XEXT_SHAPE].event_base #define event_base_shape ExtData[XEXT_SHAPE].event_base
#define event_base_randr ExtData[XEXT_RANDR].event_base #define event_base_randr ExtData[XEXT_RANDR].event_base
@ -249,6 +252,21 @@ ExtInitInput(int available)
} }
#endif #endif
#if USE_XPRESENT
static void
ExtInitPresent(int available)
{
if (!available)
return;
if (EDebug(EDBUG_TYPE_VERBOSE))
{
Eprintf(" Capabilities: %#x\n",
XPresentQueryCapabilities(disp, WinGetXwin(VROOT)));
}
}
#endif
static const EServerExt Extensions[] = { static const EServerExt Extensions[] = {
{"SHAPE", XEXT_SHAPE, XShapeQueryVersion, ExtInitShape}, {"SHAPE", XEXT_SHAPE, XShapeQueryVersion, ExtInitShape},
#if USE_XSYNC #if USE_XSYNC
@ -275,6 +293,9 @@ static const EServerExt Extensions[] = {
#if USE_XI2 #if USE_XI2
{"XInputExtension", XEXT_XI, EInputQueryVersion, ExtInitInput}, {"XInputExtension", XEXT_XI, EInputQueryVersion, ExtInitInput},
#endif #endif
#if USE_XPRESENT
{"Present", XEXT_PRESENT, XPresentQueryVersion, ExtInitPresent},
#endif
}; };
static void static void
@ -888,6 +909,25 @@ _EventFetchXI2(XEvent * ev)
} }
#endif /* USE_XI2 */ #endif /* USE_XI2 */
#if USE_XPRESENT
typedef union {
XPresentEvent xpe;
XPresentConfigureNotifyEvent conf;
XPresentCompleteNotifyEvent cmpl;
XPresentIdleNotifyEvent idle;
} xpe_t;
static void
_EventFetchPresent(XEvent * ev)
{
xpe_t *xpe = (xpe_t *) ev->xcookie.data;
if (EDebug(EDBUG_TYPE_PRESENT))
Eprintf("%s: %#lx: type=%d\n",
__func__, xpe->idle.window, xpe->xpe.evtype);
}
#endif /* USE_XPRESENT */
static void static void
_EventFetchGeneric(XEvent * ev) _EventFetchGeneric(XEvent * ev)
{ {
@ -904,6 +944,13 @@ _EventFetchGeneric(XEvent * ev)
_EventFetchXI2(ev); _EventFetchXI2(ev);
goto done; goto done;
} }
#endif
#if USE_XPRESENT
if (ev->xcookie.extension == ExtData[XEXT_PRESENT].major_op)
{
_EventFetchPresent(ev);
goto done;
}
#endif #endif
/* We should never go here */ /* We should never go here */
Eprintf("*** %s: ext=%d type=%d\n", __func__, Eprintf("*** %s: ext=%d type=%d\n", __func__,