[Mesa-dev] [PATCH 2/5] dri: Add a flushSwapBuffers method to the image loader extension
Thomas Hellstrom
thellstrom at vmware.com
Thu Jun 22 10:42:34 UTC 2017
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 <thellstrom at 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
More information about the mesa-dev
mailing list