raster pushed a commit to branch efl-1.11.

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

commit bc72864517561cb60638bd61b5677687ef24effb
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sun Sep 28 11:34:40 2014 +0900

    ecore vsync - fix up dual nvidia + dri/drm driver discovery
    
    this fixes drm vsync discovery when you have both drm and nvidia
    drivers seemingly present in /dev but the intel drivers are the dri
    ones and nvidiactl is there (who knows if it's used). keep the nvidia
    drivers working too with a name/desc check on drm driver as the drm
    driver is in fact nvidia's own and set flags appropriately
    
    @fix
---
 src/lib/ecore_x/xlib/ecore_x_vsync.c | 63 ++++++++++++++++++++++++++++++------
 1 file changed, 53 insertions(+), 10 deletions(-)

diff --git a/src/lib/ecore_x/xlib/ecore_x_vsync.c 
b/src/lib/ecore_x/xlib/ecore_x_vsync.c
index 2924ed1..cdbc99b 100644
--- a/src/lib/ecore_x/xlib/ecore_x_vsync.c
+++ b/src/lib/ecore_x/xlib/ecore_x_vsync.c
@@ -369,8 +369,10 @@ _drm_link(void)
    return 1;
 }
 
+#define DRM_HAVE_NVIDIA 1
+
 static int
-_drm_init(void)
+_drm_init(int *flags)
 {
    struct stat st;
    char buf[512];
@@ -480,12 +482,13 @@ _drm_init(void)
                   if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG"))
                     fprintf(stderr, "Whitelisted intel OK\n");
                   ok = EINA_TRUE;
+                  goto checkdone;
                }
           }
-        else if ((drmverbroken->version_major >= 1) &&
-                 (drmverbroken->version_minor >= 6) &&
-                 (drmverbroken->name > (char *)4000L) &&
-                 (drmverbroken->date_len < 200))
+        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")) &&
@@ -494,8 +497,34 @@ _drm_init(void)
                   if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG"))
                     fprintf(stderr, "Whitelisted intel OK\n");
                   ok = EINA_TRUE;
+                  goto checkdone;
                }
           }
+        if ((drmver->version_major >= 0) &&
+            (drmver->version_minor >= 0) &&
+            (drmver->name > (char *)4000L) &&
+            (drmver->date_len < 200))
+          {
+             if ((!strcmp(drmver->name, "nvidia-drm")) &&
+                 (strstr(drmver->desc, "NVIDIA DRM driver")))
+               {
+                  *flags |= DRM_HAVE_NVIDIA;
+                  goto checkdone;
+               }
+          }
+        if ((drmverbroken->version_major >= 0) &&
+            (drmverbroken->version_minor >= 0) &&
+            (drmverbroken->name > (char *)4000L) &&
+            (drmverbroken->date_len < 200))
+          {
+             if ((!strcmp(drmverbroken->name, "nvidia-drm")) &&
+                 (strstr(drmverbroken->desc, "NVIDIA DRM driver")))
+               {
+                  *flags |= DRM_HAVE_NVIDIA;
+                  goto checkdone;
+               }
+          }
+checkdone:
         sym_drmFreeVersion(drmver);
         if (!ok)
           {
@@ -701,6 +730,7 @@ _vsync_init(void)
 {
    static int done = 0;
    struct stat stb;
+   int flags = 0;
 
    if (done) return;
 
@@ -713,19 +743,32 @@ _vsync_init(void)
           {
              if (_drm_link())
                {
-                  if (_drm_init())
-                    {
-                       mode = 1;
-                    }
+                  if (_drm_init(&flags)) mode = 1;
                }
           }
 #endif
         // nvidia gl vsync slave mode
         if (mode == 0)
           {
+             // we appear to have an nvidia driver running
              if (!stat("/dev/nvidiactl", &stb))
                {
-                  mode = 2;
+                  if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG"))
+                    fprintf(stderr, "We appear to have an nvidia driver: drm 
flags %i\n", flags);
+                  if (
+                      // we have dri device AND it's an nvidia one
+                      ((!stat("/dev/dri/card0", &stb)) &&
+                       (flags & DRM_HAVE_NVIDIA))
+                      ||
+                      // or we have no dri device, and no nvidia flags
+                      ((stat("/dev/dri/card0", &stb)) &&
+                       (flags == 0))
+                      )
+                    {
+                       if (getenv("ECORE_VSYNC_DRM_VERSION_DEBUG"))
+                         fprintf(stderr, "Using nvidia vsync slave proc\n");
+                       mode = 2;
+                    }
                }
           }
      }

-- 


Reply via email to