forked from enlightenment/efl
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:
parent
e9e2344982
commit
60bc2cc1ce
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue