devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ea8ffdf433ed56ed34b7b8dd865f6808fac037e8

commit ea8ffdf433ed56ed34b7b8dd865f6808fac037e8
Author: Chris Michael <cp.mich...@samsung.com>
Date:   Tue Jul 8 12:08:14 2014 -0400

    Revert "evas/drm: Make use of ecore_drm for opening DRM device"
    
    This reverts commit 31ad73efa96b6c4c2ab01366a0897e6fadad48e4.
    
    Conflicts:
        src/modules/evas/engines/drm/evas_engine.c
    
    Revert this commit as these functions are needed to run evas engine
    standalone (expedite) on drm
---
 src/Makefile_Evas.am                       |   2 -
 src/modules/evas/engines/drm/evas_drm.c    | 106 +++++++++++++++++++++++++++--
 src/modules/evas/engines/drm/evas_engine.h |   2 +-
 3 files changed, 103 insertions(+), 7 deletions(-)

diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
index 9a9ec64..2491b97 100644
--- a/src/Makefile_Evas.am
+++ b/src/Makefile_Evas.am
@@ -1207,11 +1207,9 @@ modules_evas_engines_drm_module_la_CPPFLAGS = 
-I$(top_builddir)/src/lib/efl \
 -I$(top_srcdir)/src/lib/evas/include \
 -I$(top_srcdir)/src/lib/evas/cserve2 \
 @EVAS_CFLAGS@ \
-@ECORE_DRM_CFLAGS@ \
 @evas_engine_drm_cflags@
 modules_evas_engines_drm_module_la_LIBADD = \
 @USE_EVAS_LIBS@ \
-@ECORE_DRM_LIBS@ \
 @evas_engine_drm_libs@
 modules_evas_engines_drm_module_la_DEPENDENCIES = @USE_EVAS_INTERNAL_LIBS@
 modules_evas_engines_drm_module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
diff --git a/src/modules/evas/engines/drm/evas_drm.c 
b/src/modules/evas/engines/drm/evas_drm.c
index e5bd74d..764f77a 100644
--- a/src/modules/evas/engines/drm/evas_drm.c
+++ b/src/modules/evas/engines/drm/evas_drm.c
@@ -2,12 +2,90 @@
 #include <linux/vt.h>
 #include <linux/kd.h>
 #include <sys/mman.h>
-#include <Ecore_Drm.h>
 
 /* NB: REALLY hate to store this here, but sigaction signal handlers cannot 
  * pass any 'user data' to the signal handlers :( */
 static Evas_Engine_Info_Drm *siginfo;
 
+static char *
+_evas_drm_card_driver_get(const char *dev)
+{
+   struct stat st;
+   int maj, min;
+   char *path, path_link[PATH_MAX + 1] = "";
+   char *drv;
+
+   if (stat(dev, &st) < 0) return NULL;
+
+   if (!S_ISCHR(st.st_mode)) return NULL;
+
+   maj = major(st.st_rdev);
+   min = minor(st.st_rdev);
+
+   asprintf(&path, "/sys/dev/char/%d:%d/device/driver", maj, min);
+   if (readlink(path, path_link, sizeof(path_link) - 1) < 0)
+     {
+        free(path);
+        return NULL;
+     }
+
+   free(path);
+
+   if (!(drv = strrchr(path_link, '/'))) return NULL;
+   return strdup(drv + strlen("/"));
+}
+
+static int 
+_evas_drm_card_open(int card)
+{
+   char dev[32], *driver;
+   int fd = -1;
+   uint64_t dumb;
+
+   sprintf(dev, DRM_DEV_NAME, DRM_DIR_NAME, card);
+
+   driver = _evas_drm_card_driver_get(dev);
+   DBG("Drm Device Driver: %s", driver);
+
+   if ((fd = drmOpen(driver, NULL)) < 0)
+     {
+        CRI("Could not open drm device %s: %m", dev);
+        return -1;
+     }
+
+   /* if ((fd = open(dev, (O_RDWR | O_CLOEXEC))) < 0) */
+   /*   { */
+   /*      CRI("Could not open drm device %s: %m", dev); */
+   /*      return -1; */
+   /*   } */
+
+   /* drmVersionPtr ver; */
+   /* if ((ver = drmGetVersion(fd))) */
+   /*   { */
+   /*      DBG("Drm Driver Name: %s", ver->name); */
+   /*      drmFreeVersion(ver); */
+   /*   } */
+
+   /* check for dumb buffer support
+    * 
+    * NB: This checks that we can at least support software rendering */
+   if ((drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &dumb) < 0) || (!dumb))
+     {
+        CRI("Drm Device %s does not support software rendering", dev);
+
+        /* close the card */
+        close(fd);
+
+        /* return failure */
+        return -1;
+     }
+
+   DBG("Opened Drm Card %s: %d", dev, fd);
+
+   /* return opened card */
+   return fd;
+}
+
 static int 
 _evas_drm_tty_open(Evas_Engine_Info_Drm *info)
 {
@@ -308,15 +386,26 @@ _evas_drm_outbuf_planes_setup(Outbuf *ob, 
drmModePlaneResPtr pres)
    return EINA_TRUE;
 }
 
-Eina_Bool
-evas_drm_init(Evas_Engine_Info_Drm *info)
+Eina_Bool 
+evas_drm_init(Evas_Engine_Info_Drm *info, int card)
 {
-
    /* check for valid engine info */
    if (!info) return EINA_FALSE;
 
    setvbuf(stdout, NULL, _IONBF, 0);
 
+   /* check if we already opened the card */
+   if (info->info.fd < 0)
+     {
+        /* try to open the drm card */
+        if ((info->info.fd = _evas_drm_card_open(card)) < 0) 
+          return EINA_FALSE;
+
+        /* set flag to indicate that evas opened the card and we should 
+         * be the one to close it */
+        info->info.own_fd = EINA_TRUE;
+     }
+
    /* check if we already opened the tty */
    if (info->info.tty < 0)
      {
@@ -341,6 +430,8 @@ evas_drm_init(Evas_Engine_Info_Drm *info)
         if ((info->info.tty >= 0) && (info->info.own_tty))
           close(info->info.tty);
 
+        /* FIXME: Close card also ?? */
+
         return EINA_FALSE;
      }
 
@@ -360,6 +451,13 @@ evas_drm_shutdown(Evas_Engine_Info_Drm *info)
         info->info.tty = -1;
      }
 
+   /* check if we already opened the card. if so, close it */
+   if ((info->info.fd >= 0) && (info->info.own_fd))
+     {
+        close(info->info.fd);
+        info->info.fd = -1;
+     }
+
    return EINA_TRUE;
 }
 
diff --git a/src/modules/evas/engines/drm/evas_engine.h 
b/src/modules/evas/engines/drm/evas_engine.h
index 43d6feb..dee6df1 100644
--- a/src/modules/evas/engines/drm/evas_engine.h
+++ b/src/modules/evas/engines/drm/evas_engine.h
@@ -128,7 +128,7 @@ void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image 
*update, int x, int y
 void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
 void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode 
render_mode);
 
-Eina_Bool evas_drm_init(Evas_Engine_Info_Drm *info);
+Eina_Bool evas_drm_init(Evas_Engine_Info_Drm *info, int card);
 Eina_Bool evas_drm_shutdown(Evas_Engine_Info_Drm *info);
 
 Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);

-- 


Reply via email to