Mesa (master): egl_dri2/x11: Add support for eglSwapInterval
Kristian Høgsberg
krh at kemper.freedesktop.org
Wed Dec 21 03:22:01 UTC 2011
Module: Mesa
Branch: master
Commit: 655f2c1d6593064b83f64a527798f48cd300fa16
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=655f2c1d6593064b83f64a527798f48cd300fa16
Author: Fredrik Höglund <fredrik at kde.org>
Date: Tue Dec 20 17:17:02 2011 +0100
egl_dri2/x11: Add support for eglSwapInterval
---
src/egl/drivers/dri2/egl_dri2.c | 8 +++++++-
src/egl/drivers/dri2/egl_dri2.h | 1 +
src/egl/drivers/dri2/platform_x11.c | 28 ++++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 4c9ece3..47de978 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -259,9 +259,15 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
return NULL;
}
- if (double_buffer)
+ if (double_buffer) {
surface_type &= ~EGL_PIXMAP_BIT;
+ if (dri2_dpy->swap_available) {
+ conf->base.MinSwapInterval = 0;
+ conf->base.MaxSwapInterval = 1000; /* XXX arbitrary value */
+ }
+ }
+
conf->base.SurfaceType |= surface_type;
return conf;
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index 193a866..bead446 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -102,6 +102,7 @@ struct dri2_egl_display
int fd;
int own_device;
+ int swap_available;
#ifdef HAVE_DRM_PLATFORM
struct gbm_dri_device *gbm_dri;
#endif
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
index d789ec6..d761fe0 100644
--- a/src/egl/drivers/dri2/platform_x11.c
+++ b/src/egl/drivers/dri2/platform_x11.c
@@ -764,6 +764,31 @@ dri2_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
}
static EGLBoolean
+dri2_swap_interval(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint interval)
+{
+#if XCB_DRI2_MINOR_VERSION >= 3
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
+
+ /* XXX Check vblank_mode here? */
+
+ if (interval > surf->Config->MaxSwapInterval)
+ interval = surf->Config->MaxSwapInterval;
+ else if (interval < surf->Config->MinSwapInterval)
+ interval = surf->Config->MinSwapInterval;
+
+ if (interval != surf->SwapInterval && dri2_dpy->swap_available)
+ xcb_dri2_swap_interval(dri2_dpy->conn, dri2_surf->drawable, interval);
+
+ surf->SwapInterval = interval;
+
+ return EGL_TRUE;
+#else
+ return EGL_FALSE;
+#endif
+}
+
+static EGLBoolean
dri2_copy_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
EGLNativePixmapType target)
{
@@ -987,6 +1012,7 @@ dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
drv->API.CreateImageKHR = dri2_x11_create_image_khr;
drv->API.SwapBuffersRegionNOK = dri2_swap_buffers_region;
drv->API.PostSubBufferNV = dri2_post_sub_buffer;
+ drv->API.SwapInterval = dri2_swap_interval;
dri2_dpy = malloc(sizeof *dri2_dpy);
if (!dri2_dpy)
@@ -1046,6 +1072,8 @@ dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
dri2_dpy->extensions[1] = &image_lookup_extension.base;
dri2_dpy->extensions[2] = NULL;
+ dri2_dpy->swap_available = (dri2_dpy->dri2_minor >= 2);
+
if (!dri2_create_screen(disp))
goto cleanup_fd;
More information about the mesa-commit
mailing list