summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Michael <cp.michael@samsung.com>2016-11-14 13:34:54 -0500
committerChris Michael <cp.michael@samsung.com>2016-11-15 08:42:07 -0500
commit0a2c06fc58b4eac4cdcd9f7907e940d1c742dd92 (patch)
tree2b93d076327dbb263c797b2b7944ebc6046b12c8
parentb820ad367641cceef2071fd25619a0dc09a4681a (diff)
downloadefl-0a2c06fc58b4eac4cdcd9f7907e940d1c742dd92.tar.gz
ecore-drm2: Symlink to libdrm functions during init time
Signed-off-by: Chris Michael <cp.michael@samsung.com>
-rw-r--r--src/lib/ecore_drm2/ecore_drm2.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/lib/ecore_drm2/ecore_drm2.c b/src/lib/ecore_drm2/ecore_drm2.c
index 339362a9c2..372886660f 100644
--- a/src/lib/ecore_drm2/ecore_drm2.c
+++ b/src/lib/ecore_drm2/ecore_drm2.c
@@ -1,12 +1,97 @@
#include "ecore_drm2_private.h"
static int _ecore_drm2_init_count = 0;
+static void *drm_lib = NULL;
int _ecore_drm2_log_dom = -1;
EAPI int ECORE_DRM2_EVENT_OUTPUT_CHANGED = -1;
EAPI int ECORE_DRM2_EVENT_ACTIVATE = -1;
+static Eina_Bool
+_ecore_drm2_link(void)
+{
+ int i, fail;
+ const char *drm_libs[] =
+ {
+ "libdrm.so.2",
+ "libdrm.so.1",
+ "libdrm.so.0",
+ "libdrm.so",
+ NULL,
+ };
+
+#define SYM(lib, xx) \
+ do { \
+ sym_ ## xx = dlsym(lib, #xx); \
+ if (!(sym_ ## xx)) { \
+ fail = 1; \
+ } \
+ } while (0)
+
+ if (drm_lib) return EINA_TRUE;
+
+ for (i = 0; drm_libs[i]; i++)
+ {
+ drm_lib = dlopen(drm_libs[i], RTLD_LOCAL | RTLD_LAZY);
+ if (!drm_lib) continue;
+
+ fail = 0;
+
+ SYM(drm_lib, drmIoctl);
+ /* SYM(drm_lib, drmClose); */
+ /* SYM(drm_lib, drmWaitVBlank); */
+ SYM(drm_lib, drmHandleEvent);
+ SYM(drm_lib, drmGetVersion);
+ SYM(drm_lib, drmFreeVersion);
+ SYM(drm_lib, drmModeGetProperty);
+ SYM(drm_lib, drmModeFreeProperty);
+ SYM(drm_lib, drmModeGetPropertyBlob);
+ SYM(drm_lib, drmModeFreePropertyBlob);
+ SYM(drm_lib, drmModeDestroyPropertyBlob);
+ SYM(drm_lib, drmModeObjectGetProperties);
+ SYM(drm_lib, drmModeFreeObjectProperties);
+ SYM(drm_lib, drmModeCreatePropertyBlob);
+#ifdef HAVE_ATOMIC_DRM
+ SYM(drm_lib, drmModeAtomicAlloc);
+ SYM(drm_lib, drmModeAtomicFree);
+ SYM(drm_lib, drmModeAtomicAddProperty);
+ SYM(drm_lib, drmModeAtomicCommit);
+ SYM(drm_lib, drmModeAtomicSetCursor);
+#endif
+ SYM(drm_lib, drmModeGetEncoder);
+ SYM(drm_lib, drmModeFreeEncoder);
+ SYM(drm_lib, drmModeGetCrtc);
+ SYM(drm_lib, drmModeFreeCrtc);
+ SYM(drm_lib, drmModeSetCrtc);
+ SYM(drm_lib, drmModeGetResources);
+ SYM(drm_lib, drmModeFreeResources);
+ SYM(drm_lib, drmModeGetConnector);
+ SYM(drm_lib, drmModeFreeConnector);
+ SYM(drm_lib, drmModeConnectorSetProperty);
+ SYM(drm_lib, drmGetCap);
+ SYM(drm_lib, drmSetClientCap);
+ SYM(drm_lib, drmModeGetPlaneResources);
+ SYM(drm_lib, drmModeFreePlaneResources);
+ SYM(drm_lib, drmModeGetPlane);
+ SYM(drm_lib, drmModeFreePlane);
+ SYM(drm_lib, drmModeAddFB);
+ SYM(drm_lib, drmModeRmFB);
+ SYM(drm_lib, drmModeDirtyFB);
+
+ if (fail)
+ {
+ dlclose(drm_lib);
+ drm_lib = NULL;
+ }
+ else
+ break;
+ }
+
+ if (!drm_lib) return EINA_FALSE;
+ return EINA_TRUE;
+}
+
EAPI int
ecore_drm2_init(void)
{
@@ -43,8 +128,13 @@ ecore_drm2_init(void)
ECORE_DRM2_EVENT_OUTPUT_CHANGED = ecore_event_type_new();
ECORE_DRM2_EVENT_ACTIVATE = ecore_event_type_new();
+ if (!_ecore_drm2_link()) goto link_err;
+
return _ecore_drm2_init_count;
+link_err:
+ eina_log_domain_unregister(_ecore_drm2_log_dom);
+ _ecore_drm2_log_dom = -1;
log_err:
elput_shutdown();
elput_err: