[Mesa-dev] [PATCH 5/6] radv: do not open random render node(s)
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Tue Dec 20 22:47:39 UTC 2016
On Fri, Dec 2, 2016 at 5:31 PM, Emil Velikov <emil.l.velikov at gmail.com> 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.
>
> 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>
> ---
> Afacit there is no system with more than one Intel GPU, but on the other
> hand one can easily have setup with many AMD cards.
>
> Dave, any reason why we are capped at 1 device ?
Leftover from anv.
Patches 4 and 5 are
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
> ---
> src/amd/vulkan/radv_device.c | 51 +++++++++++++++++++++++++++++++-------------
> 1 file changed, 36 insertions(+), 15 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index 0defc0f..3eea0cd 100644
> --- a/src/amd/vulkan/radv_device.c
> +++ b/src/amd/vulkan/radv_device.c
> @@ -300,6 +300,39 @@ void radv_DestroyInstance(
> vk_free(&instance->alloc, instance);
> }
>
> +static VkResult
> +radv_enumerate_devices(struct radv_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 == 0x1002) {
> +
> + result = radv_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 radv_EnumeratePhysicalDevices(
> VkInstance _instance,
> uint32_t* pPhysicalDeviceCount,
> @@ -309,22 +342,10 @@ VkResult radv_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 = radv_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 = radv_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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list