[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