On Wed, Feb 15, 2017 at 10:51 AM, Emil Velikov <emil.l.veli...@gmail.com> wrote: > 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;
so result = VK_SUCCESS > + > + 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) { let's say this never triggers > + > + result = anv_physical_device_init(&instance->physicalDevice, > + instance, > + devices[i]->nodes[DRM_NODE_RENDER]); > + if (result != VK_ERROR_INCOMPATIBLE_DRIVER) > + break; > + } > + } result is still VK_SUCCESS. Seems like it should default to VK_ERROR_INCOMPATIBLE_DRIVER instead? > + > + 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev