Mesa (master): egl/wayland: Implement EGL_EXT_swap_buffers_with_damage

Robert Bragg rib at kemper.freedesktop.org
Tue May 7 16:12:40 UTC 2013


Module: Mesa
Branch: master
Commit: f8c324268223611ce7d14c4109faed4ab0eb3798
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f8c324268223611ce7d14c4109faed4ab0eb3798

Author: Robert Bragg <robert at sixbynine.org>
Date:   Fri Feb 10 16:59:31 2012 +0000

egl/wayland: Implement EGL_EXT_swap_buffers_with_damage

Reviewed-by: Eric Anholt <eric at anholt.net>
Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

---

 src/egl/drivers/dri2/platform_wayland.c |   29 ++++++++++++++++++++++++++---
 1 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 8e4b3ce..b5523be 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -495,7 +495,11 @@ create_wl_buffer(struct dri2_egl_surface *dri2_surf)
  * 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);
@@ -540,8 +544,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);
 
@@ -566,6 +580,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)
 {
@@ -713,6 +733,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;
 
@@ -795,6 +816,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;




More information about the mesa-commit mailing list