[Mesa-dev] [PATCH v2 8/8] egl/wayland: add dri2_wl_free_buffers() helper

Eric Engestrom eric.engestrom at imgtec.com
Tue Oct 17 14:07:32 UTC 2017


On Friday, 2017-10-06 21:38:35 +0000, Gwan-gyeong Mun wrote:
> This deduplicates free routines of color_buffers array.
> 
> Signed-off-by: Mun Gwan-gyeong <elongbug at gmail.com>
> ---
>  src/egl/drivers/dri2/platform_wayland.c | 60 +++++++++++++++++----------------
>  1 file changed, 31 insertions(+), 29 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index 1518a24b7c..cfe474cf58 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -253,6 +253,35 @@ dri2_wl_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *disp,
>     return NULL;
>  }
>  
> +static void
> +dri2_wl_free_buffers(struct dri2_egl_surface *dri2_surf, bool check_lock)
> +{
> +   struct dri2_egl_display *dri2_dpy =
> +      dri2_egl_display(dri2_surf->base.Resource.Display);
> +
> +   for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> +      if (dri2_surf->color_buffers[i].native_buffer) {
> +         if (check_lock && !dri2_surf->color_buffers[i].locked)
> +            wl_buffer_destroy((struct wl_buffer *)dri2_surf->color_buffers[i].native_buffer);
> +         else
> +            wl_buffer_destroy((struct wl_buffer *)dri2_surf->color_buffers[i].native_buffer);

Both branches have the same code, should be a hint :P
I think this should be:

   if (!check_lock || !dri2_surf->color_buffers[i].locked) {
      wl_buffer_destroy((struct wl_buffer *)dri2_surf->color_buffers[i].native_buffer);
      dri2_surf->color_buffers[i].native_buffer = NULL;
   }

without an `else`. You also want to remove the `native_buffer = NULL`
from below, to avoid leaking locked buffers :)

> +      }
> +      if (dri2_surf->color_buffers[i].dri_image)
> +         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
> +      if (dri2_surf->color_buffers[i].linear_copy)
> +         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].linear_copy);
> +      if (dri2_surf->color_buffers[i].data)
> +         munmap(dri2_surf->color_buffers[i].data,
> +                dri2_surf->color_buffers[i].data_size);
> +
> +      dri2_surf->color_buffers[i].native_buffer = NULL;
> +      dri2_surf->color_buffers[i].dri_image = NULL;
> +      dri2_surf->color_buffers[i].linear_copy = NULL;
> +      dri2_surf->color_buffers[i].data = NULL;
> +      dri2_surf->color_buffers[i].locked = false;
> +   }
> +}
> +
>  /**
>   * Called via eglDestroySurface(), drv->API.DestroySurface().
>   */
> @@ -266,17 +295,7 @@ dri2_wl_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
>  
>     dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
>  
> -   for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> -      if (dri2_surf->color_buffers[i].native_buffer)
> -         wl_buffer_destroy((struct wl_buffer *)dri2_surf->color_buffers[i].native_buffer);
> -      if (dri2_surf->color_buffers[i].dri_image)
> -         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
> -      if (dri2_surf->color_buffers[i].linear_copy)
> -         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].linear_copy);
> -      if (dri2_surf->color_buffers[i].data)
> -         munmap(dri2_surf->color_buffers[i].data,
> -                dri2_surf->color_buffers[i].data_size);
> -   }
> +   dri2_wl_free_buffers(dri2_surf, false);
>  
>     if (dri2_dpy->dri2)
>        dri2_egl_surface_free_local_buffers(dri2_surf);
> @@ -308,24 +327,7 @@ dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
>     struct dri2_egl_display *dri2_dpy =
>        dri2_egl_display(dri2_surf->base.Resource.Display);
>  
> -   for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> -      if (dri2_surf->color_buffers[i].native_buffer &&
> -          !dri2_surf->color_buffers[i].locked)
> -         wl_buffer_destroy((struct wl_buffer *)dri2_surf->color_buffers[i].native_buffer);
> -      if (dri2_surf->color_buffers[i].dri_image)
> -         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
> -      if (dri2_surf->color_buffers[i].linear_copy)
> -         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].linear_copy);
> -      if (dri2_surf->color_buffers[i].data)
> -         munmap(dri2_surf->color_buffers[i].data,
> -                dri2_surf->color_buffers[i].data_size);
> -
> -      dri2_surf->color_buffers[i].native_buffer = NULL;
> -      dri2_surf->color_buffers[i].dri_image = NULL;
> -      dri2_surf->color_buffers[i].linear_copy = NULL;
> -      dri2_surf->color_buffers[i].data = NULL;
> -      dri2_surf->color_buffers[i].locked = false;
> -   }
> +   dri2_wl_free_buffers(dri2_surf, true);
>  
>     if (dri2_dpy->dri2)
>        dri2_egl_surface_free_local_buffers(dri2_surf);
> -- 
> 2.14.2
> 


More information about the mesa-dev mailing list