initial commit
authorRob Clark <rob@ti.com>
Sat, 25 Feb 2012 17:00:29 +0000 (11:00 -0600)
committerRob Clark <rob@ti.com>
Sat, 10 Mar 2012 20:42:52 +0000 (14:42 -0600)
15 files changed:
.gitignore [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
README [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
backend.c [new file with mode: 0644]
backend.h [new file with mode: 0644]
backend_example.c [new file with mode: 0644]
common.c [new file with mode: 0644]
common.h [new file with mode: 0644]
common_drm.h [new file with mode: 0644]
configure.ac [new file with mode: 0644]
gbm.c [new file with mode: 0644]
gbm.h [new file with mode: 0644]
gbm.pc.in [new file with mode: 0644]
gbmint.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..3b7bfb9
--- /dev/null
@@ -0,0 +1,29 @@
+aclocal.m4
+autom4te.cache
+Makefile.in
+Makefile
+.deps
+.libs
+*.o
+*.lo
+*.la
+libtool
+*.pc
+config.log
+config.status
+config.guess
+config.h
+config.h.in
+config.sub
+config
+configure
+install-sh
+ltmain.sh
+missing
+stamp-h1
+depcomp
+.cproject
+.project
+.settings
+dri2test
+dri2videotest
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..740ea6e
--- /dev/null
@@ -0,0 +1,23 @@
+lib_LTLIBRARIES = libgbm.la
+
+libgbm_la_SOURCES =    \
+       gbm.c           \
+       backend.c       \
+       common.c
+
+libgbm_la_LIBADD =     \
+       @UDEV_LIBS@
+
+libgbm_la_CFLAGS =     \
+       @UDEV_CFLAGS@   \
+       -D_OS_UNIX=1    \
+       -DMODULEDIR='"$(exec_prefix)/lib/gbm"'
+
+extdir = $(includedir)/gbm
+ext_HEADERS =          \
+       gbm.h           \
+       gbmint.h        \
+       common_drm.h
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = gbm.pc
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..6ba18ef
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+This is the gbm frontend used by (for example) weston compositor to
+load the GLES stack, and retrieve the backing buffer objects behind
+an eglImage (created with EGL_WAYLAND_BUFFER_WL), etc.
+
+The frontend is really just a backend loader and shim.  The backend
+library must be provided by the GLES implementation.
+
+To get wayland up and running on your GLES stack:
+ 1) implement gbm backend
+ 2) implement EGL_WL_bind_wayland_display extension (including
+    EGL_WAYLAND_BUFFER_WL eglCreateImageKHR target
+    for compositor-drm it looks like we also need
+    EGL_KHR_surfaceless_gles2 extension..
+----
+<robclark> hmm, I don't suppose there is any extension description for EGL_KHR_surfaceless_gles2 ?
+<pq> robclark, it should simply mean you can eglMakeCurrent with NULL surface, but a real context.
+----
+ 3) implement wayland-egl (must provide wayland-egl.pc)
+ 4) ???
+ 5) PROFIT!!
+
+need this in your eglext.h:
+
+-------------------
+#ifndef EGL_WL_bind_wayland_display
+#define EGL_WL_bind_wayland_display 1
+
+#define EGL_WAYLAND_BUFFER_WL                  0x31D5 /* eglCreateImageKHR target */
+struct wl_display;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
+#endif
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
+#endif
+-------------------
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..904cd67
--- /dev/null
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+
+autoreconf -v --install || exit 1
+cd $ORIGDIR || exit $?
+
+$srcdir/configure --enable-maintainer-mode "$@"
diff --git a/backend.c b/backend.c
new file mode 100644 (file)
index 0000000..29d3151
--- /dev/null
+++ b/backend.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <dlfcn.h>
+
+#include "backend.h"
+
+#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
+
+/* a more clever scheme would be to discover backends in a certain
+ * directory..
+ */
+static const char *backends[] = {
+      "gbm_dri.so",
+      "gbm_gallium_drm.so",
+      "gbm_pvr.so",
+};
+
+static const void *
+load_backend(const char *name)
+{
+   char path[PATH_MAX];
+   void *module;
+   const char *entrypoint = "gbm_backend";
+
+   if (name[0] != '/')
+      snprintf(path, sizeof path, MODULEDIR "/%s", name);
+   else
+      snprintf(path, sizeof path, "%s", name);
+
+   module = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
+   if (!module) {
+      fprintf(stderr, "failed to load module: %s\n", dlerror());
+      return NULL;
+   }
+
+   return dlsym(module, entrypoint);
+}
+
+struct gbm_device *
+_gbm_create_device(int fd)
+{
+   const struct gbm_backend *backend = NULL;
+   struct gbm_device *dev = NULL;
+   int i;
+   const char *b;
+
+   b = getenv("GBM_BACKEND");
+   if (b)
+      backend = load_backend(b);
+
+   if (backend)
+      dev = backend->create_device(fd);
+
+   for (i = 0; i < ARRAY_SIZE(backends) && dev == NULL; ++i) {
+      backend = load_backend(backends[i]);
+      if (backend == NULL)
+         continue;
+      fprintf(stderr, "loaded module: %s\n", backends[i]);
+      dev = backend->create_device(fd);
+   }
+   
+   return dev;
+}
diff --git a/backend.h b/backend.h
new file mode 100644 (file)
index 0000000..4a64375
--- /dev/null
+++ b/backend.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#ifndef MODULE_H_
+#define MODULE_H_
+
+#include "gbmint.h"
+
+struct gbm_device *
+_gbm_create_device(int fd);
+
+#endif
diff --git a/backend_example.c b/backend_example.c
new file mode 100644 (file)
index 0000000..3854d6e
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2012 Texas Instruments
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Rob Clark <rob.clark@linaro.org>
+ */
+
+/* This is an example/skeletal backend implementation.. this file isn't
+ * actually built as part of libgbm, but just intended to be a template
+ * to help in creating a new gbm backend
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <limits.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <dlfcn.h>
+
+#include "gbmint.h"
+#include "common_drm.h"
+
+struct gbm_example_device {
+   struct gbm_drm_device base;
+   /* add whatever you need here */
+};
+
+struct gbm_example_bo {
+   struct gbm_drm_bo base;
+   /* add whatever you need here */
+};
+
+
+static int
+gles_init(struct gbm_example_device *dev)
+{
+   /* this should open/initialize the GLES stack.. for a DRM driver
+    * at least, dev->base.base.fd will have the already opened device
+    */
+   return 0;
+}
+
+static int
+gbm_example_is_format_supported(struct gbm_device *gbm,
+      enum gbm_bo_format format, uint32_t usage)
+{
+   return 0;
+}
+
+static void
+gbm_example_bo_destroy(struct gbm_bo *_bo)
+{
+}
+
+static struct gbm_bo *
+gbm_example_bo_create_from_egl_image(struct gbm_device *gbm, void *egl_dpy,
+      void *egl_img, uint32_t width, uint32_t height, uint32_t usage)
+{
+   /* eglimg is created w/  (see weston_buffer_attach()):
+    *
+    *   struct wl_buffer *buffer = ...;
+    *   eglCreateImageKHR(display, NULL, EGL_WAYLAND_BUFFER_WL, buffer, NULL);
+    */
+
+   return NULL;
+}
+
+static struct gbm_bo *
+gbm_example_bo_create(struct gbm_device *gbm, uint32_t width, uint32_t height,
+      enum gbm_bo_format format, uint32_t usage)
+{
+   return NULL;
+}
+
+static void
+gbm_example_destroy(struct gbm_device *gbm)
+{
+}
+
+static struct gbm_device *
+example_device_create(int fd)
+{
+   struct gbm_example_device *dev;
+   int ret;
+
+   dev = calloc(1, sizeof *dev);
+
+   dev->base.base.fd = fd;
+   dev->base.base.bo_create = gbm_example_bo_create;
+   dev->base.base.bo_create_from_egl_image = gbm_example_bo_create_from_egl_image;
+   dev->base.base.is_format_supported = gbm_example_is_format_supported;
+   dev->base.base.bo_destroy = gbm_example_bo_destroy;
+   dev->base.base.destroy = gbm_example_destroy;
+
+   dev->base.type = GBM_DRM_DRIVER_TYPE_CUSTOM;
+   dev->base.base.name = "example";
+
+   ret = gles_init(dev);
+   if (ret) {
+      free(dev);
+      return NULL;
+   }
+
+   return &dev->base.base;
+}
+
+/* backend loader looks for symbol "gbm_backend" */
+struct gbm_backend gbm_backend = {
+   .backend_name = "example",
+   .create_device = example_device_create,
+};
diff --git a/common.c b/common.c
new file mode 100644 (file)
index 0000000..f02162d
--- /dev/null
+++ b/common.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <libudev.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "gbmint.h"
+
+GBM_EXPORT struct udev_device *
+_gbm_udev_device_new_from_fd(struct udev *udev, int fd)
+{
+   struct udev_device *device;
+   struct stat buf;
+
+   if (fstat(fd, &buf) < 0) {
+      fprintf(stderr, "gbm: failed to stat fd %d", fd);
+      return NULL;
+   }
+
+   device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev);
+   if (device == NULL) {
+      fprintf(stderr,
+              "gbm: could not create udev device for fd %d", fd);
+      return NULL;
+   }
+
+   return device;
+}
+
+GBM_EXPORT char *
+_gbm_fd_get_device_name(int fd)
+{
+   struct udev *udev;
+   struct udev_device *device;
+   const char *const_device_name;
+   char *device_name = NULL;
+
+   udev = udev_new();
+   device = _gbm_udev_device_new_from_fd(udev, fd);
+   if (device == NULL)
+      return NULL;
+
+   const_device_name = udev_device_get_devnode(device);
+   if (!const_device_name)
+      goto out;
+   device_name = strdup(const_device_name);
+
+out:
+   udev_device_unref(device);
+   udev_unref(udev);
+
+   return device_name;
+}
+
+GBM_EXPORT void
+_gbm_log(const char *fmt_str, ...)
+{
+}
diff --git a/common.h b/common.h
new file mode 100644 (file)
index 0000000..1fcdfca
--- /dev/null
+++ b/common.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#ifndef _COMMON_H_
+#define _COMMON_H_
+
+#include <libudev.h>
+
+struct udev_device *
+_gbm_udev_device_new_from_fd(struct udev *udev, int fd);
+
+char *
+_gbm_fd_get_device_name(int fd);
+
+void
+_gbm_log(const char *fmt_str, ...);
+
+#endif
diff --git a/common_drm.h b/common_drm.h
new file mode 100644 (file)
index 0000000..6b2f74d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#ifndef _COMMON_DRM_H_
+#define _COMMON_DRM_H_
+
+#include "gbmint.h"
+
+enum gbm_drm_driver_type {
+   GBM_DRM_DRIVER_TYPE_DRI,
+   GBM_DRM_DRIVER_TYPE_GALLIUM,
+   GBM_DRM_DRIVER_TYPE_CUSTOM,    /* catch-all for non-mesa drivers */
+};
+
+struct gbm_drm_device {
+   struct gbm_device base;
+   enum gbm_drm_driver_type type;
+   char *driver_name;
+};
+
+struct gbm_drm_bo {
+   struct gbm_bo base;
+};
+
+#endif
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..2739092
--- /dev/null
@@ -0,0 +1,42 @@
+#
+#  Copyright 2005 Red Hat, Inc.
+#
+#  Permission to use, copy, modify, distribute, and sell this software and its
+#  documentation for any purpose is hereby granted without fee, provided that
+#  the above copyright notice appear in all copies and that both that
+#  copyright notice and this permission notice appear in supporting
+#  documentation, and that the name of Red Hat not be used in
+#  advertising or publicity pertaining to distribution of the software without
+#  specific, written prior permission.  Red Hat makes no
+#  representations about the suitability of this software for any purpose.  It
+#  is provided "as is" without express or implied warranty.
+#
+#  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+#  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+#  EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+#  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+#  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+#  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+#  PERFORMANCE OF THIS SOFTWARE.
+#
+
+# Initialize Autoconf
+AC_PREREQ([2.60])
+AC_INIT([libgbm], [1.0.0],
+        [https://bugs.freedesktop.org/enter_bug.cgi?product=wayland], [libgbm])
+AC_CONFIG_SRCDIR([Makefile.am])
+AC_CONFIG_HEADERS([config.h])
+
+# Initialize Automake
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Initialize libtool
+AC_PROG_LIBTOOL
+
+# Obtain compiler/linker options for dependencies
+PKG_CHECK_MODULES(UDEV, udev)
+PKG_CHECK_MODULES(DRM, libdrm)
+
+AC_CONFIG_FILES([Makefile gbm.pc])
+AC_OUTPUT
diff --git a/gbm.c b/gbm.c
new file mode 100644 (file)
index 0000000..8440b2c
--- /dev/null
+++ b/gbm.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#define _BSD_SOURCE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "gbm.h"
+#include "gbmint.h"
+#include "common.h"
+#include "backend.h"
+
+#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
+
+struct gbm_device *devices[16];
+
+static int device_num = 0;
+
+GBM_EXPORT int
+gbm_device_get_fd(struct gbm_device *gbm)
+{
+   return gbm->fd;
+}
+
+/* FIXME: maybe superfluous, use udev subclass from the fd? */
+GBM_EXPORT const char *
+gbm_device_get_backend_name(struct gbm_device *gbm)
+{
+   return gbm->name;
+}
+
+int
+gbm_device_is_format_supported(struct gbm_device *gbm,
+                               enum gbm_bo_format format,
+                               uint32_t usage)
+{
+   return gbm->is_format_supported(gbm, format, usage);
+}
+
+GBM_EXPORT void
+gbm_device_destroy(struct gbm_device *gbm)
+{
+   gbm->refcount--;
+   if (gbm->refcount == 0)
+      gbm->destroy(gbm);
+}
+
+GBM_EXPORT struct gbm_device *
+_gbm_mesa_get_device(int fd)
+{
+   struct gbm_device *gbm = NULL;
+   struct stat buf;
+   dev_t dev;
+   int i;
+
+   if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISCHR(buf.st_mode)) {
+      fprintf(stderr, "_gbm_mesa_get_device: invalid fd: %d\n", fd);
+      return NULL;
+   }
+
+   for (i = 0; i < device_num; ++i) {
+      dev = devices[i]->stat.st_rdev;
+      if (major(dev) == major(buf.st_rdev) &&
+          minor(dev) == minor(buf.st_rdev)) {
+         gbm = devices[i];
+         gbm->refcount++;
+         break;
+      }
+   }
+
+   return gbm;
+}
+
+GBM_EXPORT struct gbm_device *
+gbm_create_device(int fd)
+{
+   struct gbm_device *gbm = NULL;
+   struct stat buf;
+
+   if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISCHR(buf.st_mode)) {
+      fprintf(stderr, "gbm_create_device: invalid fd: %d\n", fd);
+      return NULL;
+   }
+
+   if (device_num == 0)
+      memset(devices, 0, sizeof devices);
+
+   gbm = _gbm_create_device(fd);
+   if (gbm == NULL)
+      return NULL;
+
+   gbm->dummy = gbm_create_device;
+   gbm->stat = buf;
+   gbm->refcount = 1;
+
+   if (device_num < ARRAY_SIZE(devices)-1)
+      devices[device_num++] = gbm;
+
+   return gbm;
+}
+
+GBM_EXPORT unsigned int
+gbm_bo_get_width(struct gbm_bo *bo)
+{
+   return bo->width;
+}
+
+GBM_EXPORT unsigned int
+gbm_bo_get_height(struct gbm_bo *bo)
+{
+   return bo->height;
+}
+
+GBM_EXPORT uint32_t
+gbm_bo_get_pitch(struct gbm_bo *bo)
+{
+   return bo->pitch;
+}
+
+GBM_EXPORT union gbm_bo_handle
+gbm_bo_get_handle(struct gbm_bo *bo)
+{
+   return bo->handle;
+}
+
+GBM_EXPORT void
+gbm_bo_destroy(struct gbm_bo *bo)
+{
+   bo->gbm->bo_destroy(bo);
+}
+
+GBM_EXPORT struct gbm_bo *
+gbm_bo_create(struct gbm_device *gbm,
+              uint32_t width, uint32_t height,
+              enum gbm_bo_format format, uint32_t usage)
+{
+   if (width == 0 || height == 0)
+      return NULL;
+
+   if (usage & GBM_BO_USE_CURSOR_64X64 &&
+       (width != 64 || height != 64))
+      return NULL;
+
+   return gbm->bo_create(gbm, width, height, format, usage);
+}
+
+GBM_EXPORT struct gbm_bo *
+gbm_bo_create_from_egl_image(struct gbm_device *gbm,
+                             void *egl_dpy, void *egl_image,
+                             uint32_t width, uint32_t height,
+                             uint32_t usage)
+{
+   if (width == 0 || height == 0)
+      return NULL;
+
+   return gbm->bo_create_from_egl_image(gbm, egl_dpy, egl_image,
+                                        width, height, usage);
+}
diff --git a/gbm.h b/gbm.h
new file mode 100644 (file)
index 0000000..05d2292
--- /dev/null
+++ b/gbm.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#ifndef _GBM_H_
+#define _GBM_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define __GBM__ 1
+
+#include <stdint.h>
+
+struct gbm_device;
+struct gbm_bo;
+
+union gbm_bo_handle {
+   void *ptr;
+   int32_t s32;
+   uint32_t u32;
+   int64_t s64;
+   uint64_t u64;
+};
+
+enum gbm_bo_format {
+   GBM_BO_FORMAT_XRGB8888,
+   GBM_BO_FORMAT_ARGB8888,
+};
+
+enum gbm_bo_flags {
+   GBM_BO_USE_SCANOUT      = (1 << 0),
+   GBM_BO_USE_CURSOR_64X64 = (1 << 1),
+   GBM_BO_USE_RENDERING    = (1 << 2),
+};
+
+int
+gbm_device_get_fd(struct gbm_device *gbm);
+
+const char *
+gbm_device_get_backend_name(struct gbm_device *gbm);
+
+int
+gbm_device_is_format_supported(struct gbm_device *gbm,
+                               enum gbm_bo_format format,
+                               uint32_t usage);
+
+void
+gbm_device_destroy(struct gbm_device *gbm);
+
+struct gbm_device *
+gbm_create_device(int fd);
+
+struct gbm_bo *
+gbm_bo_create(struct gbm_device *gbm,
+              uint32_t width, uint32_t height,
+              enum gbm_bo_format format, uint32_t flags);
+
+struct gbm_bo *
+gbm_bo_create_from_egl_image(struct gbm_device *gbm,
+                             void *egl_dpy, void *egl_img,
+                             uint32_t width, uint32_t height,
+                             uint32_t usage);
+
+uint32_t
+gbm_bo_get_width(struct gbm_bo *bo);
+
+uint32_t
+gbm_bo_get_height(struct gbm_bo *bo);
+
+uint32_t
+gbm_bo_get_pitch(struct gbm_bo *bo);
+
+union gbm_bo_handle
+gbm_bo_get_handle(struct gbm_bo *bo);
+
+void
+gbm_bo_destroy(struct gbm_bo *bo);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gbm.pc.in b/gbm.pc.in
new file mode 100644 (file)
index 0000000..1234841
--- /dev/null
+++ b/gbm.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gbm
+Description: gbm library
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lgbm
+Cflags: -I${includedir}/gbm
diff --git a/gbmint.h b/gbmint.h
new file mode 100644 (file)
index 0000000..fb8db80
--- /dev/null
+++ b/gbmint.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2011 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Benjamin Franzke <benjaminfranzke@googlemail.com>
+ */
+
+#ifndef INTERNAL_H_
+#define INTERNAL_H_
+
+#include "gbm.h"
+#include <sys/stat.h>
+
+/* GCC visibility */
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define GBM_EXPORT __attribute__ ((visibility("default")))
+#else
+#define GBM_EXPORT
+#endif
+
+struct gbm_device {
+   /* Hack to make a gbm_device detectable by its first element. */
+   struct gbm_device *(*dummy)(int);
+
+   int fd;
+   const char *name;
+   unsigned int refcount;
+   struct stat stat;
+
+   void (*destroy)(struct gbm_device *gbm);
+   int (*is_format_supported)(struct gbm_device *gbm,
+                              enum gbm_bo_format format,
+                              uint32_t usage);
+
+   struct gbm_bo *(*bo_create)(struct gbm_device *gbm,
+                               uint32_t width, uint32_t height,
+                               enum gbm_bo_format format,
+                               uint32_t usage);
+   struct gbm_bo *(*bo_create_from_egl_image)(struct gbm_device *gbm,
+                                              void *egl_dpy, void *egl_img,
+                                              uint32_t width, uint32_t height,
+                                              uint32_t usage);
+   void (*bo_destroy)(struct gbm_bo *bo);
+};
+
+struct gbm_bo {
+   struct gbm_device *gbm;
+   uint32_t width;
+   uint32_t height;
+   uint32_t pitch;
+   union gbm_bo_handle  handle;
+};
+
+struct gbm_backend {
+   const char *backend_name;
+   struct gbm_device *(*create_device)(int fd);
+};
+
+GBM_EXPORT struct gbm_device *
+_gbm_mesa_get_device(int fd);
+
+#endif