lavu/hwcontext_vaapi: Skip 'vgem' driver

There can be more than one available render node, and it's not
guaranteed the first node we come across is the correct one. In
particular, 'vgem' devices are common, and are
never VAAPI-enabled and thus not valid here.

We have a 'kernel_driver' arg already for specifying a single driver we
*do* want, but it doesn't support a negation, nor a list. It's easier
just to automatically skip 'vgem' anyway, to avoid foisting this burden
on users.

This has precedent in libva-utils already:

  bfb6b98ed62a exclude vgem node and invalid drm node in vainfo
  bfb6b98ed6

Signed-off-by: Brian Norris <briannorris@chromium.org>
This commit is contained in:
Brian Norris 2022-12-05 14:33:21 -08:00 committed by Haihao Xiang
parent 4061c22428
commit b62940bec3
1 changed files with 22 additions and 7 deletions

View File

@ -1700,6 +1700,7 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
char path[64]; char path[64];
int n, max_devices = 8; int n, max_devices = 8;
#if CONFIG_LIBDRM #if CONFIG_LIBDRM
drmVersion *info;
const AVDictionaryEntry *kernel_driver; const AVDictionaryEntry *kernel_driver;
kernel_driver = av_dict_get(opts, "kernel_driver", NULL, 0); kernel_driver = av_dict_get(opts, "kernel_driver", NULL, 0);
#endif #endif
@ -1713,9 +1714,15 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
break; break;
} }
#if CONFIG_LIBDRM #if CONFIG_LIBDRM
if (kernel_driver) {
drmVersion *info;
info = drmGetVersion(priv->drm_fd); info = drmGetVersion(priv->drm_fd);
if (!info) {
av_log(ctx, AV_LOG_VERBOSE,
"Failed to get DRM version for device %d.\n", n);
close(priv->drm_fd);
priv->drm_fd = -1;
continue;
}
if (kernel_driver) {
if (strcmp(kernel_driver->value, info->name)) { if (strcmp(kernel_driver->value, info->name)) {
av_log(ctx, AV_LOG_VERBOSE, "Ignoring device %d " av_log(ctx, AV_LOG_VERBOSE, "Ignoring device %d "
"with non-matching kernel driver (%s).\n", "with non-matching kernel driver (%s).\n",
@ -1730,12 +1737,20 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
"with matching kernel driver (%s).\n", "with matching kernel driver (%s).\n",
n, info->name); n, info->name);
drmFreeVersion(info); drmFreeVersion(info);
} else break;
// drmGetVersion() ensures |info->name| is 0-terminated.
} else if (!strcmp(info->name, "vgem")) {
av_log(ctx, AV_LOG_VERBOSE,
"Skipping vgem node for device %d.\n", n);
drmFreeVersion(info);
close(priv->drm_fd);
priv->drm_fd = -1;
continue;
}
drmFreeVersion(info);
#endif #endif
{
av_log(ctx, AV_LOG_VERBOSE, "Trying to use " av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
"DRM render node for device %d.\n", n); "DRM render node for device %d.\n", n);
}
break; break;
} }
if (n >= max_devices) if (n >= max_devices)