[Mesa-dev] [PATCH 6/6] anv: do not open random render node(s)

Eric Engestrom eric.engestrom at imgtec.com
Fri Dec 2 17:33:42 UTC 2016


On Friday, 2016-12-02 16:31:49 +0000, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at 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 intereseted or not.

"interested"
(same in the previous patch)

> 
> Cc: Jason Ekstrand <jason.ekstrand at intel.com>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  src/intel/vulkan/Makefile.am  |  3 ++-
>  src/intel/vulkan/anv_device.c | 53 +++++++++++++++++++++++++++++++------------
>  2 files changed, 40 insertions(+), 16 deletions(-)
> 
> diff --git a/src/intel/vulkan/Makefile.am b/src/intel/vulkan/Makefile.am
> index df7645f..e309491 100644
> --- a/src/intel/vulkan/Makefile.am
> +++ b/src/intel/vulkan/Makefile.am
> @@ -66,7 +66,7 @@ AM_CPPFLAGS += \
>  endif
>  
>  AM_CPPFLAGS += \
> -	$(INTEL_CFLAGS) \
> +	$(LIBDRM_CFLAGS) \
>  	$(VALGRIND_CFLAGS) \
>  	$(DEFINES)
>  
> @@ -131,6 +131,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

Unrelated -> separate patch?

> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index d594df7..9927ac2 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"
> @@ -375,6 +376,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;
> +
> +   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) {

Yay, magic values!
I feel like we should replace all those with PCI_VENDOR_INTEL or something.

Anyway, series is
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

> +
> +         result = anv_physical_device_init(&instance->physicalDevice,
> +                        instance,
> +                        devices[i]->nodes[DRM_NODE_RENDER]);
> +         if (result != VK_ERROR_INCOMPATIBLE_DRIVER)
> +            break;
> +      }
> +   }
> +
> +   if (result == VK_ERROR_INCOMPATIBLE_DRIVER)
> +      instance->physicalDeviceCount = 0;
> +   else if (result == VK_SUCCESS)
> +      instance->physicalDeviceCount = 1;
> +
> +   return result;
> +}
> +
> +
>  VkResult anv_EnumeratePhysicalDevices(
>      VkInstance                                  _instance,
>      uint32_t*                                   pPhysicalDeviceCount,
> @@ -384,22 +419,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.10.2
> 


More information about the mesa-dev mailing list