[Mesa-dev] [PATCH 2/2] gbm: Use libkms to work around missing cursor support in dri drivers

Jakob Bornecrantz jakob at vmware.com
Mon Aug 13 07:16:04 PDT 2012


Uses libkms to work around missing dri image cursor support. One could take
this patch one step futher and removing cursor surfaces entirely from the DRI
interface and as a consequence also from the Gallium interface. Tho to make
everybody happy with this it would probably require adding 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.

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    |   56 +++++++++++++++++++++++++++++++++----
 src/gbm/backends/dri/gbm_driint.h |    8 ++++++
 5 files changed, 63 insertions(+), 7 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2ecedaf..f5836d6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1355,6 +1355,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 f09f6ef..784bb93 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -301,11 +301,24 @@ 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;
+
+   /* This should be safe as write is guarded in create. */
+   if (bo->image != NULL)
+      return dri->image->write(bo->image, buf, count);
+
+   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 +327,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 +462,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 +470,33 @@ gbm_dri_bo_create(struct gbm_device *gbm,
    bo->base.base.width = width;
    bo->base.base.height = height;
 
+   if (dri->image->base.version < 4 && (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;
@@ -567,6 +607,10 @@ dri_device_create(int fd)
       return NULL;
    }
 
+   if (dri->image->base.version < 4) {
+      kms_create(fd, &dri->kms);
+   }
+
    return &dri->base.base;
 }
 
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



More information about the mesa-dev mailing list