Signed-off-by: Fredrik Höglund <fred...@kde.org> --- src/gallium/state_trackers/egl/common/egl_g3d.c | 8 ++++- .../state_trackers/egl/common/egl_g3d_api.c | 26 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c index 53811b8..f870b18 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d.c @@ -606,11 +606,15 @@ 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) && - gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER)) + gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER)) { +#ifdef EGL_NOK_swap_region dpy->Extensions.NOK_swap_region = EGL_TRUE; #endif +#ifdef EGL_NV_post_sub_buffer + dpy->Extensions.NV_post_sub_buffer = EGL_TRUE; +#endif + } if (egl_g3d_add_configs(drv, dpy, 1) == 1) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(unable to add configs)"); 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 2e3ead6..e16955c 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c @@ -296,6 +296,16 @@ egl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, gconf->stvis.buffer_mask & ST_ATTACHMENT_FRONT_LEFT_MASK) gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT; +#ifdef EGL_NV_post_sub_buffer + if (dpy->Extensions.NV_post_sub_buffer) { + if (gsurf->base.Type == EGL_WINDOW_BIT && + gsurf->base.RenderBuffer == EGL_BACK_BUFFER) + gsurf->base.PostSubBufferSupportedNV = EGL_TRUE; + else + gsurf->base.PostSubBufferSupportedNV = EGL_FALSE; + } +#endif + gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); if (!gsurf->stfbi) { nsurf->destroy(nsurf); @@ -601,6 +611,18 @@ egl_g3d_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf } #endif /* EGL_NOK_swap_region */ +#ifdef EGL_NV_post_sub_buffer +static EGLBoolean +egl_g3d_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, + EGLint x, EGLint y, EGLint width, EGLint height) +{ + /* Note: y=0=bottom */ + const EGLint rect[4] = { x, surf->Height - y - height, width, height }; + + return swap_buffers(drv, dpy, surf, 1, rect, EGL_TRUE); +} +#endif /* EGL_NV_post_sub_buffer */ + static EGLBoolean egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLNativePixmapType target) @@ -893,4 +915,8 @@ egl_g3d_init_driver_api(_EGLDriver *drv) #ifdef EGL_NOK_swap_region drv->API.SwapBuffersRegionNOK = egl_g3d_swap_buffers_region; #endif + +#ifdef EGL_NV_post_sub_buffer + drv->API.PostSubBufferNV = egl_g3d_post_sub_buffer; +#endif } -- 1.7.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev