--- src/gallium/state_trackers/egl/x11/native_dri2.c | 20 +++++++++++++++++--- src/gallium/state_trackers/egl/x11/x11_screen.c | 8 ++++++++ src/gallium/state_trackers/egl/x11/x11_screen.h | 4 ++++ 3 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/src/gallium/state_trackers/egl/x11/native_dri2.c b/src/gallium/state_trackers/egl/x11/native_dri2.c index 5d7d379..740bd55 100644 --- a/src/gallium/state_trackers/egl/x11/native_dri2.c +++ b/src/gallium/state_trackers/egl/x11/native_dri2.c @@ -359,9 +359,6 @@ dri2_surface_present(struct native_surface *nsurf, { boolean ret; - if (ctrl->swap_interval) - return FALSE; - switch (ctrl->natt) { case NATIVE_ATTACHMENT_FRONT_LEFT: ret = dri2_surface_flush_frontbuffer(nsurf); @@ -378,6 +375,18 @@ dri2_surface_present(struct native_surface *nsurf, } static boolean +dri2_surface_swap_interval(struct native_surface *nsurf, int interval) +{ + struct dri2_surface *dri2surf = dri2_surface(nsurf); + struct dri2_display *dri2dpy = dri2surf->dri2dpy; + + if (dri2dpy->dri_minor >= 2) + x11_drawable_swap_interval(dri2dpy->xscr, dri2surf->drawable, interval); + + return TRUE; +} + +static boolean dri2_surface_validate(struct native_surface *nsurf, uint attachment_mask, unsigned int *seq_num, struct pipe_resource **textures, int *width, int *height) @@ -470,6 +479,7 @@ dri2_display_create_surface(struct native_display *ndpy, dri2surf->base.present = dri2_surface_present; dri2surf->base.validate = dri2_surface_validate; dri2surf->base.wait = dri2_surface_wait; + dri2surf->base.swap_interval = dri2_surface_swap_interval; if (drawable) { x11_drawable_enable_dri2(dri2dpy->xscr, drawable, TRUE); @@ -724,6 +734,7 @@ static int dri2_display_get_param(struct native_display *ndpy, enum native_param_type param) { + struct dri2_display *dri2dpy = dri2_display(ndpy); int val; switch (param) { @@ -739,6 +750,9 @@ dri2_display_get_param(struct native_display *ndpy, val = TRUE; break; case NATIVE_PARAM_MAX_SWAP_INTERVAL: + /* XXX Arbitrary value */ + val = dri2dpy->dri_minor >= 2 ? 1000 : 0; + break; default: val = 0; break; diff --git a/src/gallium/state_trackers/egl/x11/x11_screen.c b/src/gallium/state_trackers/egl/x11/x11_screen.c index 1e20f94..af5021d 100644 --- a/src/gallium/state_trackers/egl/x11/x11_screen.c +++ b/src/gallium/state_trackers/egl/x11/x11_screen.c @@ -381,6 +381,14 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable, return (struct x11_drawable_buffer *) dri2bufs; } +void +x11_drawable_swap_interval(struct x11_screen *xscr, Drawable drawable, + int interval) +{ + /* XXX Check vblank_mode? */ + DRI2SwapInterval(xscr->dpy, drawable, interval); +} + /** * Create a mode list of the given size. */ diff --git a/src/gallium/state_trackers/egl/x11/x11_screen.h b/src/gallium/state_trackers/egl/x11/x11_screen.h index ad7aa97..197e16a 100644 --- a/src/gallium/state_trackers/egl/x11/x11_screen.h +++ b/src/gallium/state_trackers/egl/x11/x11_screen.h @@ -129,6 +129,10 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable, int *width, int *height, unsigned int *attachments, boolean with_format, int num_ins, int *num_outs); +void +x11_drawable_swap_interval(struct x11_screen *xscr, Drawable drawable, + int interval); + #endif /* GLX_DIRECT_RENDERING */ #endif /* _X11_SCREEN_H_ */ -- 1.7.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev