[GLP] Libdce linux implementation
authorSathishkumar <x0203598@ti.com>
Tue, 30 Jul 2013 05:50:14 +0000 (11:20 +0530)
committerSaurabh Bipin Chandra <a0131926@ti.com>
Tue, 27 Aug 2013 21:12:42 +0000 (02:42 +0530)
make install & libdce.c issue fix

1. make install has been fixed. libdce.h will be installed in /usr/include,
   libdce.so files in /usr/lib and libdce.pc in /usr/lib/pkgconfig on using
   --prefix=/usr. By default the prefix is /usr/local.
2. init and deinit calls are removed from libdce.h
3. dce_set_fd and dce_get_fd calls are implemented in libdce.c
4. configure.ac checks for libmmrpc and makefile.am modified to link with libmmrpc.

configure.ac and makefile.am modified

1. Codec_engine,xdctolls,framework_components,ipc,xdctools and xdaias paths needs
   to be exported. Configure.ac checks for the exported paths.
2. Makefile.am is modified to have the exported paths in the include directories list
   for the compiler.

Modifications done after review

1. Comments added in memplugin_linux.c. White spaces removed manually and cleaned up
   libdce.c, memplugin.h. dce_priv.h is modified to have File and line number in the
   logs. linux/dce.h file is removed.

Libdce modifications for linux

Linux Specific libdce functionality added.
1. memplugin calls specific to linux are added in memplugin_linux.c
2. Error and debug logs implementation for linux in dce_priv.h
3. xll and wayland specific files are moved to linux folder

Change-Id: Ib41e6a52d902376cdabbb939dee7585944720d92
Signed-off-by: Saurabh Bipin Chandra <a0131926@ti.com>
Signed-off-by: Sathishkumar <x0203598@ti.com>
12 files changed:
Makefile.am [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
configure.ac [new file with mode: 0644]
dce_priv.h
libdce.c
libdce.h
libdce.pc.in [new file with mode: 0644]
linux/libdce-x11.c [new file with mode: 0644]
linux/wayland-drm-client-protocol.h [new file with mode: 0644]
linux/wayland-drm-protocol.c [new file with mode: 0644]
memplugin.h
memplugin_linux.c [new file with mode: 0644]

diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..93d14d4
--- /dev/null
@@ -0,0 +1,34 @@
+## Process this file with automake to produce Makefile.in
+
+
+lib_LTLIBRARIES              = libdce.la
+
+
+CE_CFLAGS                    = \
+                               -I$(CODEC_ENGINE)/ \
+                               -I$(FRAMEWORK_COMPONENTS) \
+                               -I$(IVAHD_CODECS) \
+                               -I$(XDAIAS) \
+                               -I$(XDCTOOLS)/ \
+                               -I$(IPC)/packages/ti/ipc/mm \
+                               -DBUILDOS_LINUX=1 \
+                               -Wno-pointer-to-int-cast
+
+
+libdce_la_SOURCES            = libdce.c memplugin_linux.c
+libdce_la_CFLAGS             = $(WARN_CFLAGS) $(CE_CFLAGS) $(DRM_CFLAGS) $(X11_CFLAGS) $(WAYLAND_CFLAGS)
+libdce_la_LDFLAGS            = -no-undefined -version-info 1:0:0
+libdce_la_LIBADD             = $(DRM_LIBS) $(X11_LIBS) $(WAYLAND_LIBS) $(MMRPC_LIBS)
+
+if ENABLE_X11
+libdce_la_SOURCES           += linux/libdce-x11.c
+endif
+if ENABLE_WAYLAND
+libdce_la_SOURCES           += linux/libdce-wayland.c linux/wayland-drm-protocol.c
+endif
+
+libdce_la_includedir         = $(includedir)
+libdce_la_include_HEADERS    = libdce.h
+
+pkgconfig_DATA               = libdce.pc
+pkgconfigdir                 = $(libdir)/pkgconfig
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..0cf21bc
--- /dev/null
@@ -0,0 +1,31 @@
+#! /bin/sh
+
+cd `dirname $0`
+
+# on some platforms, you have "g" versions of some of these tools instead,
+# ie glibtoolize instead of libtoolize..
+find_tool() {
+       which $1 2> /dev/null || which g$1 2> /dev/null
+}
+
+aclocal=`find_tool aclocal`
+libtoolize=`find_tool libtoolize`
+automake=`find_tool automake`
+autoconf=`find_tool autoconf`
+
+mkdir -p config && $aclocal && $libtoolize --copy --force && $automake --copy --add-missing --foreign && $autoconf
+
+test -n "$NOCONFIGURE" && {
+  echo "skipping configure stage as requested."
+  echo "autogen.sh done."
+  exit 0
+}
+
+CONFIGURE_DEF_OPT="--enable-maintainer-mode"
+echo ./configure $CONFIGURE_DEF_OPT $*
+./configure $CONFIGURE_DEF_OPT $* || {
+        echo "  configure failed"
+        exit 1
+}
+
+echo "Now type 'make' to compile"
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..72430cb
--- /dev/null
@@ -0,0 +1,148 @@
+AC_PREREQ(2.52)
+
+dnl initialize autoconf
+AC_INIT([libdce], [1.0.0], [http://www.ti.com])
+
+dnl define PACKAGE_VERSION_* variables
+dnl AS_VERSION
+
+dnl can autoconf find the source ?
+AC_CONFIG_SRCDIR([libdce.c])
+
+dnl set the autotools aux directory
+AC_CONFIG_AUX_DIR([config])
+
+dnl AM_MAINTAINER_MODE only provides the option to configure to enable it
+AM_MAINTAINER_MODE
+
+dnl sets host_*, target_ variables
+AC_CANONICAL_SYSTEM
+
+dnl initialize automake
+AM_INIT_AUTOMAKE([foreign])
+
+dnl use pretty build output with automake >= 1.11
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],
+  [AM_DEFAULT_VERBOSITY=1
+   AC_SUBST(AM_DEFAULT_VERBOSITY)])
+
+dnl find a compiler
+AC_PROG_CC
+AM_PROG_AS
+AM_PROG_LIBTOOL
+
+dnl *** autotools stuff ***
+dnl allow for different autotools
+dnl AS_AUTOTOOLS_ALTERNATE
+
+dnl *** checks for platform ***
+AC_DEFINE_UNQUOTED(CPU_`echo $target_cpu | tr a-z- A-Z_`,[1])
+AC_DEFINE_UNQUOTED(OS_` echo $target_os  | tr a-z- A-Z_`,[1])
+
+dnl *** checks for programs ***
+AC_PROG_INSTALL
+
+dnl Check for pkgconfig first
+AC_CHECK_PROG([HAVE_PKGCONFIG], [pkg-config], [yes], [no])
+
+dnl *** checks for libraries ***
+dnl Check for libdrm
+PKG_CHECK_MODULES(DRM, libdrm libdrm_omap)
+
+dnl *** checks for libraries ***
+dnl Check for libmmrpc
+PKG_CHECK_MODULES(MMRPC, libmmrpc)
+
+dnl Check for X11/libdri2
+PKG_CHECK_MODULES(X11, x11 dri2, [HAVE_X11=yes], [HAVE_X11=no])
+if test "x$HAVE_X11" = "xyes"; then
+  AC_DEFINE(HAVE_X11, 1, [Have X11 support])
+else
+  AC_MSG_WARN([Building without X11 support])
+fi
+AM_CONDITIONAL(ENABLE_X11, [test "x$HAVE_X11" = xyes])
+
+dnl Check for wayland
+PKG_CHECK_MODULES(WAYLAND, wayland-client >= 0.95.0, [HAVE_WAYLAND=yes], [HAVE_WAYLAND=no])
+if test "x$HAVE_WAYLAND" = "xyes"; then
+  AC_DEFINE(HAVE_WAYLAND, 1, [Have Wayland support])
+else
+  AC_MSG_WARN([Building without Wayland support])
+fi
+AM_CONDITIONAL(ENABLE_WAYLAND, [test "x$HAVE_WAYLAND" = xyes])
+
+dnl *** checks for header files ***
+dnl check if we have ANSI C header files
+AC_HEADER_STDC
+
+dnl *** checks for types/defines ***
+
+dnl *** checks for structures ***
+
+dnl *** checks for compiler characteristics ***
+
+dnl *** checks for library functions ***
+
+dnl *** checks for dependancy libraries ***
+
+dnl *** set variables based on configure arguments ***
+
+
+if test "$CODEC_ENGINE" != "" ; then
+       AC_MSG_NOTICE([Checking component : CODEC_ENGINE])
+       AC_CHECK_FILES(["$CODEC_ENGINE"],,[AC_MSG_ERROR(["$CODEC_ENGINE" not found Set path variable CODEC_ENGINE])])
+       AC_SUBST(CODEC_ENGINE)
+else
+       AC_MSG_ERROR([Set path variable CODEC_ENGINE])
+fi
+
+if test "$FRAMEWORK_COMPONENTS" != "" ; then
+       AC_MSG_NOTICE([Checking component : FRAMEWORK_COMPONENTS])
+        AC_CHECK_FILES(["$FRAMEWORK_COMPONENTS"],,[AC_MSG_ERROR(["$FRAMEWORK_COMPONENTS" not found Set path variable FRAMEWORK_COMPONENTS])])
+       AC_SUBST(FRAMEWORK_COMPONENTS)
+else
+        AC_MSG_ERROR([Set path variable FRAMEWORK_COMPONENTS])
+fi
+
+if test "$IVAHD_CODECS" != "" ; then
+       AC_MSG_NOTICE([Checking component : IVAHD_CODECS])
+        AC_CHECK_FILES(["$IVAHD_CODECS"],,[AC_MSG_ERROR(["$IVAHD_CODECS" not fou nd Set path variable IVAHD_CODECS])])
+       AC_SUBST(IVAHD_CODECS)
+else
+        AC_MSG_ERROR([Set path variable IVAHD_CODECS])
+fi
+
+if test "$XDAIAS" != "" ; then
+       AC_MSG_NOTICE([Checking component : XDAIAS])
+        AC_CHECK_FILES(["$XDAIAS"],,[AC_MSG_ERROR(["$XDAIAS" not found Set path variable XDAIAS])])
+       AC_SUBST(XDAIAS)
+else
+        AC_MSG_ERROR([Set path variable XDAIAS])
+fi
+
+if test "$XDCTOOLS" != "" ; then
+        AC_MSG_NOTICE([Checking component : XDCTOOLS])
+        AC_CHECK_FILES(["$XDCTOOLS"],,[AC_MSG_ERROR(["$XDCTOOLS" not found Set path variable XDCTOOLS])])
+       AC_SUBST(XDCTOOLS)
+else
+        AC_MSG_ERROR([Set path variable XDCTOOLS])
+fi
+
+if test "$IPC" != "" ; then
+        AC_MSG_NOTICE([Checking component : IPC])
+        AC_CHECK_FILES(["$IPC"],,[AC_MSG_ERROR(["$IPC" not found Set path variable IPC])])
+        AC_SUBST(IPC)
+else
+        AC_MSG_ERROR([Set path variable IPC])
+fi
+
+
+
+
+
+
+AC_CONFIG_FILES([
+libdce.pc
+Makefile
+])
+AC_OUTPUT
index dea43d46bc6d11f91c23814e0c35262a69b2a889..7f2624fbf7aa35fca73e7095db9c855149d2ee4b 100644 (file)
 #ifndef __DCE_PRIV_H__
 #define __DCE_PRIV_H__
 
+
+#ifdef BUILDOS_QNX
 #include <sys/slog.h>
 
+
 /********************* MACROS ************************/
 /***************** TRACE MACROS  *********************/
 /* Need to make it OS specific and support different trace levels */
 #define DEBUG(FMT, ...)  do { \
         slogf(42, _SLOG_DEBUG2, "%s:%d:\t%s\tdebug: " FMT, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
 } while( 0 )
+#endif
 
+#ifdef BUILDOS_LINUX
+#define ERROR(FMT, ...) do { \
+       printf("%s:%d:\t%s\t Error: "FMT,__FILE__, __LINE__,__FUNCTION__ ,##__VA_ARGS__); \
+}while( 0 )
+#define DEBUG(FMT, ...) do { \
+       printf("%s:%d:\t%s\t Debug: "FMT,__FILE__, __LINE__,__FUNCTION__ ,##__VA_ARGS__); \
+}while( 0 )
+#endif
 
 /***************** ASSERT MACROS *********************/
 #define _ASSERT_AND_EXECUTE(_COND_, _ERRORCODE_, _EXPR_) do { \
index ed02fcfea7c6cd47ba5a81134593eef932919431..fc507c62e3cc51772ffbbc2f574bc7924f320bb9 100644 (file)
--- a/libdce.c
+++ b/libdce.c
 
 #include <xdc/std.h>
 
-#if defined(BUILDOS_GLP)
+#if defined(BUILDOS_LINUX)
 #include <xf86drm.h>
 #include <omap_drm.h>
-#include <omap_dce.h>
 #include <omap_drmif.h>
-#endif /* BUILDOS_GLP */
+#endif /* BUILDOS_LINUX */
 
 /* IPC Headers */
 #include <MmRpc.h>
 #include "memplugin.h"
 
 
-#if defined(BUILDOS_GLP)
-#ifdef GLP_X11
-int dce_auth_x11(int *fd);
-#endif /* GLP_X11 */
-#ifdef GLP_WAYLAND
-int dce_auth_wayland(int *fd);
-#endif /* GLP_WAYLAND */
+#if defined(BUILDOS_LINUX)
+#ifdef HAVE_X11
+// Defined from configure.ac
+extern int dce_auth_x11(int *fd);
+#endif /* HAVE_X11 */
+#ifdef HAVE_WAYLAND   // Defined from configure.ac
+extern int dce_auth_wayland(int *fd);
+#endif /* HAVE_WAYLAND */
 
-static int                   fd = -1;
-static struct omap_device   *dev;
-static int                   ioctl_base;
-#define CMD(name) (ioctl_base + DRM_OMAP_DCE_##name)
-
-uint32_t    dce_debug = 3;
-#endif /* BUILDOS_GLP */
+int                     fd                 = -1;
+struct   omap_device   *dev   =  0;
+uint32_t                dce_debug          =  3;
+#endif /* BUILDOS_LINUX */
 
 
 /********************* GLOBALS ***********************/
@@ -181,6 +178,42 @@ static int dce_init(void)
     _ASSERT_AND_EXECUTE(eError == DCE_EOK, DCE_EIPC_CREATE_FAIL, count--);
 
     printf("open(/dev/" DCE_DEVICE_NAME ") -> 0x%x\n", (int)MmRpcHandle);
+
+#if defined(BUILDOS_LINUX)
+    /* Open omapdrm device */
+    int    authenticated = 0;
+
+#ifdef HAVE_X11
+    /*If X11 server is running*/
+    if( !authenticated ) {
+        int    ret = dce_auth_x11(&fd);
+        if( !ret ) {
+            authenticated = 1;
+        }
+    }
+#endif
+#ifdef HAVE_WAYLAND
+    /*If Wayland windowing is supported*/
+    if( !authenticated ) {
+        int    ret = dce_auth_wayland(&fd);
+        if( !ret ) {
+            authenticated = 1;
+        }
+    }
+#endif
+    if((fd == -1) && !authenticated ) {
+        printf("no X11/wayland, fallback to opening DRM device directly\n");
+        fd = drmOpen("omapdrm", "platform:omapdrm:00");
+    }
+    if( fd >= 0 ) {
+        dev = omap_device_new(fd);
+    } else {
+        printf("Error opening omapdrm : drmOpen failed");
+        goto EXIT;
+    }
+#endif /* BUILDOS_LINUX */
+
+
 EXIT:
     pthread_mutex_unlock(&mutex);
     return (eError);
@@ -199,11 +232,34 @@ static void dce_deinit(void)
         MmRpc_delete(&MmRpcHandle);
     }
     MmRpcHandle = NULL;
+
+#if defined(BUILDOS_LINUX)
+    omap_device_del(dev);
+    dev = NULL;
+    close(fd);
+    fd = -1;
+#endif /* BUILDOS_LINUX */
+
+
 EXIT:
     pthread_mutex_unlock(&mutex);
     return;
 }
 
+/* Incase of X11 or Wayland the fd can be shared to libdce using this call */
+#if defined(BUILDOS_LINUX)
+void dce_set_fd(int dce_fd)
+{
+    fd = dce_fd;
+}
+
+int dce_get_fd(void)
+{
+    return (fd);
+}
+
+#endif /* BUILDOS_LINUX */
+
 /*===============================================================*/
 /** Engine_open        : Open Codec Engine.
  *
index c64456a042f48ffb604818d6cd7b13df5f7ff97f..9f7dcd763edf598c6fb522499de9a7744acd90f8 100644 (file)
--- a/libdce.h
+++ b/libdce.h
@@ -60,7 +60,7 @@ void *dce_alloc(int sz);
 void dce_free(void *ptr);
 
 
-#if defined(BUILDOS_GLP)
+#if defined(BUILDOS_LINUX)
 void dce_set_fd(int fd);
 int dce_get_fd();
 
@@ -68,12 +68,9 @@ int dce_get_fd();
 #define xdc__ARGTOPTR
 #define xdc__ARGTOFXN
 
-struct omap_device   *dce_init(void);
-void dce_deinit(struct omap_device *dev);
-
 #define XDM_MEMTYPE_BO 10
 #define XDM_MEMTYPE_BO_OFFSET 11
-#endif /* BUILDOS_GLP */
+#endif /* BUILDOS_LINUX */
 
 #endif /* __LIBDCE_H__ */
 
diff --git a/libdce.pc.in b/libdce.pc.in
new file mode 100644 (file)
index 0000000..5f71a29
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libdce
+Description: distributed codec-engine
+Version: @VERSION@
+Requires: libdrm libdrm_omap
+Libs: -L${libdir} -ldce
+Cflags: -I${includedir}/
diff --git a/linux/libdce-x11.c b/linux/libdce-x11.c
new file mode 100644 (file)
index 0000000..442a761
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2012, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * *  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * *  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * *  Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <xf86drm.h>
+#include <xf86drm.h>
+#include <omap_drm.h>
+#include <omap_drmif.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/extensions/dri2proto.h>
+#include <X11/extensions/dri2.h>
+
+#include <dce_priv.h>
+
+int dce_auth_x11(int *pfd)
+{
+    Display *dpy;
+    Window root;
+    drm_magic_t magic;
+    int eventBase, errorBase, major, minor;
+    char *driver, *device;
+    int ret = -1;
+    int fd = *pfd;
+
+    DEBUG("attempting to open X11 connection");
+    dpy = XOpenDisplay(NULL);
+    if (!dpy) {
+        ERROR("Could not open display");
+        goto no_x11;
+    }
+
+    if (!DRI2InitDisplay(dpy, NULL)) {
+        ERROR("DRI2InitDisplay failed");
+        goto no_x11;
+    }
+
+    if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) {
+        ERROR("DRI2QueryExtension failed");
+        goto no_x11;
+    }
+
+    DEBUG("DRI2QueryExtension: eventBase=%d, errorBase=%d", eventBase, errorBase);
+
+    if (!DRI2QueryVersion(dpy, &major, &minor)) {
+        ERROR("DRI2QueryVersion failed");
+        goto no_x11;
+    }
+
+    DEBUG("DRI2QueryVersion: major=%d, minor=%d", major, minor);
+
+    root = RootWindow(dpy, DefaultScreen(dpy));
+
+    if (!DRI2Connect(dpy, root, DRI2DriverDRI, &driver, &device)) {
+        DEBUG("DRI2Connect failed");
+        goto no_x11;
+    }
+
+    DEBUG("DRI2Connect: driver=%s, device=%s", driver, device);
+
+    /* only open the device if we don't already have an fd.. see
+     * dce_set_fd().  Need to sort out a better way to handle this
+     * but GEM buffer handles are only valid within the context of
+     * a given file-open.  Switching to dmabuf or flink handles
+     * would solve this.
+     */
+    if (fd == -1) {
+        fd = open(device, O_RDWR);
+        if (fd < 0) {
+            ERROR("open failed");
+            goto no_x11_free;
+        }
+    }
+
+    if (drmGetMagic(fd, &magic)) {
+        ERROR("drmGetMagic failed");
+        goto no_x11_free;
+    }
+
+    if (!DRI2Authenticate(dpy, root, magic)) {
+        ERROR("DRI2Authenticate failed");
+        goto no_x11_free;
+    }
+
+    ret = 0;
+    *pfd = fd;
+
+no_x11_free:
+    XFree(driver);
+    XFree(device);
+no_x11:
+    return ret;
+}
diff --git a/linux/wayland-drm-client-protocol.h b/linux/wayland-drm-client-protocol.h
new file mode 100644 (file)
index 0000000..dfcaa8b
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2010-2011 Intel Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby granted
+ * without fee, provided that\n 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
+ * the copyright holders not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS 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.
+ */
+
+#ifndef DRM_CLIENT_PROTOCOL_H
+#define DRM_CLIENT_PROTOCOL_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include "wayland-util.h"
+
+struct wl_client;
+struct wl_resource;
+struct wl_drm;
+extern const struct wl_interface wl_drm_interface;
+
+#ifndef WL_DRM_ERROR_ENUM
+#define WL_DRM_ERROR_ENUM
+enum wl_drm_error {
+    WL_DRM_ERROR_AUTHENTICATE_FAIL = 0,
+    WL_DRM_ERROR_INVALID_FORMAT = 1,
+    WL_DRM_ERROR_INVALID_NAME = 2,
+};
+#endif /* WL_DRM_ERROR_ENUM */
+
+#ifndef WL_DRM_FORMAT_ENUM
+#define WL_DRM_FORMAT_ENUM
+enum wl_drm_format {
+    WL_DRM_FORMAT_C8 = 0x20203843,
+    WL_DRM_FORMAT_RGB332 = 0x38424752,
+    WL_DRM_FORMAT_BGR233 = 0x38524742,
+    WL_DRM_FORMAT_XRGB4444 = 0x32315258,
+    WL_DRM_FORMAT_XBGR4444 = 0x32314258,
+    WL_DRM_FORMAT_RGBX4444 = 0x32315852,
+    WL_DRM_FORMAT_BGRX4444 = 0x32315842,
+    WL_DRM_FORMAT_ARGB4444 = 0x32315241,
+    WL_DRM_FORMAT_ABGR4444 = 0x32314241,
+    WL_DRM_FORMAT_RGBA4444 = 0x32314152,
+    WL_DRM_FORMAT_BGRA4444 = 0x32314142,
+    WL_DRM_FORMAT_XRGB1555 = 0x35315258,
+    WL_DRM_FORMAT_XBGR1555 = 0x35314258,
+    WL_DRM_FORMAT_RGBX5551 = 0x35315852,
+    WL_DRM_FORMAT_BGRX5551 = 0x35315842,
+    WL_DRM_FORMAT_ARGB1555 = 0x35315241,
+    WL_DRM_FORMAT_ABGR1555 = 0x35314241,
+    WL_DRM_FORMAT_RGBA5551 = 0x35314152,
+    WL_DRM_FORMAT_BGRA5551 = 0x35314142,
+    WL_DRM_FORMAT_RGB565 = 0x36314752,
+    WL_DRM_FORMAT_BGR565 = 0x36314742,
+    WL_DRM_FORMAT_RGB888 = 0x34324752,
+    WL_DRM_FORMAT_BGR888 = 0x34324742,
+    WL_DRM_FORMAT_XRGB8888 = 0x34325258,
+    WL_DRM_FORMAT_XBGR8888 = 0x34324258,
+    WL_DRM_FORMAT_RGBX8888 = 0x34325852,
+    WL_DRM_FORMAT_BGRX8888 = 0x34325842,
+    WL_DRM_FORMAT_ARGB8888 = 0x34325241,
+    WL_DRM_FORMAT_ABGR8888 = 0x34324241,
+    WL_DRM_FORMAT_RGBA8888 = 0x34324152,
+    WL_DRM_FORMAT_BGRA8888 = 0x34324142,
+    WL_DRM_FORMAT_XRGB2101010 = 0x30335258,
+    WL_DRM_FORMAT_XBGR2101010 = 0x30334258,
+    WL_DRM_FORMAT_RGBX1010102 = 0x30335852,
+    WL_DRM_FORMAT_BGRX1010102 = 0x30335842,
+    WL_DRM_FORMAT_ARGB2101010 = 0x30335241,
+    WL_DRM_FORMAT_ABGR2101010 = 0x30334241,
+    WL_DRM_FORMAT_RGBA1010102 = 0x30334152,
+    WL_DRM_FORMAT_BGRA1010102 = 0x30334142,
+    WL_DRM_FORMAT_YUYV = 0x56595559,
+    WL_DRM_FORMAT_YVYU = 0x55595659,
+    WL_DRM_FORMAT_UYVY = 0x59565955,
+    WL_DRM_FORMAT_VYUY = 0x59555956,
+    WL_DRM_FORMAT_AYUV = 0x56555941,
+    WL_DRM_FORMAT_NV12 = 0x3231564e,
+    WL_DRM_FORMAT_NV21 = 0x3132564e,
+    WL_DRM_FORMAT_NV16 = 0x3631564e,
+    WL_DRM_FORMAT_NV61 = 0x3136564e,
+    WL_DRM_FORMAT_YUV410 = 0x39565559,
+    WL_DRM_FORMAT_YVU410 = 0x39555659,
+    WL_DRM_FORMAT_YUV411 = 0x31315559,
+    WL_DRM_FORMAT_YVU411 = 0x31315659,
+    WL_DRM_FORMAT_YUV420 = 0x32315559,
+    WL_DRM_FORMAT_YVU420 = 0x32315659,
+    WL_DRM_FORMAT_YUV422 = 0x36315559,
+    WL_DRM_FORMAT_YVU422 = 0x36315659,
+    WL_DRM_FORMAT_YUV444 = 0x34325559,
+    WL_DRM_FORMAT_YVU444 = 0x34325659,
+};
+#endif /* WL_DRM_FORMAT_ENUM */
+
+struct wl_drm_listener {
+    /**
+     * device - (none)
+     * @name: (none)
+     */
+    void (*device)(void *data,
+        struct wl_drm *wl_drm,
+        const char *name);
+    /**
+     * format - (none)
+     * @format: (none)
+     */
+    void (*format)(void *data,
+        struct wl_drm *wl_drm,
+        uint32_t format);
+    /**
+     * authenticated - (none)
+     */
+     void (*authenticated)(void *data,
+         struct wl_drm *wl_drm);
+};
+
+static inline int
+wl_drm_add_listener(struct wl_drm *wl_drm,
+    const struct wl_drm_listener *listener, void *data)
+{
+    return wl_proxy_add_listener((struct wl_proxy *) wl_drm,
+        (void (**)(void)) listener, data);
+}
+
+#define WL_DRM_AUTHENTICATE    0
+#define WL_DRM_CREATE_BUFFER   1
+#define WL_DRM_CREATE_PLANAR_BUFFER    2
+
+static inline void
+wl_drm_set_user_data(struct wl_drm *wl_drm, void *user_data)
+{
+    wl_proxy_set_user_data((struct wl_proxy *) wl_drm, user_data);
+}
+
+static inline void *
+wl_drm_get_user_data(struct wl_drm *wl_drm)
+{
+    return wl_proxy_get_user_data((struct wl_proxy *) wl_drm);
+}
+
+static inline void
+wl_drm_destroy(struct wl_drm *wl_drm)
+{
+    wl_proxy_destroy((struct wl_proxy *) wl_drm);
+}
+
+static inline void
+wl_drm_authenticate(struct wl_drm *wl_drm, uint32_t id)
+{
+    wl_proxy_marshal((struct wl_proxy *) wl_drm,
+        WL_DRM_AUTHENTICATE, id);
+}
+
+static inline struct wl_buffer *
+wl_drm_create_buffer(struct wl_drm *wl_drm, uint32_t name, int32_t width, int32_t height, uint32_t stride, uint32_t format)
+{
+    struct wl_proxy *id;
+        id = wl_proxy_create((struct wl_proxy *) wl_drm,
+                 &wl_buffer_interface);
+    if (!id)
+        return NULL;
+
+    wl_proxy_marshal((struct wl_proxy *) wl_drm,
+        WL_DRM_CREATE_BUFFER, id, name, width, height, stride, format);
+
+    return (struct wl_buffer *) id;
+}
+
+static inline struct wl_buffer *
+wl_drm_create_planar_buffer(struct wl_drm *wl_drm, uint32_t name, int32_t width, int32_t height, uint32_t format, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2)
+{
+    struct wl_proxy *id;
+    id = wl_proxy_create((struct wl_proxy *) wl_drm,
+                             &wl_buffer_interface);
+    if (!id)
+        return NULL;
+
+    wl_proxy_marshal((struct wl_proxy *) wl_drm,
+        WL_DRM_CREATE_PLANAR_BUFFER, id, name, width, height, format, offset0, stride0, offset1, stride1, offset2, stride2);
+
+    return (struct wl_buffer *) id;
+}
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
diff --git a/linux/wayland-drm-protocol.c b/linux/wayland-drm-protocol.c
new file mode 100644 (file)
index 0000000..aa6d4e0
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2010-2011 Intel Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby granted
+ * without fee, provided that\n 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
+ * the copyright holders not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS 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.
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "wayland-util.h"
+
+extern const struct wl_interface wl_buffer_interface;
+extern const struct wl_interface wl_buffer_interface;
+
+static const struct wl_interface *types[] = {
+    NULL,
+    &wl_buffer_interface,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    &wl_buffer_interface,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+static const struct wl_message wl_drm_requests[] = {
+    { "authenticate", "u", types + 0 },
+    { "create_buffer", "nuiiuu", types + 1 },
+    { "create_planar_buffer", "nuiiuiiiiii", types + 7 },
+};
+
+static const struct wl_message wl_drm_events[] = {
+    { "device", "s", types + 0 },
+    { "format", "u", types + 0 },
+    { "authenticated", "", types + 0 },
+};
+
+WL_EXPORT const struct wl_interface wl_drm_interface = {
+    "wl_drm", 1,
+    ARRAY_LENGTH(wl_drm_requests), wl_drm_requests,
+    ARRAY_LENGTH(wl_drm_events), wl_drm_events,
+};
index 816829b50306d2b8620592f4e27c5b153c09b2fb..49e0500c0b7ffd21bd631d22cf92307a03416451 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
-#if defined(BUILDOS_QNX)
-#include <memmgr.h>
-#endif /* BUILDOS_QNX */
 
-#if defined(BUILDOS_GLP)
+#if defined(BUILDOS_LINUX)
 #include <xf86drm.h>
-#endif /* BUILDOS_GLP */
+#include <omap_drm.h>
+#include <omap_drmif.h>
+#endif /* BUILDOS_LINUX */
 
+
+#if defined(BUILDOS_QNX)
 /* IPC Headers */
 #include <tilermem.h>
 #include <SharedMemoryAllocatorUsr.h>
+#include <memmgr.h>
+#endif /* BUILDOS_QNX */
 
 
 #define P2H(p) (&(((MemHeader *)(p))[-1]))
 #define H2P(h) ((void *)&(h)[1])
 
+
 /* MemHeader is important because it is necessary to know the           */
 /* size of the parameter buffers on IPU for Cache operations               */
 /* The size can't be assumed as codec supports different inputs           */
@@ -63,6 +67,7 @@ typedef struct MemHeader {
     void *ptr;
 } MemHeader;
 
+
 typedef enum mem_type {
     TILER_1D_BUFFER,
     TILER8_2D_BUFFER,
@@ -85,7 +90,7 @@ void *memplugin_alloc(int sz, int height, mem_type memory_type);
 
 void memplugin_free(void *ptr, mem_type memory_type);
 
-void *memplugin_share(void *ptr, mem_type memory_type);
+int memplugin_share(void *ptr);
 
 #endif /* __MEMPLUGIN_H__ */
 
diff --git a/memplugin_linux.c b/memplugin_linux.c
new file mode 100644 (file)
index 0000000..bb99d26
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2013, Texas Instruments Incorporated
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * *  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * *  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * *  Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "memplugin.h"
+#include "dce_priv.h"
+
+extern struct omap_device   *dev;
+
+
+/*  memplugin_alloc - allocates omap_bo buffer with a header above it.
+ *  @sz: Size of the buffer requsted
+ *  @height: this parameter is currently not used
+ *  @memory_type : Currently dce_alloc is used on for parameter buffer
+ *  Returns a virtual address pointer to omap_bo buffer or the param buffer
+ */
+void *memplugin_alloc(int sz, int height, mem_type memory_type)
+{
+    MemHeader        *h;
+    struct omap_bo   *bo = omap_bo_new(dev, sz + sizeof(MemHeader), OMAP_BO_WC);
+
+    if( !bo ) {
+        return (NULL);
+    }
+
+    h = omap_bo_map(bo);
+    memset(H2P(h), 0, sz);
+    h->size = sz;
+    h->ptr = (void *)bo;
+
+    return (H2P(h));
+
+}
+
+/*
+ * @ptr: pointer to omap_bo buffer, to be freed
+ * @memory_type: Currently dce_free is called on parameter buffers only
+ */
+void memplugin_free(void *ptr, mem_type memory_type)
+{
+    if( ptr ) {
+        MemHeader   *h = P2H(ptr);
+        omap_bo_del((struct omap_bo *)h->ptr);
+    }
+}
+
+/* memplugin_share - converts the omap_bo buffer into dmabuf
+ * @ptr : pointer of omap_bo buffer, to be converted to fd
+ * Returns a file discriptor for the omap_bo buffer
+ */
+int memplugin_share(void *ptr)
+{
+    if( ptr ) {
+        MemHeader   *h = P2H(ptr);
+        return (omap_bo_dmabuf((struct omap_bo *)h->ptr));
+    }
+    return (-1);
+}
+