summaryrefslogtreecommitdiff
path: root/source/x/mesa/patches/MESA_VK_DEVICE_SELECT.uint32_t.patch
blob: 8f9bc231257a667f6b12e1eb3f2450233091dd1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
diff --git a/src/vulkan/device-select-layer/device_select.h b/src/vulkan/device-select-layer/device_select.h
index 2335070..8debb77 100644
--- a/src/vulkan/device-select-layer/device_select.h
+++ b/src/vulkan/device-select-layer/device_select.h
@@ -24,10 +24,18 @@
 #define DEVICE_SELECT_H
 
 #include <stdbool.h>
+#include <stdint.h>
 #include "xf86drm.h"
 
+/* We don't use `drmPciDeviceInfo` because it uses 16-bit ids,
+ * instead of Vulkan's 32-bit ones */
+struct device_info {
+  uint32_t vendor_id;
+  uint32_t device_id;
+};
+
 struct device_pci_info {
-  drmPciDeviceInfo dev_info;
+  struct device_info dev_info;
   drmPciBusInfo bus_info;
   bool has_bus_info;
   bool cpu_device;
diff --git a/src/vulkan/device-select-layer/device_select_layer.c b/src/vulkan/device-select-layer/device_select_layer.c
index 5b708bc..bd18511 100644
--- a/src/vulkan/device-select-layer/device_select_layer.c
+++ b/src/vulkan/device-select-layer/device_select_layer.c
@@ -222,7 +222,7 @@ static void print_gpu(const struct instance_info *info, unsigned index, VkPhysic
       type = "CPU";
       break;
    }
-   fprintf(stderr, "  GPU %d: %x:%x \"%s\" %s", index, properties.properties.vendorID,
+   fprintf(stderr, "  GPU %d: 0x%04x:0x%04x \"%s\" %s", index, properties.properties.vendorID,
            properties.properties.deviceID, properties.properties.deviceName, type);
    if (info->has_pci_bus)
       fprintf(stderr, " %04x:%02x:%02x.%x", ext_pci_properties.pciDomain,
@@ -267,18 +267,18 @@ static int device_select_find_explicit_default(struct device_pci_info *pci_infos
                                                uint32_t device_count,
                                                const char *selection)
 {
-   int default_idx = -1;
-   unsigned vendor_id, device_id;
+   uint32_t vendor_id, device_id;
    int matched = sscanf(selection, "%x:%x", &vendor_id, &device_id);
-   if (matched != 2)
-      return default_idx;
+   if (matched != 2) {
+      return -1;
+   }
 
    for (unsigned i = 0; i < device_count; ++i) {
       if (pci_infos[i].dev_info.vendor_id == vendor_id &&
           pci_infos[i].dev_info.device_id == device_id)
-         default_idx = i;
+         return i;
    }
-   return default_idx;
+   return -1;
 }
 
 static int device_select_find_dri_prime_tag_default(struct device_pci_info *pci_infos,
@@ -378,8 +378,14 @@ static uint32_t get_default_device(const struct instance_info *info,
       cpu_count += fill_drm_device_info(info, &pci_infos[i], pPhysicalDevices[i]) ? 1 : 0;
    }
 
-   if (selection)
+   if (selection) {
       default_idx = device_select_find_explicit_default(pci_infos, physical_device_count, selection);
+      if (default_idx == -1) {
+         fprintf(stderr, "device-select: cannot find device vendorID:deviceID match "
+                         "using MESA_VK_DEVICE_SELECT=%s. Use 'list' for available devices.\n", selection);
+         exit(0);
+      }
+   }
    if (default_idx == -1 && info->has_pci_bus && dri_prime && !dri_prime_is_one)
       default_idx = device_select_find_dri_prime_tag_default(pci_infos, physical_device_count, dri_prime);
    if (default_idx == -1 && info->has_wayland)