[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