diff --git a/src/loader/loader.c b/src/loader/loader.c index 5b5c8b196a7..977e1fae4c1 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -47,6 +47,7 @@ #include #include "mesa_interface.h" #include "loader.h" +#include "util/drm_is_nouveau.h" #include "util/libdrm.h" #include "util/os_file.h" #include "util/os_misc.h" @@ -138,6 +139,10 @@ iris_predicate(int fd, const char *driver) bool nouveau_zink_predicate(int fd, const char *driver) { + /* Never load on nv proprietary driver */ + if (!drm_fd_is_nouveau(fd)) + return false; + #if !defined(HAVE_NVK) || !defined(HAVE_ZINK) if (!strcmp(driver, "zink")) return false; diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_pdev.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_pdev.c index a25f7eba5bb..4cd8c7a5a2f 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_pdev.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_pdev.c @@ -7,6 +7,7 @@ #include "nouveau_device.h" #include "util/os_misc.h" +#include "util/drm_is_nouveau.h" #include "vk_log.h" #include @@ -21,15 +22,7 @@ drm_device_is_nouveau(const char *path) if (fd < 0) return false; - drmVersionPtr ver = drmGetVersion(fd); - if (!ver) { - close(fd); - return false; - } - - const bool is_nouveau = !strncmp("nouveau", ver->name, ver->name_len); - - drmFreeVersion(ver); + const bool is_nouveau = drm_fd_is_nouveau(fd); close(fd); return is_nouveau; diff --git a/src/util/drm_is_nouveau.h b/src/util/drm_is_nouveau.h new file mode 100644 index 00000000000..d953683b56b --- /dev/null +++ b/src/util/drm_is_nouveau.h @@ -0,0 +1,18 @@ +#ifndef DRM_IS_NOUVEAU +#define DRM_IS_NOUVEAU + +#include "util/libdrm.h" + +static inline bool +drm_fd_is_nouveau(int fd) +{ + drmVersionPtr ver = drmGetVersion(fd); + if (!ver) { + return false; + } + const bool is_nouveau = !strncmp("nouveau", ver->name, ver->name_len); + drmFreeVersion(ver); + return is_nouveau; +} + +#endif