Backends indicate that they support this extension by returning EGL_TRUE when native_display::get_param() is called with NATIVE_PARAM_PRESENT_REGION.
native_present_control is extended to include the region that should be presented. When the whole surface is to be presented, this region will be a single rect containing the dimensions of the surface. Signed-off-by: Fredrik Höglund <fred...@kde.org> --- src/gallium/state_trackers/egl/common/egl_g3d.c | 5 +++ .../state_trackers/egl/common/egl_g3d_api.c | 31 ++++++++++++++++++- src/gallium/state_trackers/egl/common/native.h | 12 +++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c index 182ce68..feebfaf 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d.c @@ -606,6 +606,11 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy) dpy->Extensions.WL_bind_wayland_display = EGL_TRUE; #endif +#ifdef EGL_NOK_swap_region + if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_REGION)) + dpy->Extensions.NOK_swap_region = EGL_TRUE; +#endif + if (egl_g3d_add_configs(drv, dpy, 1) == 1) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(unable to add configs)"); goto fail; diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c index 911540e..e8f2abc 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c @@ -546,7 +546,8 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy, } 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(); @@ -572,14 +573,36 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) 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); + const EGLint rect[4] = { 0, 0, gsurf->base.Width, gsurf->base.Height }; + + return swap_buffers(drv, dpy, surf, 1, rect, + (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_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLNativePixmapType target) { @@ -867,4 +890,8 @@ egl_g3d_init_driver_api(_EGLDriver *drv) 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 } diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h index ee24c22..f1e067e 100644 --- a/src/gallium/state_trackers/egl/common/native.h +++ b/src/gallium/state_trackers/egl/common/native.h @@ -81,7 +81,13 @@ enum native_param_type { * EGL_ALPHA_SIZE. EGL_VG_ALPHA_FORMAT attribute of a surface will affect * how the surface is presented. */ - NATIVE_PARAM_PREMULTIPLIED_ALPHA + NATIVE_PARAM_PREMULTIPLIED_ALPHA, + + /** + * Return TRUE if native_surface::present supports presenting a partial + * surface. + */ + NATIVE_PARAM_PRESENT_REGION }; /** @@ -99,6 +105,10 @@ struct native_present_control { /**< pixels use premultiplied alpha */ boolean premultiplied_alpha; + + /**< the region to present. y=0=top */ + int num_rects; + const int *rects; /* x, y, width, height */ }; struct native_surface { -- 1.7.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev