Mesa (master): radv: do not open random render node(s)

Emil Velikov evelikov at kemper.freedesktop.org
Wed Mar 15 11:42:36 UTC 2017


Module: Mesa
Branch: master
Commit: 743315f2696d77bc731baefdc9433994d3a4cfb3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=743315f2696d77bc731baefdc9433994d3a4cfb3

Author: Emil Velikov <emil.velikov at collabora.com>
Date:   Thu Dec  1 20:58:20 2016 +0000

radv: do not open random render node(s)

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.
v3: Return VK_ERROR_INCOMPATIBLE_DRIVER for no devices (Ilia)

Cc: Michel Dänzer <michel.daenzer at amd.com>
Cc: Dave Airlie <airlied at redhat.com>
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl> (v1)
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com> (v1)
Tested-by: Mike Lothian <mike at fireburn.co.uk>

---

 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 d1fd58d..bc136e4 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -379,28 +379,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_ERROR_INCOMPATIBLE_DRIVER;
+	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;




More information about the mesa-commit mailing list