mirror of
https://github.com/moonlight-stream/moonlight-qt
synced 2024-12-14 13:22:27 +00:00
Fix failure to try the default VAAPI driver with the modified LIBVA_DRIVERS_PATH
This commit is contained in:
parent
b3b49b440e
commit
b9019831a9
1 changed files with 23 additions and 2 deletions
|
@ -138,26 +138,40 @@ VAAPIRenderer::initialize(PDECODER_PARAMETERS params)
|
||||||
|
|
||||||
int major, minor;
|
int major, minor;
|
||||||
VAStatus status;
|
VAStatus status;
|
||||||
|
bool setPathVar = false;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
||||||
if (status != VA_STATUS_SUCCESS && qEnvironmentVariableIsEmpty("LIBVA_DRIVER_NAME")) {
|
if (status != VA_STATUS_SUCCESS && qEnvironmentVariableIsEmpty("LIBVA_DRIVER_NAME")) {
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
"Trying fallback VAAPI driver names");
|
"Trying fallback VAAPI driver names");
|
||||||
|
|
||||||
|
// It would be nice to use vaSetDriverName() here, but there's no way to unset
|
||||||
|
// it and get back to the default driver selection logic once we've overridden
|
||||||
|
// the driver name using that API. As a result, we must use LIBVA_DRIVER_NAME.
|
||||||
|
|
||||||
if (status != VA_STATUS_SUCCESS) {
|
if (status != VA_STATUS_SUCCESS) {
|
||||||
// The iHD driver supports newer hardware like Ice Lake and Comet Lake.
|
// The iHD driver supports newer hardware like Ice Lake and Comet Lake.
|
||||||
// It should be picked by default on those platforms, but that doesn't
|
// It should be picked by default on those platforms, but that doesn't
|
||||||
// always seem to be the case for some reason.
|
// always seem to be the case for some reason.
|
||||||
vaSetDriverName(vaDeviceContext->display, const_cast<char*>("iHD"));
|
qputenv("LIBVA_DRIVER_NAME", "iHD");
|
||||||
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != VA_STATUS_SUCCESS) {
|
if (status != VA_STATUS_SUCCESS) {
|
||||||
// The Iris driver in Mesa 20.0 returns a bogus VA driver (iris_drv_video.so)
|
// The Iris driver in Mesa 20.0 returns a bogus VA driver (iris_drv_video.so)
|
||||||
// even though the correct driver is still i965. If we hit this path, we'll
|
// even though the correct driver is still i965. If we hit this path, we'll
|
||||||
// explicitly try i965 to handle this case.
|
// explicitly try i965 to handle this case.
|
||||||
vaSetDriverName(vaDeviceContext->display, const_cast<char*>("i965"));
|
qputenv("LIBVA_DRIVER_NAME", "i965");
|
||||||
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
status = vaInitialize(vaDeviceContext->display, &major, &minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status != VA_STATUS_SUCCESS) {
|
||||||
|
// Unset LIBVA_DRIVER_NAME if none of the drivers we tried worked. This ensures
|
||||||
|
// we will get a fresh start using the default driver selection behavior after
|
||||||
|
// setting LIBVA_DRIVERS_PATH in the code below.
|
||||||
|
qunsetenv("LIBVA_DRIVER_NAME");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == VA_STATUS_SUCCESS) {
|
if (status == VA_STATUS_SUCCESS) {
|
||||||
|
@ -182,8 +196,15 @@ VAAPIRenderer::initialize(PDECODER_PARAMETERS params)
|
||||||
"/usr/lib/i386-linux-gnu/dri:" // Ubuntu/Debian i386
|
"/usr/lib/i386-linux-gnu/dri:" // Ubuntu/Debian i386
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
setPathVar = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (setPathVar) {
|
||||||
|
// Unset LIBVA_DRIVERS_PATH if we set it ourselves
|
||||||
|
// and we didn't find any working VAAPI drivers.
|
||||||
|
qunsetenv("LIBVA_DRIVERS_PATH");
|
||||||
|
}
|
||||||
|
|
||||||
// Give up
|
// Give up
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue