[Mesa-dev] [PATCH 1/6] gbm: Use libkms to replace DRI cursor images

Dave Airlie airlied at gmail.com
Mon Aug 27 12:23:16 PDT 2012


On Wed, Aug 22, 2012 at 8:14 AM, Jakob Bornecrantz <jakob at vmware.com> wrote:
> Uses libkms instead of dri image cursor. Since this is the only user of the DRI
> cursor and the write interface we can remove cursor surfaces entirely from the
> DRI interface and as a consequence also from the Gallium interface as well. Tho
> to make everybody happy with this it would probably should add a kms_bo_write
> function, but that is probably wise in anyways.

Please no, no libkms deps at all, just use the dumb_bo interface, if
your kernel driver
sucks fix it, adding a pointless depend that we have to maintain isn't
help anyone.

Dave.
>
> The only downside is that it adds a dependancy on libkms, this could however be
> replaced with the dumb_bo drm ioctl interface.
>
> Tested-by: Scott Moreau <oreaus at gmail.com>
> Signed-off-by: Jakob Bornecrantz <jakob at vmware.com>
> ---
>  configure.ac                      |    2 ++
>  src/egl/drivers/dri2/Makefile.am  |    1 +
>  src/gbm/Makefile.am               |    3 +-
>  src/gbm/backends/dri/gbm_dri.c    |   65 ++++++++++++++++++++++++++++++-------
>  src/gbm/backends/dri/gbm_driint.h |    8 +++++
>  5 files changed, 67 insertions(+), 12 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 7dac091..190d71f 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1298,6 +1298,8 @@ if test "x$enable_gbm" = xyes; then
>          if test "$SHARED_GLAPI" -eq 0; then
>              AC_MSG_ERROR([gbm_dri requires --enable-shared-glapi])
>          fi
> +        PKG_CHECK_MODULES([LIBKMS], [libkms], [],
> +                          AC_MSG_ERROR([gbm needs libkms]))
>      fi
>  fi
>  GBM_PC_REQ_PRIV="libudev"
> diff --git a/src/egl/drivers/dri2/Makefile.am b/src/egl/drivers/dri2/Makefile.am
> index 49ec06b..45f7dfa 100644
> --- a/src/egl/drivers/dri2/Makefile.am
> +++ b/src/egl/drivers/dri2/Makefile.am
> @@ -30,6 +30,7 @@ AM_CFLAGS = \
>         $(DEFINES) \
>         $(LIBDRM_CFLAGS) \
>         $(LIBUDEV_CFLAGS) \
> +       $(LIBKMS_CFLAGS) \
>         -DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\"
>
>  noinst_LTLIBRARIES = libegl_dri2.la
> diff --git a/src/gbm/Makefile.am b/src/gbm/Makefile.am
> index f079da1..e22c55c 100644
> --- a/src/gbm/Makefile.am
> +++ b/src/gbm/Makefile.am
> @@ -7,6 +7,7 @@ AM_CFLAGS = \
>         -I$(top_srcdir)/include \
>         -I$(top_srcdir)/src/gbm/main \
>         $(LIBUDEV_CFLAGS) \
> +       $(LIBKMS_CFLAGS) \
>         $(DLOPEN_CFLAGS) \
>         $(DEFINES)
>
> @@ -18,7 +19,7 @@ libgbm_la_SOURCES = \
>         main/backend.c \
>         main/common.c
>  libgbm_la_LDFLAGS = -version-info 1:0
> -libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(DLOPEN_LIBS)
> +libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(LIBKMS_LIBS) $(DLOPEN_LIBS)
>
>  if HAVE_EGL_PLATFORM_WAYLAND
>  AM_CPPFLAGS = -DHAVE_WAYLAND_PLATFORM
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index 5c332d4..47874ae 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -299,13 +299,21 @@ gbm_dri_is_format_supported(struct gbm_device *gbm,
>  static int
>  gbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count)
>  {
> -   struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
>     struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
> +   void *ptr;
> +   int ret;
> +
> +   if (bo->bo == NULL)
> +      return -1;
>
> -   if (dri->image->base.version < 4)
> +   ret = kms_bo_map(bo->bo, &ptr);
> +   if (ret < 0)
>        return -1;
>
> -   return dri->image->write(bo->image, buf, count);
> +   memcpy(ptr, buf, count);
> +
> +   kms_bo_unmap(bo->bo);
> +   return 0;
>  }
>
>  static void
> @@ -314,7 +322,10 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
>     struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
>     struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
>
> -   dri->image->destroyImage(bo->image);
> +   if (bo->image != NULL)
> +      dri->image->destroyImage(bo->image);
> +   if (bo->bo != NULL)
> +      kms_bo_destroy(&bo->bo);
>     free(bo);
>  }
>
> @@ -446,9 +457,6 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>     int dri_format;
>     unsigned dri_use = 0;
>
> -   if (dri->image->base.version < 4 && (usage & GBM_BO_USE_WRITE))
> -      return NULL;
> -
>     bo = calloc(1, sizeof *bo);
>     if (bo == NULL)
>        return NULL;
> @@ -457,6 +465,33 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>     bo->base.base.width = width;
>     bo->base.base.height = height;
>
> +   if (usage & GBM_BO_USE_WRITE) {
> +      int ret;
> +      unsigned attrs[7] = {
> +         KMS_WIDTH, 64,
> +         KMS_HEIGHT, 64,
> +         KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
> +         KMS_TERMINATE_PROP_LIST,
> +      };
> +
> +      if (!(usage & GBM_BO_USE_CURSOR_64X64))
> +         return NULL;
> +
> +      if (dri->kms == NULL)
> +         return NULL;
> +
> +      ret = kms_bo_create(dri->kms, attrs, &bo->bo);
> +      if (ret < 0) {
> +         free(bo);
> +         return NULL;
> +      }
> +
> +      kms_bo_get_prop(bo->bo, KMS_PITCH, &bo->base.base.stride);
> +      kms_bo_get_prop(bo->bo, KMS_HANDLE, (unsigned*)&bo->base.base.handle);
> +
> +      return &bo->base.base;
> +   }
> +
>     switch (format) {
>     case GBM_FORMAT_RGB565:
>        dri_format =__DRI_IMAGE_FORMAT_RGB565;
> @@ -564,13 +599,21 @@ dri_device_create(int fd)
>     dri->base.type = GBM_DRM_DRIVER_TYPE_DRI;
>     dri->base.base.name = "drm";
>
> +   kms_create(fd, &dri->kms);
> +   if (dri->kms == NULL)
> +      goto err_kms;
> +
>     ret = dri_screen_create(dri);
> -   if (ret) {
> -      free(dri);
> -      return NULL;
> -   }
> +   if (ret)
> +      goto err_dri;
>
>     return &dri->base.base;
> +
> +err_dri:
> +   kms_destroy(&dri->kms);
> +err_kms:
> +   free(dri);
> +   return NULL;
>  }
>
>  struct gbm_backend gbm_dri_backend = {
> diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h
> index f404368..4b619a0 100644
> --- a/src/gbm/backends/dri/gbm_driint.h
> +++ b/src/gbm/backends/dri/gbm_driint.h
> @@ -30,6 +30,8 @@
>
>  #include "gbmint.h"
>
> +#include "libkms.h"
> +
>  #include "common.h"
>  #include "common_drm.h"
>
> @@ -41,6 +43,9 @@ struct gbm_dri_surface;
>  struct gbm_dri_device {
>     struct gbm_drm_device base;
>
> +   /* Only used for cursors */
> +   struct kms_driver *kms;
> +
>     void *driver;
>
>     __DRIscreen *screen;
> @@ -72,6 +77,9 @@ struct gbm_dri_bo {
>     struct gbm_drm_bo base;
>
>     __DRIimage *image;
> +
> +   /* Only used for cursors */
> +   struct kms_bo *bo;
>  };
>
>  struct gbm_dri_surface {
> --
> 1.7.9.5
>
> _______________________________________________
> 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