This method may be used by dri drivers to make sure all outstanding buffer swaps have been flushed to hardware. Also add a dri3 implementation.
Signed-off-by: Thomas Hellstrom <thellst...@vmware.com> --- include/GL/internal/dri_interface.h | 16 +++++++++++++++- src/glx/dri3_glx.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index fc2d4bb..ff70ba0 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -1690,7 +1690,7 @@ struct __DRIimageList { }; #define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER" -#define __DRI_IMAGE_LOADER_VERSION 1 +#define __DRI_IMAGE_LOADER_VERSION 2 struct __DRIimageLoaderExtensionRec { __DRIextension base; @@ -1726,6 +1726,20 @@ struct __DRIimageLoaderExtensionRec { * into __DRIdri2ExtensionRec::createNewDrawable */ void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate); + + /** + * Flush swap buffers + * + * Make sure any outstanding swap buffers have been submitted to the + * device. + * + * \param driDrawable Drawable whose swaps need to be flushed + * \param loaderPrivate Loader's private data that was previously passed + * into __DRIdri2ExtensionRec::createNewDrawable + * + * \since 2 + */ + void (*flushSwapBuffers)(__DRIdrawable *driDrawable, void *loaderPrivate); }; /** diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 5091606..39ffcfa 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -502,6 +502,34 @@ dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate) loader_dri3_wait_gl(draw); } +/** + * Make sure all pending swapbuffers have been submitted to hardware + * + * \param driDrawable[in] Pointer to the dri drawable whose swaps we are + * flushing. + * \param loaderPrivate[in] Pointer to the corresponding struct + * loader_dri_drawable. + */ +static void +dri3_flush_swap_buffers(__DRIdrawable *driDrawable, void *loaderPrivate) +{ + struct loader_dri3_drawable *draw = loaderPrivate; + struct dri3_drawable *pdraw = loader_drawable_to_dri3_drawable(draw); + struct dri3_screen *psc; + int64_t ust, msc, sbc; + + if (!pdraw) + return; + + if (!pdraw->base.psc) + return; + + psc = (struct dri3_screen *) pdraw->base.psc; + + (void) __glXInitialize(psc->base.dpy); + loader_dri3_swapbuffer_barrier(draw); +} + static void dri_set_background_context(void *loaderPrivate) { @@ -525,6 +553,7 @@ static const __DRIimageLoaderExtension imageLoaderExtension = { .getBuffers = loader_dri3_get_buffers, .flushFrontBuffer = dri3_flush_front_buffer, + .flushSwapBuffers = dri3_flush_swap_buffers, }; const __DRIuseInvalidateExtension dri3UseInvalidate = { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev