Having one function that tries to accomodate the different decision trees for the three different #ifdef cases makes the logic hard to follow. Now that most of the complexity in loader_get_driver_for_fd() has been split out in helper functions, we can just move loader_get_driver_for_fd() into the #ifdefs and simplify the code for each case.
Signed-off-by: Kristian Høgsberg <k...@bitplanet.net> --- src/loader/loader.c | 62 +++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/src/loader/loader.c b/src/loader/loader.c index 7131d46..9bd3561 100644 --- a/src/loader/loader.c +++ b/src/loader/loader.c @@ -212,8 +212,8 @@ udev_device_new_from_fd(struct udev *udev, int fd) return device; } -static int -loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id, char **driver) +char * +loader_get_driver_for_fd(int fd, unsigned int driver_types) { struct udev *udev = NULL; struct udev_device *device = NULL, *parent; @@ -227,9 +227,8 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id, char **driver) (struct udev_device *)); UDEV_SYMBOL(struct udev *, udev_unref, (struct udev *)); const char *hwdb_driver; - - *chip_id = -1; - *driver = NULL; + int vendor_id, chip_id; + char *driver = NULL; udev = udev_new(); device = udev_device_new_from_fd(udev, fd); @@ -245,25 +244,25 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id, char **driver) hwdb_driver = udev_device_get_property_value(parent, "DRI_DRIVER"); if (hwdb_driver != NULL) { log_(_LOADER_INFO, "using driver %s from udev hwdb", driver); - *driver = strdup(hwdb_driver); + driver = strdup(hwdb_driver); goto out; } pci_id = udev_device_get_property_value(parent, "PCI_ID"); - if (pci_id == NULL || - sscanf(pci_id, "%x:%x", vendor_id, chip_id) != 2) { - log_(_LOADER_WARNING, "MESA-LOADER: malformed or no PCI ID\n"); - *chip_id = -1; + if (pci_id && sscanf(pci_id, "%x:%x", &vendor_id, &chip_id) == 2) { + driver = lookup_driver_for_pci_id(vendor_id, chip_id, driver_types); goto out; } + driver = fallback_to_kernel_name(fd); + out: if (device) udev_device_unref(device); if (udev) udev_unref(udev); - return (*driver != NULL) || (*chip_id >= 0); + return driver; } #elif defined(ANDROID) && defined(__HAVE_DRM_H) @@ -338,12 +337,26 @@ loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id, char **driver) return (*chip_id >= 0); } +char * +loader_get_driver_for_fd(int fd, unsigned int driver_types) +{ + int vendor_id, chip_id; + + if (!driver_types) + driver_types = _LOADER_GALLIUM | _LOADER_DRI; + + if (!loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id)) + return fallback_to_kernel_name(fd); + + return lookup_driver_for_pci_id(vendor_id, chip_id, driver_types); +} + #else -int -loader_get_pci_id_for_fd(int fd, int *vendor_id, int *chip_id, char **driver) +char * +loader_get_driver_for_fd(int fd, unsigned int driver_types) { - return 0; + return fallback_to_kernel_name(fd); } #endif @@ -381,27 +394,6 @@ out: return device_name; } -char * -loader_get_driver_for_fd(int fd, unsigned int driver_types) -{ - int vendor_id, chip_id; - char *driver = NULL; - - if (!driver_types) - driver_types = _LOADER_GALLIUM | _LOADER_DRI; - - if (!loader_get_pci_id_for_fd(fd, &vendor_id, &chip_id, &driver)) - return fallback_to_kernel_name(fd); - - if (driver == NULL) - driver = lookup_driver_for_pci_id(vendor_id, chip_id, driver_types); - - if (driver == NULL) - log_(_LOADER_WARNING, "no driver %s for %d\n", fd); - - return driver; -} - void loader_set_logger(void (*logger)(int level, const char *fmt, ...)) { -- 1.8.4.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev