[Mesa-dev] [PATCH v2] egl/wayland: Implement EGL_EXT_swap_buffers_with_damage

Kristian Høgsberg krh at bitplanet.net
Mon Apr 29 09:44:30 PDT 2013


On Thu, Apr 25, 2013 at 6:18 PM, Robert Bragg <robert at sixbynine.org> wrote:
> 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.

The entire series looks good to me:

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> -- >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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list