vulkan/device_select: don't pick a cpu driver as the default

This should stop apps using vallium by accident, when there
are better options.

Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6552>
This commit is contained in:
Dave Airlie 2020-09-02 09:08:52 +10:00 committed by Marge Bot
parent be31398d22
commit afa1fba198
2 changed files with 41 additions and 10 deletions

View File

@ -30,6 +30,7 @@ struct device_pci_info {
drmPciDeviceInfo dev_info;
drmPciBusInfo bus_info;
bool has_bus_info;
bool cpu_device;
};
#ifdef VK_USE_PLATFORM_XCB_KHR

View File

@ -231,7 +231,7 @@ static void print_gpu(const struct instance_info *info, unsigned index, VkPhysic
fprintf(stderr, "\n");
}
static void fill_drm_device_info(const struct instance_info *info,
static bool fill_drm_device_info(const struct instance_info *info,
struct device_pci_info *drm_device,
VkPhysicalDevice device)
{
@ -250,6 +250,7 @@ static void fill_drm_device_info(const struct instance_info *info,
else
info->GetPhysicalDeviceProperties(device, &properties.properties);
drm_device->cpu_device = properties.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU;
drm_device->dev_info.vendor_id = properties.properties.vendorID;
drm_device->dev_info.device_id = properties.properties.deviceID;
if (info->has_pci_bus) {
@ -259,6 +260,7 @@ static void fill_drm_device_info(const struct instance_info *info,
drm_device->bus_info.dev = ext_pci_properties.pciDevice;
drm_device->bus_info.func = ext_pci_properties.pciFunction;
}
return drm_device->cpu_device;
}
static int device_select_find_explicit_default(struct device_pci_info *pci_infos,
@ -323,6 +325,35 @@ static int device_select_find_boot_vga_default(struct device_pci_info *pci_infos
return default_idx;
}
static int device_select_find_non_cpu(struct device_pci_info *pci_infos,
uint32_t device_count)
{
int default_idx = -1;
/* pick first GPU device */
for (unsigned i = 0; i < device_count; ++i) {
if (!pci_infos[i].cpu_device){
default_idx = i;
break;
}
}
return default_idx;
}
static int find_non_cpu_skip(struct device_pci_info *pci_infos,
uint32_t device_count,
int skip_idx)
{
for (unsigned i = 0; i < device_count; ++i) {
if (i == skip_idx)
continue;
if (pci_infos[i].cpu_device)
continue;
return i;
}
return -1;
}
static uint32_t get_default_device(const struct instance_info *info,
const char *selection,
uint32_t physical_device_count,
@ -331,7 +362,7 @@ static uint32_t get_default_device(const struct instance_info *info,
int default_idx = -1;
const char *dri_prime = getenv("DRI_PRIME");
bool dri_prime_is_one = false;
int cpu_count = 0;
if (dri_prime && !strcmp(dri_prime, "1"))
dri_prime_is_one = true;
@ -344,7 +375,7 @@ static uint32_t get_default_device(const struct instance_info *info,
return 0;
for (unsigned i = 0; i < physical_device_count; ++i) {
fill_drm_device_info(info, &pci_infos[i], pPhysicalDevices[i]);
cpu_count += fill_drm_device_info(info, &pci_infos[i], pPhysicalDevices[i]) ? 1 : 0;
}
if (selection)
@ -355,16 +386,15 @@ static uint32_t get_default_device(const struct instance_info *info,
default_idx = device_select_find_wayland_pci_default(pci_infos, physical_device_count);
if (default_idx == -1 && info->has_xcb)
default_idx = device_select_find_xcb_pci_default(pci_infos, physical_device_count);
if (info->has_pci_bus && default_idx == -1) {
if (default_idx == -1 && info->has_pci_bus)
default_idx = device_select_find_boot_vga_default(pci_infos, physical_device_count);
}
if (default_idx == -1 && cpu_count)
default_idx = device_select_find_non_cpu(pci_infos, physical_device_count);
/* DRI_PRIME=1 handling - pick any other device than default. */
if (default_idx != -1 && dri_prime_is_one && physical_device_count > 1) {
if (default_idx == 0)
default_idx = 1;
else if (default_idx == 1)
default_idx = 0;
if (default_idx != -1 && dri_prime_is_one && physical_device_count > (cpu_count + 1)) {
if (default_idx == 0 || default_idx == 1)
default_idx = find_non_cpu_skip(pci_infos, physical_device_count, default_idx);
}
free(pci_infos);
return default_idx == -1 ? 0 : default_idx;