/*
* Mesa 3-D graphics library
- * Version: 7.9
*
* Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
*
switch (ctx->ClientAPI) {
case EGL_OPENGL_ES_API:
- switch (ctx->ClientVersion) {
+ switch (ctx->ClientMajorVersion) {
case 1:
api = ST_API_OPENGL;
*profile = ST_PROFILE_OPENGL_ES1;
*profile = ST_PROFILE_OPENGL_ES2;
break;
default:
- _eglLog(_EGL_WARNING, "unknown client version %d",
- ctx->ClientVersion);
+ _eglLog(_EGL_WARNING, "unknown client major version %d",
+ ctx->ClientMajorVersion);
break;
}
break;
struct egl_g3d_config *gconf = egl_g3d_config(conf);
struct egl_g3d_context *gctx;
struct st_context_attribs stattribs;
+ enum st_context_error ctx_err = 0;
gctx = CALLOC_STRUCT(egl_g3d_context);
if (!gctx) {
return NULL;
}
- gctx->stctxi = gctx->stapi->create_context(gctx->stapi, gdpy->smapi,
- &stattribs, (gshare) ? gshare->stctxi : NULL);
+ gctx->stctxi = gctx->stapi->create_context(gctx->stapi, gdpy->smapi,
+ &stattribs, &ctx_err, (gshare) ? gshare->stctxi : NULL);
if (!gctx->stctxi) {
FREE(gctx);
return NULL;
gconf->stvis.buffer_mask & ST_ATTACHMENT_FRONT_LEFT_MASK)
gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT;
+ /* surfaces can always be posted when the display supports it */
+ if (dpy->Extensions.NV_post_sub_buffer)
+ gsurf->base.PostSubBufferSupportedNV = EGL_TRUE;
+
gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base);
if (!gsurf->stfbi) {
nsurf->destroy(nsurf);
}
static EGLBoolean
-egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
+ EGLint num_rects, const EGLint *rects, EGLBoolean preserve)
{
struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
_EGLContext *ctx = _eglGetCurrentContext();
memset(&ctrl, 0, sizeof(ctrl));
ctrl.natt = NATIVE_ATTACHMENT_BACK_LEFT;
- ctrl.preserve = (gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED);
+ 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);
+}
+
static EGLBoolean
egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
EGLNativePixmapType target)
return gdpy->native->wayland_bufmgr->unbind_display(gdpy->native, wl_dpy);
}
+static EGLBoolean
+egl_g3d_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *dpy,
+ struct wl_resource *buffer,
+ EGLint attribute, EGLint *value)
+{
+ struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
+
+ if (!gdpy->native->wayland_bufmgr)
+ return EGL_FALSE;
+
+ return gdpy->native->wayland_bufmgr->query_buffer(gdpy->native,
+ buffer, attribute, value);
+}
#endif /* EGL_WL_bind_wayland_display */
void
#ifdef EGL_WL_bind_wayland_display
drv->API.BindWaylandDisplayWL = egl_g3d_bind_wayland_display_wl;
drv->API.UnbindWaylandDisplayWL = egl_g3d_unbind_wayland_display_wl;
-
+ drv->API.QueryWaylandBufferWL = egl_g3d_query_wayland_buffer_wl;
#endif
-#ifdef EGL_KHR_reusable_sync
drv->API.CreateSyncKHR = egl_g3d_create_sync;
drv->API.DestroySyncKHR = egl_g3d_destroy_sync;
drv->API.ClientWaitSyncKHR = egl_g3d_client_wait_sync;
drv->API.SignalSyncKHR = egl_g3d_signal_sync;
-#endif
#ifdef EGL_MESA_screen_surface
drv->API.CreateScreenSurfaceMESA = egl_g3d_create_screen_surface;
drv->API.ShowScreenSurfaceMESA = egl_g3d_show_screen_surface;
#endif
+
+#ifdef EGL_NOK_swap_region
+ drv->API.SwapBuffersRegionNOK = egl_g3d_swap_buffers_region;
+#endif
+
+ drv->API.PostSubBufferNV = egl_g3d_post_sub_buffer;
}