+ memset(&ctrl, 0, sizeof(ctrl));
+ ctrl.natt = NATIVE_ATTACHMENT_BACK_LEFT;
+ ctrl.preserve = preserve;
+ ctrl.swap_interval = gsurf->base.SwapInterval;
+ ctrl.premultiplied_alpha = (gsurf->base.VGAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE);
+ ctrl.num_rects = num_rects;
+ ctrl.rects = rects;
+
+ return gsurf->native->present(gsurf->native, &ctrl);
+}
+
+static EGLBoolean
+egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+{
+ struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
+
+ return swap_buffers(drv, dpy, surf, 0, NULL,
+ (gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED));
+}
+
+#ifdef EGL_NOK_swap_region
+static EGLBoolean
+egl_g3d_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
+ EGLint num_rects, const EGLint *rects)
+{
+ /* Note: y=0=top */
+ return swap_buffers(drv, dpy, surf, num_rects, rects, EGL_TRUE);
+}
+#endif /* EGL_NOK_swap_region */
+
+static EGLBoolean
+egl_g3d_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
+ EGLint x, EGLint y, EGLint width, EGLint height)
+{
+ EGLint rect[4];
+
+ if (x < 0 || y < 0 || width < 0 || height < 0)
+ return _eglError(EGL_BAD_PARAMETER, "eglPostSubBufferNV");
+
+ /* clamp */
+ if (x + width > surf->Width)
+ width = surf->Width - x;
+ if (y + height > surf->Height)
+ height = surf->Height - y;
+
+ if (width <= 0 || height <= 0)
+ return EGL_TRUE;
+
+ rect[0] = x;
+ /* Note: y=0=bottom */
+ rect[1] = surf->Height - y - height;
+ rect[2] = width;
+ rect[3] = height;
+
+ return swap_buffers(drv, dpy, surf, 1, rect, EGL_TRUE);