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: Rebase. Cc: Michel Dänzer <michel.daen...@amd.com> Cc: Dave Airlie <airl...@redhat.com> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> (v1) Reviewed-by: Eric Engestrom <eric.engest...@imgtec.com> (v1) --- src/amd/vulkan/radv_device.c | 48 +++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 1132eeb52d..a0080933ad 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -384,28 +384,52 @@ void radv_DestroyInstance( vk_free(&instance->alloc, instance); } -VkResult radv_EnumeratePhysicalDevices( - VkInstance _instance, - uint32_t* pPhysicalDeviceCount, - VkPhysicalDevice* pPhysicalDevices) +static VkResult +radv_enumerate_devices(struct radv_instance *instance) { - RADV_FROM_HANDLE(radv_instance, instance, _instance); - VkResult result; + /* 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 == 0x1002) { - if (instance->physicalDeviceCount < 0) { - char path[20]; - instance->physicalDeviceCount = 0; - for (unsigned i = 0; i < RADV_MAX_DRM_DEVICES; i++) { - snprintf(path, sizeof(path), "/dev/dri/renderD%d", 128 + i); result = radv_physical_device_init(instance->physicalDevices + instance->physicalDeviceCount, - instance, path); + instance, + devices[i]->nodes[DRM_NODE_RENDER]); if (result == VK_SUCCESS) ++instance->physicalDeviceCount; else if (result != VK_ERROR_INCOMPATIBLE_DRIVER) return result; } } + return result; +} + +VkResult radv_EnumeratePhysicalDevices( + VkInstance _instance, + uint32_t* pPhysicalDeviceCount, + VkPhysicalDevice* pPhysicalDevices) +{ + RADV_FROM_HANDLE(radv_instance, instance, _instance); + VkResult result; + + if (instance->physicalDeviceCount < 0) { + result = radv_enumerate_devices(instance); + if (result != VK_SUCCESS && + result != VK_ERROR_INCOMPATIBLE_DRIVER) + return result; + } if (!pPhysicalDevices) { *pPhysicalDeviceCount = instance->physicalDeviceCount; -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev