raster pushed a commit to branch efl-1.11. http://git.enlightenment.org/core/efl.git/commit/?id=290d5c4a51582e0c6da610d7c33cd51c803af54a
commit 290d5c4a51582e0c6da610d7c33cd51c803af54a Author: Carsten Haitzler (Rasterman) <[email protected]> Date: Tue Sep 23 21:31:54 2014 +0900 efl - vsync - deal with both broken and non-broken libdrm @fix --- src/lib/ecore_x/xlib/ecore_x_vsync.c | 68 +++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/src/lib/ecore_x/xlib/ecore_x_vsync.c b/src/lib/ecore_x/xlib/ecore_x_vsync.c index f68efb2..b76cb65 100644 --- a/src/lib/ecore_x/xlib/ecore_x_vsync.c +++ b/src/lib/ecore_x/xlib/ecore_x_vsync.c @@ -96,7 +96,7 @@ typedef struct _drmEventContext void *user_data); } drmEventContext; -typedef struct _drmVersion +typedef struct _drmVersionBroken { int version_major; int version_minor; @@ -110,6 +110,22 @@ typedef struct _drmVersion char *date; size_t desc_len; char *desc; +} drmVersionBroken; + +typedef struct _drmVersion +{ + int version_major; + int version_minor; + int version_patchlevel; + size_t name_len; + // WARNING! this does NOT match the system drm.h headers because + // literally drm.h is wrong. the below is correct. drm hapily + // broke its ABI at some point. + char *name; + size_t date_len; + char *date; + size_t desc_len; + char *desc; } drmVersion; static int (*sym_drmClose)(int fd) = NULL; @@ -417,8 +433,10 @@ _drm_init(void) if (!getenv("ECORE_VSYNC_DRM_ALL")) { drmVersion *drmver; + drmVersionBroken *drmverbroken; drmver = sym_drmGetVersion(drm_fd); + drmverbroken = (drmVersionBroken *)drmver; if (!drmver) { close(drm_fd); @@ -430,25 +448,51 @@ _drm_init(void) // not garbage (within a sensible range) if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG")) { - fprintf(stderr, - "DRM Version: %i.%i\n" - "Name: '%s'\n" - "Date: '%s'\n" - "Desc: '%s'\n", - drmver->version_major, drmver->version_minor, - drmver->name, drmver->date, drmver->desc); + if ((drmverbroken->name > (char *)4000L) && + (drmverbroken->date_len < 200)) + fprintf(stderr, + "!BROKEN DRM! Do FIXUP of ABI\n" + "DRM Version: %i.%i\n" + "Name: '%s'\n" + "Date: '%s'\n" + "Desc: '%s'\n", + drmverbroken->version_major, drmverbroken->version_minor, + drmverbroken->name, drmverbroken->date, drmverbroken->desc); + else + fprintf(stderr, + "OK DRM\n" + "DRM Version: %i.%i\n" + "Name: '%s'\n" + "Date: '%s'\n" + "Desc: '%s'\n", + drmver->version_major, drmver->version_minor, + drmver->name, drmver->date, drmver->desc); } if ((drmver->version_major >= 1) && (drmver->version_minor >= 6) && - (drmver->name) && - (drmver->desc) && - (drmver->desc_len > 0) && - (drmver->desc_len < 200)) + (drmver->name > (char *)4000L) && + (drmver->date_len < 200)) { // whitelist of known-to-work drivers if ((!strcmp(drmver->name, "i915")) && (strstr(drmver->desc, "Intel Graphics"))) { + if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG")) + fprintf(stderr, "Whitelisted intel OK\n"); + ok = EINA_TRUE; + } + } + else if ((drmverbroken->version_major >= 1) && + (drmverbroken->version_minor >= 6) && + (drmverbroken->name > (char *)4000L) && + (drmverbroken->date_len < 200)) + { + // whitelist of known-to-work drivers + if ((!strcmp(drmverbroken->name, "i915")) && + (strstr(drmverbroken->desc, "Intel Graphics"))) + { + if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG")) + fprintf(stderr, "Whitelisted intel OK\n"); ok = EINA_TRUE; } } --
