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;
                }
           }

-- 


Reply via email to