[Mesa-dev] [PATCH] egl: add dri2_surface_free_image() helper (v4)

Gurchetan Singh gurchetansingh at chromium.org
Mon Nov 20 23:04:23 UTC 2017


Reviewed-by: Gurchetan Singh <gurchetansingh at chromium.org>

On Wed, Nov 15, 2017 at 7:27 AM, Gwan-gyeong Mun <elongbug at gmail.com> wrote:

> To share common free DRIimage code.
>
> In preparation to adding of new platform which uses this helper.
>
> v2:
>  - Fixes from Eric's review:
>    a) Split out series of refactor for helpers to a separate series.
>    b) Add the new helper function and use them to replace the old code in
> the
>       same patch.
>
> v3: Fixes from Emil and Gurchetan's review
>   - Follow the naming convention which prevents too verbose name of
> functions.
>     a) use a dri2_surface_$action_$object naming convention
>     b) change a first argument type "struct dri2_egl_surface" to
> "_EGLSurface".
>
> v4: Fixes from Gurchetan's review
>   - add dri2_surface_free_image() helper for refactoring of almost
> identical
>     functions. [1]
>
> [1] https://lists.freedesktop.org/archives/mesa-dev/2017-
> October/173219.html
>
> Signed-off-by: Mun Gwan-gyeong <elongbug at gmail.com>
> ---
>  src/egl/drivers/dri2/egl_dri2.c             | 11 +++++++++++
>  src/egl/drivers/dri2/egl_dri2.h             |  3 +++
>  src/egl/drivers/dri2/platform_android.c     | 18 +++---------------
>  src/egl/drivers/dri2/platform_surfaceless.c | 14 +-------------
>  src/egl/drivers/dri2/platform_wayland.c     | 26
> ++++++++++++--------------
>  5 files changed, 30 insertions(+), 42 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_
> dri2.c
> index 8861742c17..84367e69fd 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -1085,6 +1085,17 @@ dri2_egl_surface_free_local_buffers(struct
> dri2_egl_surface *dri2_surf)
>     }
>  }
>
> +void
> +dri2_surface_free_image(_EGLSurface *surf, __DRIimage **img)
> +{
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(surf->
> Resource.Display);
> +
> +   if (*img) {
> +      dri2_dpy->image->destroyImage(*img);
> +      *img = NULL;
> +   }
> +}
> +
>  /**
>   * Called via eglTerminate(), drv->API.Terminate().
>   *
> diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_
> dri2.h
> index cbeedadd4b..dda41117c6 100644
> --- a/src/egl/drivers/dri2/egl_dri2.h
> +++ b/src/egl/drivers/dri2/egl_dri2.h
> @@ -452,6 +452,9 @@ dri2_egl_surface_alloc_local_buffer(struct
> dri2_egl_surface *dri2_surf,
>  void
>  dri2_egl_surface_free_local_buffers(struct dri2_egl_surface *dri2_surf);
>
> +void
> +dri2_surface_free_image(_EGLSurface *surf, __DRIimage **img);
> +
>  EGLBoolean
>  dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
>          _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean
> enable_out_fence);
> diff --git a/src/egl/drivers/dri2/platform_android.c
> b/src/egl/drivers/dri2/platform_android.c
> index 24e5ddebf9..3d6dd2e1e7 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -250,10 +250,7 @@ droid_window_enqueue_buffer(_EGLDisplay *disp,
> struct dri2_egl_surface *dri2_sur
>
>     mtx_lock(&disp->Mutex);
>
> -   if (dri2_surf->dri_image_back) {
> -      dri2_dpy->image->destroyImage(dri2_surf->dri_image_back);
> -      dri2_surf->dri_image_back = NULL;
> -   }
> +   dri2_surface_free_image(&dri2_surf->base, &dri2_surf->dri_image_back);
>
>     return EGL_TRUE;
>  }
> @@ -377,17 +374,8 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay
> *disp, _EGLSurface *surf)
>        dri2_surf->window->common.decRef(&dri2_surf->window->common);
>     }
>
> -   if (dri2_surf->dri_image_back) {
> -      _eglLog(_EGL_DEBUG, "%s : %d : destroy dri_image_back", __func__,
> __LINE__);
> -      dri2_dpy->image->destroyImage(dri2_surf->dri_image_back);
> -      dri2_surf->dri_image_back = NULL;
> -   }
> -
> -   if (dri2_surf->dri_image_front) {
> -      _eglLog(_EGL_DEBUG, "%s : %d : destroy dri_image_front", __func__,
> __LINE__);
> -      dri2_dpy->image->destroyImage(dri2_surf->dri_image_front);
> -      dri2_surf->dri_image_front = NULL;
> -   }
> +   dri2_surface_free_image(surf, &dri2_surf->dri_image_back);
> +   dri2_surface_free_image(surf, &dri2_surf->dri_image_front);
>
>     dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
>
> diff --git a/src/egl/drivers/dri2/platform_surfaceless.c
> b/src/egl/drivers/dri2/platform_surfaceless.c
> index 977b046016..959d587c88 100644
> --- a/src/egl/drivers/dri2/platform_surfaceless.c
> +++ b/src/egl/drivers/dri2/platform_surfaceless.c
> @@ -50,18 +50,6 @@ surfaceless_alloc_image(struct dri2_egl_display
> *dri2_dpy,
>              NULL);
>  }
>
> -static void
> -surfaceless_free_images(struct dri2_egl_surface *dri2_surf)
> -{
> -   struct dri2_egl_display *dri2_dpy =
> -      dri2_egl_display(dri2_surf->base.Resource.Display);
> -
> -   if (dri2_surf->front) {
> -      dri2_dpy->image->destroyImage(dri2_surf->front);
> -      dri2_surf->front = NULL;
> -   }
> -}
> -
>  static int
>  surfaceless_image_get_buffers(__DRIdrawable *driDrawable,
>                          unsigned int format,
> @@ -161,7 +149,7 @@ surfaceless_destroy_surface(_EGLDriver *drv,
> _EGLDisplay *disp, _EGLSurface *sur
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
>     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
>
> -   surfaceless_free_images(dri2_surf);
> +   dri2_surface_free_image(&dri2_surf->base, &dri2_surf->front);
>
>     dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
>
> diff --git a/src/egl/drivers/dri2/platform_wayland.c
> b/src/egl/drivers/dri2/platform_wayland.c
> index 3a52971f54..f03b6dc2ab 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -268,10 +268,10 @@ dri2_wl_destroy_surface(_EGLDriver *drv,
> _EGLDisplay *disp, _EGLSurface *surf)
>     for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
>        if (dri2_surf->color_buffers[i].native_buffer)
>           wl_buffer_destroy(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);
> +      dri2_surface_free_image(&dri2_surf->base,
> +                              &dri2_surf->color_buffers[i].dri_image);
> +      dri2_surface_free_image(&dri2_surf->base,
> +                              &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);
> @@ -311,17 +311,15 @@ dri2_wl_release_buffers(struct dri2_egl_surface
> *dri2_surf)
>        if (dri2_surf->color_buffers[i].native_buffer &&
>            !dri2_surf->color_buffers[i].locked)
>           wl_buffer_destroy(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);
> +      dri2_surface_free_image(&dri2_surf->base,
> +                              &dri2_surf->color_buffers[i].dri_image);
> +      dri2_surface_free_image(&dri2_surf->base,
> +                              &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;
>     }
> @@ -515,12 +513,12 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
>        if (!dri2_surf->color_buffers[i].locked &&
>            dri2_surf->color_buffers[i].native_buffer) {
>           wl_buffer_destroy(dri2_surf->color_buffers[i].native_buffer);
> -         dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].
> dri_image);
> +         dri2_surface_free_image(&dri2_surf->base,
> +                                 &dri2_surf->color_buffers[i].dri_image);
>           if (dri2_dpy->is_different_gpu)
> -            dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].
> linear_copy);
> +            dri2_surface_free_image(&dri2_surf->base,
> +                                    &dri2_surf->color_buffers[i].
> linear_copy);
>           dri2_surf->color_buffers[i].native_buffer = NULL;
> -         dri2_surf->color_buffers[i].dri_image = NULL;
> -         dri2_surf->color_buffers[i].linear_copy = NULL;
>        }
>     }
>
> --
> 2.15.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171120/316b9c2f/attachment-0001.html>


More information about the mesa-dev mailing list