From 6425b14515e3124d6d1fe2d39fa192389aab9f85 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 25 Apr 2013 13:41:42 +0100 Subject: [PATCH] egl: Add extension infrastructure for EGL_EXT_swap_buffers_with_damage MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Eric Anholt Reviewed-by: Kristian Høgsberg --- src/egl/main/eglapi.c | 32 ++++++++++++++++++++++++++++++++ src/egl/main/eglapi.h | 7 +++++++ src/egl/main/egldisplay.h | 1 + src/egl/main/eglmisc.c | 1 + 4 files changed, 41 insertions(+) diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index bcc546557b8..4a9831bc7f1 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -701,6 +701,35 @@ eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) } +#ifdef EGL_EXT_swap_buffers_with_damage + +EGLBoolean EGLAPIENTRY +eglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface, + EGLint *rects, EGLint n_rects) +{ + _EGLContext *ctx = _eglGetCurrentContext(); + _EGLDisplay *disp = _eglLockDisplay(dpy); + _EGLSurface *surf = _eglLookupSurface(surface, disp); + _EGLDriver *drv; + EGLBoolean ret; + + _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); + + /* surface must be bound to current context in EGL 1.4 */ + if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || + surf != ctx->DrawSurface) + RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); + + if ((n_rects > 0 && rects == NULL) || n_rects < 0) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects); + + RETURN_EGL_EVAL(disp, ret); +} + +#endif /* EGL_EXT_swap_buffers_with_damage */ + EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) { @@ -939,6 +968,9 @@ eglGetProcAddress(const char *procname) { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL }, #endif { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV }, +#ifdef EGL_EXT_swap_buffers_with_damage + { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT }, +#endif { NULL, NULL } }; EGLint i; diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index 85b8f1a8db1..ee382d00e4a 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -131,6 +131,9 @@ typedef EGLBoolean (*PostSubBufferNV_t)(_EGLDriver *drv, _EGLDisplay *disp, _EGL typedef EGLint (*QueryBufferAge_t)(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface); +#ifdef EGL_EXT_swap_buffers_with_damage +typedef EGLBoolean (*SwapBuffersWithDamageEXT_t) (_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface, const EGLint *rects, EGLint n_rects); +#endif /** * The API dispatcher jumps through these functions @@ -207,6 +210,10 @@ struct _egl_api QueryWaylandBufferWL_t QueryWaylandBufferWL; #endif +#ifdef EGL_EXT_swap_buffers_with_damage + SwapBuffersWithDamageEXT_t SwapBuffersWithDamageEXT; +#endif /* EGL_EXT_swap_buffers_with_damage */ + PostSubBufferNV_t PostSubBufferNV; QueryBufferAge_t QueryBufferAge; diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index 4b33470151b..f990300a548 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -115,6 +115,7 @@ struct _egl_extensions EGLBoolean EXT_create_context_robustness; EGLBoolean EXT_buffer_age; + EGLBoolean EXT_swap_buffers_with_damage; }; diff --git a/src/egl/main/eglmisc.c b/src/egl/main/eglmisc.c index 92b0eae5f2a..a843ce77108 100644 --- a/src/egl/main/eglmisc.c +++ b/src/egl/main/eglmisc.c @@ -117,6 +117,7 @@ _eglUpdateExtensionsString(_EGLDisplay *dpy) _EGL_CHECK_EXTENSION(EXT_create_context_robustness); _EGL_CHECK_EXTENSION(EXT_buffer_age); + _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage); _EGL_CHECK_EXTENSION(NV_post_sub_buffer); #undef _EGL_CHECK_EXTENSION -- 2.30.2