summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFredrik Höglund <fredrik@kde.org>2011-12-07 16:32:40 +0100
committerFredrik Höglund <fredrik@kde.org>2011-12-07 16:34:24 +0100
commit9d36b99de607b66c617a8816db0202c096c1ff00 (patch)
treeb1ebd38074506b2014d0bde1f834c3882cfe546d
parent61b58feddfb34e05c3fe875f4436c21ce8278aab (diff)
st/egl: Add support for EGL_NV_post_sub_buffernv-post-sub-buffer
Signed-off-by: Fredrik Höglund <fredrik@kde.org>
-rw-r--r--src/gallium/state_trackers/egl/common/egl_g3d.c6
-rw-r--r--src/gallium/state_trackers/egl/common/egl_g3d_api.c24
2 files changed, 29 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c
index feebfafc6a..554c23cfda 100644
--- a/src/gallium/state_trackers/egl/common/egl_g3d.c
+++ b/src/gallium/state_trackers/egl/common/egl_g3d.c
@@ -606,10 +606,14 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy)
dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
#endif
+ if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_REGION)) {
#ifdef EGL_NOK_swap_region
- if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_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 e8f2abc47f..7fa31bc3c9 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,14 @@ 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;
+ }
+#endif
+
gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base);
if (!gsurf->stfbi) {
nsurf->destroy(nsurf);
@@ -602,6 +610,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)
@@ -894,4 +914,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
}