int i, num_devices, fd = -1;
struct {
enum {
- PRIME_IS_ONE,
+ PRIME_IS_INTEGER,
PRIME_IS_VID_DID,
PRIME_IS_PCI_TAG
} semantics;
union {
+ int as_integer;
struct {
uint16_t v, d;
} as_vendor_device_ids;
prime.v.as_vendor_device_ids.v = vendor_id;
prime.v.as_vendor_device_ids.d = device_id;
} else {
- if (strcmp(prime.str, "1") == 0) {
- prime.semantics = PRIME_IS_ONE;
- } else {
+ int i = atoi(prime.str);
+ if (i < 0 || strcmp(prime.str, "0") == 0) {
+ printf("Invalid value (%d) for DRI_PRIME. Should be > 0\n", i);
+ goto err;
+ } else if (i == 0) {
prime.semantics = PRIME_IS_PCI_TAG;
+ } else {
+ prime.semantics = PRIME_IS_INTEGER;
+ prime.v.as_integer = i;
}
}
}
if (num_devices <= 0)
goto err;
+ if (prime.semantics == PRIME_IS_INTEGER &&
+ prime.v.as_integer >= num_devices) {
+ printf("Inconsistent value (%d) for DRI_PRIME. Should be < %d "
+ "(GPU devices count). Using: %d\n",
+ prime.v.as_integer, num_devices, num_devices - 1);
+ prime.v.as_integer = num_devices - 1;
+ }
+
for (i = 0; i < num_devices; i++) {
if (!(devices[i]->available_nodes & 1 << DRM_NODE_RENDER))
continue;
* vendor_id:device_id
*/
switch (prime.semantics) {
- case PRIME_IS_ONE: {
+ case PRIME_IS_INTEGER: {
/* Skip the default device */
if (drm_device_matches_tag(devices[i], default_tag))
continue;
+ prime.v.as_integer--;
+
+ /* Skip more GPUs? */
+ if (prime.v.as_integer)
+ continue;
break;
}
continue;
}
case PRIME_IS_PCI_TAG: {
- if (!drm_device_matches_tag(devices[i], prime.str)) {
+ if (!drm_device_matches_tag(devices[i], prime.str))
continue;
- }
+
break;
}
}