[Mesa-dev] [Mesa-stable] [PATCH 2/2] egl: move gbm link-time dependency to runtime dependency

Emil Velikov emil.l.velikov at gmail.com
Mon Nov 13 14:36:34 UTC 2017


On 12 November 2017 at 07:15, sguttula <suresh.guttula at amd.com> wrote:
> This patch will fix build error when we build with_platforms=drm
> and without enabling gbm.
>
> Chromiumos uses surfaceless platform and minigbm[not mesa-gbm]
> and drm platform needed for va.When we enable drm platform ,
> it is failing for dependency on gbm[as we disable mesa-gbm]
> at compile time.To fix this moved link dependency to runtime.
>
> Cc: mesa-stable at lists.freedesktop.org
> Cc: Emil Velikov <emil.velikov at collabora.com>
> Cc: Deepak Sharma <deepak.sharma at amd.com>
>
> Signed-off-by: sguttula <suresh.guttula at amd.com>
> Reviewed-by: Deepak Sharma <deepak.sharma at amd.com>
> ---
>  src/egl/Makefile.am                 |   2 +-
>  src/egl/drivers/dri2/platform_drm.c | 103 +++++++++++++++++++++++++++++++-----
>  src/egl/main/egldisplay.c           |   5 +-
>  src/gbm/main/gbm.c                  |  11 ----
>  4 files changed, 95 insertions(+), 26 deletions(-)
>  mode change 100644 => 100755 src/egl/Makefile.am
>  mode change 100644 => 100755 src/egl/drivers/dri2/platform_drm.c
>  mode change 100644 => 100755 src/egl/main/egldisplay.c
>  mode change 100644 => 100755 src/gbm/main/gbm.c
>
Hmm are you developing a Linux driver on Windows? These mode changes
should not be here.

In a TL;DR: I'd suggest:
 - picking something like my series [1] as a base
 - doing the dladdr trick as 1/X, updating gbm_device::dummy and
related documentation (suggest making it an ABI check)
 - 2/X - add separate file which provides wrappers - add small prefix
say "foo_gbm...", call "dlsym_all" from dri2_initialize_drm,
"close_the_handle at teardown
 - 3/X update existing codebase to use ^^, drop linking
 - ...
 - profit

There are a few small suggestions below.

[1] https://patchwork.freedesktop.org/series/33716/
Reviews will be appreciated


> diff --git a/src/egl/Makefile.am b/src/egl/Makefile.am
> old mode 100644
> new mode 100755
> index eeb745f..3bad977
> --- a/src/egl/Makefile.am
> +++ b/src/egl/Makefile.am
> @@ -94,7 +94,7 @@ dri2_backend_FILES += \
>  endif
>
>  if HAVE_PLATFORM_DRM
> -libEGL_common_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la
> +
There is a similar hunk in src/egl/meson.build. You want to drop that
one as well.
Namely:
link_for_egl += libgbm


>  dri2_backend_FILES += drivers/dri2/platform_drm.c
>  endif
>
> diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
> old mode 100644
> new mode 100755
> index 9005f5d..f489881
> --- a/src/egl/drivers/dri2/platform_drm.c
> +++ b/src/egl/drivers/dri2/platform_drm.c
> @@ -39,7 +39,19 @@
>  #include "egl_dri2.h"
>  #include "egl_dri2_fallbacks.h"
>  #include "loader.h"
> +static void* gbm_handle =NULL;
>
Nit: Please follow surrounding coding style - space on each side of =

> +/** Destroy the gbm device and free all resources associated with it.
> + *
> + * \param gbm The device created using gbm_create_device()
> + */
> +GBM_EXPORT void
> +gbm_device_destroy(struct gbm_device *gbm)
> +{
> +   gbm->refcount--;
> +   if (gbm->refcount == 0)
> +      gbm->destroy(gbm);
> +}
This is a _very_ bad idea. You're breaking GBM instead of moving the
call from egl_dri2.c here.
See my series for an example.


>  static struct gbm_bo *
>  lock_front_buffer(struct gbm_surface *_surf)
>  {
> @@ -169,11 +181,18 @@ dri2_drm_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
>     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
>
> +   void (* gbm_fp)();
>     dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
>
>     for (unsigned i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> -      if (dri2_surf->color_buffers[i].bo)
> -        gbm_bo_destroy(dri2_surf->color_buffers[i].bo);
> +      if (dri2_surf->color_buffers[i].bo){
> +         gbm_fp = dlsym(gbm_handle,"gbm_bo_destroy");
This will (and below) lead to a lot of unnecessary dlsym calls. You
can do it once, as mentioned above.


> @@ -660,6 +713,15 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
>
>     dri2_dpy->fd = -1;
>     disp->DriverData = (void *) dri2_dpy;
> +#if defined(__x86_64__)
> +   gbm_handle = dlopen("/usr/lib64/libgbm.so.1", RTLD_LAZY);
> +#else
> +   gbm_handle = dlopen("/usr/lib/libgbm.so.1", RTLD_LAZY);
Why are you hard coding the path? Please don't use LAZY -> LOCAL | NOW
is a wiser move.


> @@ -124,7 +126,8 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay)
>
>  #ifdef HAVE_DRM_PLATFORM
>        /* gbm has a pointer to its constructor as first element. */
Nit: Comment should be fixed up.

Thanks
Emil


More information about the mesa-dev mailing list