diff options
author | Chris Michael <cp.michael@samsung.com> | 2016-11-14 13:34:54 -0500 |
---|---|---|
committer | Chris Michael <cp.michael@samsung.com> | 2016-11-15 08:42:07 -0500 |
commit | 0a2c06fc58b4eac4cdcd9f7907e940d1c742dd92 (patch) | |
tree | 2b93d076327dbb263c797b2b7944ebc6046b12c8 | |
parent | b820ad367641cceef2071fd25619a0dc09a4681a (diff) | |
download | efl-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.c | 90 |
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: |