[Mesa-dev] [PATCH v2] egl/wayland: Implement EGL_EXT_swap_buffers_with_damage
Robert Bragg
robert at sixbynine.org
Thu Apr 25 15:18:12 PDT 2013
I've updated this patch to handle the case where 0 rectangles have been given
and updated the eglSwapBuffers shim to rely on that. Thanks to Eric for
noticing this.
-- >8 --
Reviewed-by: Eric Anholt <eric at anholt.net>
---
src/egl/drivers/dri2/platform_wayland.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index e9a66af..f7c43e1 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -442,7 +442,11 @@ static const struct wl_callback_listener frame_listener = {
* Called via eglSwapBuffers(), drv->API.SwapBuffers().
*/
static EGLBoolean
-dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
+dri2_swap_buffers_with_damage(_EGLDriver *drv,
+ _EGLDisplay *disp,
+ _EGLSurface *draw,
+ const EGLint *rects,
+ EGLint n_rects)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
@@ -491,8 +495,18 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
dri2_surf->dx = 0;
dri2_surf->dy = 0;
- wl_surface_damage(dri2_surf->wl_win->surface, 0, 0,
- dri2_surf->base.Width, dri2_surf->base.Height);
+ if (n_rects == 0) {
+ wl_surface_damage(dri2_surf->wl_win->surface, 0, 0,
+ dri2_surf->base.Width, dri2_surf->base.Height);
+ } else {
+ for (i = 0; i < n_rects; i++) {
+ const int *rect = &rects[i * 4];
+ wl_surface_damage(dri2_surf->wl_win->surface,
+ rect[0],
+ dri2_surf->base.Height - rect[1] - rect[3],
+ rect[2], rect[3]);
+ }
+ }
wl_surface_commit(dri2_surf->wl_win->surface);
@@ -517,6 +531,12 @@ dri2_query_buffer_age(_EGLDriver *drv,
return dri2_surf->back->age;
}
+static EGLBoolean
+dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
+{
+ return dri2_swap_buffers_with_damage (drv, disp, draw, NULL, 0);
+}
+
static int
dri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id)
{
@@ -653,6 +673,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
drv->API.CreateWindowSurface = dri2_create_window_surface;
drv->API.DestroySurface = dri2_destroy_surface;
drv->API.SwapBuffers = dri2_swap_buffers;
+ drv->API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage;
drv->API.Terminate = dri2_terminate;
drv->API.QueryBufferAge = dri2_query_buffer_age;
@@ -722,6 +743,8 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
disp->Extensions.EXT_buffer_age = EGL_TRUE;
dri2_dpy->authenticate = dri2_wayland_authenticate;
+ disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
+
/* we're supporting EGL 1.4 */
disp->VersionMajor = 1;
disp->VersionMinor = 4;
--
1.8.2.1
More information about the mesa-dev
mailing list