diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | hw/xfree86/dri2/dri2.c | 25 | ||||
-rw-r--r-- | hw/xfree86/dri2/dri2.h | 1 |
3 files changed, 23 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index f760730c3..e831d7b77 100644 --- a/configure.ac +++ b/configure.ac @@ -758,7 +758,7 @@ RECORDPROTO="recordproto >= 1.13.99.1" SCRNSAVERPROTO="scrnsaverproto >= 1.1" RESOURCEPROTO="resourceproto >= 1.2.0" DRIPROTO="xf86driproto >= 2.1.0" -DRI2PROTO="dri2proto >= 2.8" +DRI2PROTO="dri2proto >= 2.9" DRI3PROTO="dri3proto >= 1.0" XINERAMAPROTO="xineramaproto" BIGFONTPROTO="xf86bigfontproto >= 1.2.0" diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 226d77cc2..a3b3fb47c 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -49,6 +49,8 @@ #include "damage.h" #include "xf86.h" +#include <X11/extensions/dri2proto.h> /* for parameter names */ + CARD8 dri2_major; /* version of DRI2 supported by DDX */ CARD8 dri2_minor; @@ -115,6 +117,7 @@ typedef struct _DRI2Screen { unsigned int lastSequence; int prime_id; int scheduleSwap0; + int bufferAge; DRI2CreateBufferProcPtr CreateBuffer; DRI2DestroyBufferProcPtr DestroyBuffer; @@ -1114,6 +1117,9 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, return BadDrawable; } + if (ds->bufferAge) + pSrcBuffer->flags = *swap_target; + /* Old DDX or PRIME, just blit */ if (!ds->scheduleSwap0 || pPriv->prime_id) { BoxRec box; @@ -1559,6 +1565,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) if (info->version >= 10) { ds->scheduleSwap0 = info->scheduleSwap0; + ds->bufferAge = info->bufferAge; } /* @@ -1681,10 +1688,20 @@ DRI2GetParam(ClientPtr client, switch (high_byte) { case 0: - /* Parameter names whose high_byte is 0 are reserved for the X - * server. The server currently recognizes no parameters. - */ - goto not_recognized; + /* Parameter names whose high_byte is 0 are reserved for the X + * server. + */ + switch (param) { + case DRI2ParamXHasBufferAge: + *value = ds->bufferAge; + break; + default: + goto not_recognized; + } + + *is_param_recognized = TRUE; + return Success; + case 1: /* Parameter names whose high byte is 1 are reserved for the DDX. */ if (ds->GetParam) diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h index 1cf428828..e76f7a8ad 100644 --- a/hw/xfree86/dri2/dri2.h +++ b/hw/xfree86/dri2/dri2.h @@ -255,6 +255,7 @@ typedef struct { /* added in version 10 */ int scheduleSwap0; + int bufferAge; } DRI2InfoRec, *DRI2InfoPtr; extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info); |