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
This commit is contained in:
Carsten Haitzler 2014-09-28 11:34:40 +09:00
parent e9e2344982
commit 60bc2cc1ce
1 changed files with 53 additions and 10 deletions

View File

@ -380,8 +380,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];
@ -491,12 +493,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")) &&
@ -505,8 +508,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)
{
@ -712,6 +741,7 @@ _vsync_init(void)
{
static int done = 0;
struct stat stb;
int flags = 0;
if (done) return;
@ -724,19 +754,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;
}
}
}
}