glx: add support for a reallyFlush() function before swap occurs.
This commit is contained in:
@@ -78,6 +78,7 @@ typedef struct __DRIswrastExtensionRec __DRIswrastExtension;
|
|||||||
typedef struct __DRIbufferRec __DRIbuffer;
|
typedef struct __DRIbufferRec __DRIbuffer;
|
||||||
typedef struct __DRIdri2ExtensionRec __DRIdri2Extension;
|
typedef struct __DRIdri2ExtensionRec __DRIdri2Extension;
|
||||||
typedef struct __DRIdri2LoaderExtensionRec __DRIdri2LoaderExtension;
|
typedef struct __DRIdri2LoaderExtensionRec __DRIdri2LoaderExtension;
|
||||||
|
typedef struct __DRI2flushExtensionRec __DRI2flushExtension;
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
@@ -245,6 +246,16 @@ struct __DRItexBufferExtensionRec {
|
|||||||
__DRIdrawable *pDraw);
|
__DRIdrawable *pDraw);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by drivers that implement DRI2
|
||||||
|
*/
|
||||||
|
#define __DRI2_FLUSH "DRI2_Flush"
|
||||||
|
#define __DRI2_FLUSH_VERSION 1
|
||||||
|
struct __DRI2flushExtensionRec {
|
||||||
|
__DRIextension base;
|
||||||
|
void (*flush)(__DRIdrawable *drawable);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XML document describing the configuration options supported by the
|
* XML document describing the configuration options supported by the
|
||||||
|
@@ -208,7 +208,13 @@ static void dri2CopySubBuffer(__GLXDRIdrawable *pdraw,
|
|||||||
xrect.width = width;
|
xrect.width = width;
|
||||||
xrect.height = height;
|
xrect.height = height;
|
||||||
|
|
||||||
|
#ifdef __DRI2_FLUSH
|
||||||
|
if (pdraw->psc->f)
|
||||||
|
(*pdraw->psc->f->flush)(pdraw->driDrawable);
|
||||||
|
#endif
|
||||||
|
|
||||||
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
||||||
|
/* should get a fence ID back from here at some point */
|
||||||
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
||||||
DRI2BufferFrontLeft, DRI2BufferBackLeft);
|
DRI2BufferFrontLeft, DRI2BufferBackLeft);
|
||||||
XFixesDestroyRegion(pdraw->psc->dpy, region);
|
XFixesDestroyRegion(pdraw->psc->dpy, region);
|
||||||
@@ -236,6 +242,11 @@ static void dri2WaitX(__GLXDRIdrawable *pdraw)
|
|||||||
xrect.width = priv->width;
|
xrect.width = priv->width;
|
||||||
xrect.height = priv->height;
|
xrect.height = priv->height;
|
||||||
|
|
||||||
|
#ifdef __DRI2_FLUSH
|
||||||
|
if (pdraw->psc->f)
|
||||||
|
(*pdraw->psc->f->flush)(pdraw->driDrawable);
|
||||||
|
#endif
|
||||||
|
|
||||||
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
||||||
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
||||||
DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
|
DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
|
||||||
@@ -256,6 +267,11 @@ static void dri2WaitGL(__GLXDRIdrawable *pdraw)
|
|||||||
xrect.width = priv->width;
|
xrect.width = priv->width;
|
||||||
xrect.height = priv->height;
|
xrect.height = priv->height;
|
||||||
|
|
||||||
|
#ifdef __DRI2_FLUSH
|
||||||
|
if (pdraw->psc->f)
|
||||||
|
(*pdraw->psc->f->flush)(pdraw->driDrawable);
|
||||||
|
#endif
|
||||||
|
|
||||||
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
region = XFixesCreateRegion(pdraw->psc->dpy, &xrect, 1);
|
||||||
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
DRI2CopyRegion(pdraw->psc->dpy, pdraw->drawable, region,
|
||||||
DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
|
DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
|
||||||
|
@@ -392,6 +392,13 @@ driBindExtensions(__GLXscreenConfigs *psc, int dri2)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __DRI2_FLUSH
|
||||||
|
if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0) && dri2) {
|
||||||
|
psc->f = (__DRI2flushExtension *) extensions[i];
|
||||||
|
/* internal driver extension, no GL extension exposed */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Ignore unknown extensions */
|
/* Ignore unknown extensions */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -519,6 +519,10 @@ struct __GLXscreenConfigsRec {
|
|||||||
const __DRItexBufferExtension *texBuffer;
|
const __DRItexBufferExtension *texBuffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __DRI2_FLUSH
|
||||||
|
const __DRI2flushExtension *f;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user