From: Emil Velikov <emil.veli...@collabora.com> drmGetDevices2() provides us with enough flexibility to build heuristics upon. Opening a random node on the other hand will wake up the device, regardless if it's the one we're interested or not.
v2: - Explicitly require/check for libdrm. - Zero physicalDeviceCount when drmGetDevices2() returns < 1 devices. Cc: Jason Ekstrand <jason.ekstr...@intel.com> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Eric Engestrom <eric.engest...@imgtec.com> (v1) --- configure.ac | 1 + src/intel/vulkan/Makefile.am | 3 ++- src/intel/vulkan/anv_device.c | 53 +++++++++++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index 4b7f2298f7..23ce256da6 100644 --- a/configure.ac +++ b/configure.ac @@ -1780,6 +1780,7 @@ if test -n "$with_vulkan_drivers"; then if test "x$HAVE_I965_DRI" != xyes; then AC_MSG_ERROR([Intel Vulkan driver requires the i965 dri driver]) fi + require_libdrm "ANV" HAVE_INTEL_VULKAN=yes; ;; diff --git a/src/intel/vulkan/Makefile.am b/src/intel/vulkan/Makefile.am index 95f276ed7e..bf2590e643 100644 --- a/src/intel/vulkan/Makefile.am +++ b/src/intel/vulkan/Makefile.am @@ -68,7 +68,7 @@ AM_CPPFLAGS += \ endif AM_CPPFLAGS += \ - $(INTEL_CFLAGS) \ + $(LIBDRM_CFLAGS) \ $(VALGRIND_CFLAGS) \ $(DEFINES) @@ -133,6 +133,7 @@ VULKAN_LIB_DEPS += \ $(top_builddir)/src/intel/isl/libisl.la \ $(top_builddir)/src/intel/blorp/libblorp.la \ $(PER_GEN_LIBS) \ + $(LIBDRM_LIBS) \ $(PTHREAD_LIBS) \ $(DLOPEN_LIBS) \ -lm diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index d1a6cc8e9c..808f6f18cc 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -29,6 +29,7 @@ #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> +#include <xf86drm.h> #include "anv_private.h" #include "util/strtod.h" @@ -388,6 +389,40 @@ void anv_DestroyInstance( vk_free(&instance->alloc, instance); } +static VkResult +anv_enumerate_devices(struct anv_instance *instance) +{ + /* TODO: Check for more devices ? */ + drmDevicePtr devices[8]; + VkResult result = VK_SUCCESS; + int max_devices; + + instance->physicalDeviceCount = 0; + + max_devices = drmGetDevices2(0, devices, sizeof(devices)); + if (max_devices < 1) + return VK_ERROR_INCOMPATIBLE_DRIVER; + + for (unsigned i = 0; i < (unsigned)max_devices; i++) { + if (devices[i]->available_nodes & 1 << DRM_NODE_RENDER && + devices[i]->bustype == DRM_BUS_PCI && + devices[i]->deviceinfo.pci->vendor_id == 0x8086) { + + result = anv_physical_device_init(&instance->physicalDevice, + instance, + devices[i]->nodes[DRM_NODE_RENDER]); + if (result != VK_ERROR_INCOMPATIBLE_DRIVER) + break; + } + } + + if (result == VK_SUCCESS) + instance->physicalDeviceCount = 1; + + return result; +} + + VkResult anv_EnumeratePhysicalDevices( VkInstance _instance, uint32_t* pPhysicalDeviceCount, @@ -397,22 +432,10 @@ VkResult anv_EnumeratePhysicalDevices( VkResult result; if (instance->physicalDeviceCount < 0) { - char path[20]; - for (unsigned i = 0; i < 8; i++) { - snprintf(path, sizeof(path), "/dev/dri/renderD%d", 128 + i); - result = anv_physical_device_init(&instance->physicalDevice, - instance, path); - if (result != VK_ERROR_INCOMPATIBLE_DRIVER) - break; - } - - if (result == VK_ERROR_INCOMPATIBLE_DRIVER) { - instance->physicalDeviceCount = 0; - } else if (result == VK_SUCCESS) { - instance->physicalDeviceCount = 1; - } else { + result = anv_enumerate_devices(instance); + if (result != VK_SUCCESS && + result != VK_ERROR_INCOMPATIBLE_DRIVER) return result; - } } /* pPhysicalDeviceCount is an out parameter if pPhysicalDevices is NULL; -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev