[PATCH 3/3] glamor: Free existing EGL image when assigning new one

Zhigang Gong zhigang.gong at linux.intel.com
Tue Dec 9 01:26:08 PST 2014


This patch LGTM, thanks.

Reviewed-by: Zhigang Gong <zhigang.gong at linux.intel.com>

On Mon, Dec 08, 2014 at 01:38:45PM -0800, Keith Packard wrote:
> When reallocating the framebuffer on screen resize, the old EGL image
> was getting leaked. Check for an existing EGL image and free it in
> this case.
> 
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
>  glamor/glamor_egl.c | 28 +++++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
> index d93aee4..a52489b 100644
> --- a/glamor/glamor_egl.c
> +++ b/glamor/glamor_egl.c
> @@ -253,6 +253,24 @@ glamor_egl_check_has_gem(int fd)
>      return FALSE;
>  }
>  
> +static void
> +glamor_egl_set_pixmap_image(PixmapPtr pixmap, EGLImageKHR image)
> +{
> +    struct glamor_pixmap_private *pixmap_priv =
> +        glamor_get_pixmap_private(pixmap);
> +    EGLImageKHR old;
> +
> +    old = pixmap_priv->base.image;
> +    if (old) {
> +        ScreenPtr                               screen = pixmap->drawable.pScreen;
> +        ScrnInfoPtr                             scrn = xf86ScreenToScrn(screen);
> +        struct glamor_egl_screen_private        *glamor_egl = glamor_egl_get_screen_private(scrn);
> +
> +        eglDestroyImageKHR(glamor_egl->display, old);
> +    }
> +    pixmap_priv->base.image = image;
> +}
> +
>  Bool
>  glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
>  {
> @@ -260,8 +278,6 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
>      ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
>      struct glamor_screen_private *glamor_priv =
>          glamor_get_screen_private(screen);
> -    struct glamor_pixmap_private *pixmap_priv =
> -        glamor_get_pixmap_private(pixmap);
>      struct glamor_egl_screen_private *glamor_egl;
>      EGLImageKHR image;
>      GLuint texture;
> @@ -296,7 +312,7 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
>      glamor_create_texture_from_image(screen, image, &texture);
>      glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
>      glamor_set_pixmap_texture(pixmap, texture);
> -    pixmap_priv->base.image = image;
> +    glamor_egl_set_pixmap_image(pixmap, image);
>      ret = TRUE;
>  
>   done:
> @@ -310,8 +326,6 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo)
>      ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
>      struct glamor_screen_private *glamor_priv =
>          glamor_get_screen_private(screen);
> -    struct glamor_pixmap_private *pixmap_priv =
> -        glamor_get_pixmap_private(pixmap);
>      struct glamor_egl_screen_private *glamor_egl;
>      EGLImageKHR image;
>      GLuint texture;
> @@ -331,7 +345,7 @@ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo)
>      glamor_create_texture_from_image(screen, image, &texture);
>      glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
>      glamor_set_pixmap_texture(pixmap, texture);
> -    pixmap_priv->base.image = image;
> +    glamor_egl_set_pixmap_image(pixmap, image);
>      ret = TRUE;
>  
>   done:
> @@ -404,8 +418,8 @@ glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen,
>          if (image == EGL_NO_IMAGE_KHR)
>              goto failure;
>  
> -        pixmap_priv->base.image = image;
>          glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
> +        glamor_egl_set_pixmap_image(pixmap, image);
>      }
>  
>      bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_EGL_IMAGE, image, 0);
> -- 
> 2.1.3
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list