gbm: Use libkms to replace DRI cursor images
authorJakob Bornecrantz <jakob@vmware.com>
Mon, 13 Aug 2012 13:55:23 +0000 (15:55 +0200)
committerJakob Bornecrantz <jakob@vmware.com>
Sun, 26 Aug 2012 13:39:23 +0000 (15:39 +0200)
Uses libkms instead of dri image cursor. Since this is the only user of the
DRI cursor and 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.

The only downside is that it adds a dependancy on libkms, this could how ever
be replaced with the dumb_bo drm ioctl interface.

Tested-by: Scott Moreau <oreaus@gmail.com>
Signed-off-by: Jakob Bornecrantz <jakob@vmware.com>
configure.ac
src/egl/drivers/dri2/Makefile.am
src/gbm/Makefile.am
src/gbm/backends/dri/gbm_dri.c
src/gbm/backends/dri/gbm_driint.h

index 6ff2aed71335052ca4868da3221d3add2d7436c6..97e53b3504a4be8f87ec4e0d23857649a1968197 100644 (file)
@@ -1226,6 +1226,8 @@ if test "x$enable_gbm" = xyes; then
         if test "x$enable_shared_glapi" = xno; 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"
index 49ec06bbec7bd019233a2bb0c81e812828e6424e..45f7dfa4b02d93bbf8f5259ed6befd8b2b0c6e68 100644 (file)
@@ -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
index f079da167432999acb41138530c12fb35f30a65f..e22c55cfdace63ec72066fb9e21f5620cab81671 100644 (file)
@@ -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
index 5c332d48809a78ae92cb25f0adae7ff198a98715..47874aede9c48794ba27c86407c5b1466fb99c4a 100644 (file)
@@ -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 = {
index f4043683f11dc1fdf048a31ccff69bc4c10fab0f..4b619a0e59ea204ab22ecf5ba70324e7dc498cf6 100644 (file)
@@ -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 {