[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