On Wed, Aug 22, 2012 at 8:14 AM, Jakob Bornecrantz <ja...@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 <ore...@gmail.com> > Signed-off-by: Jakob Bornecrantz <ja...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev