}
static boolean
-dri2_surface_swap_buffers(struct native_surface *nsurf)
+dri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects,
+ const int *rects)
{
struct dri2_surface *dri2surf = dri2_surface(nsurf);
struct dri2_display *dri2dpy = dri2surf->dri2dpy;
/* copy to front buffer */
- if (dri2surf->have_back)
- x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
- 0, 0, dri2surf->width, dri2surf->height,
- DRI2BufferBackLeft, DRI2BufferFrontLeft);
+ if (dri2surf->have_back) {
+ if (num_rects > 0)
+ x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
+ num_rects, rects,
+ DRI2BufferBackLeft, DRI2BufferFrontLeft);
+ else
+ x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
+ 0, 0, dri2surf->width, dri2surf->height,
+ DRI2BufferBackLeft, DRI2BufferFrontLeft);
+ }
/* and update fake front buffer */
- if (dri2surf->have_fake)
- x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
- 0, 0, dri2surf->width, dri2surf->height,
- DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+ if (dri2surf->have_fake) {
+ if (num_rects > 0)
+ x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
+ num_rects, rects,
+ DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+ else
+ x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
+ 0, 0, dri2surf->width, dri2surf->height,
+ DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+ }
/* force buffers to be updated in next validation call */
if (!dri2_surface_receive_events(&dri2surf->base)) {
ret = dri2_surface_flush_frontbuffer(nsurf);
break;
case NATIVE_ATTACHMENT_BACK_LEFT:
- ret = dri2_surface_swap_buffers(nsurf);
+ ret = dri2_surface_swap_buffers(nsurf, ctrl->num_rects, ctrl->rects);
break;
default:
ret = FALSE;
/* DRI2CopyRegion is used */
val = TRUE;
break;
+ case NATIVE_PARAM_PRESENT_REGION:
+ val = TRUE;
+ break;
case NATIVE_PARAM_MAX_SWAP_INTERVAL:
default:
val = 0;