From 6ed77fce1b118cf5dcb3ca925c0639e38034a32d Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Sat, 15 Feb 2025 10:34:12 -0500 Subject: [PATCH] Update how nvidia drivers are filtered, to align with upstream recommendations. NVIDIA recommends open drivers for 560 and later. Flip the closed-vs- open preference when these newer drivers are encountered. New rules: - No server drivers. - No open drivers under 560, unless nothing else is available. - No closed drivers 560 and above, unless nothing else is available. - Only distro/default drivers can be 'recommended', not PPA. ref: https://bugs.launchpad.net/ubuntu/+source/ubuntu-drivers-common/+bug/2081967 --- usr/lib/linuxmint/mintdrivers/mintdrivers.py | 57 +++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/usr/lib/linuxmint/mintdrivers/mintdrivers.py b/usr/lib/linuxmint/mintdrivers/mintdrivers.py index b41b052..a829e11 100755 --- a/usr/lib/linuxmint/mintdrivers/mintdrivers.py +++ b/usr/lib/linuxmint/mintdrivers/mintdrivers.py @@ -458,26 +458,58 @@ def gather_device_data(self, device): except KeyError: pass - # -open nvidia drivers are recommended now over normal ones. Go thru the list and get the version of the recommended one, - # then we can flag the non-'open' one instead. - new_recommended = None + """ + - Never show server drivers. + - Pre 560: closed source drivers are recommended. Override any recommended -open drivers with the closed + source equivalent. + - Post 560 (02/13/2025: open-source drivers are recommended by their devs, and closed source drivers may + not be available for a given version. + """ + ignored = [] + for pkg_driver_name in device['drivers']: - current_driver = device['drivers'][pkg_driver_name] + if not pkg_driver_name.startswith("nvidia-"): + continue + if pkg_driver_name in ignored: + print("Skipping ignored NVIDIA driver '%s'" % pkg_driver_name) + continue + if pkg_driver_name.endswith(("-server", "-server-open")): + print("Ignoring server NVIDIA driver '%s'" % pkg_driver_name) + ignored.append(pkg_driver_name) + continue + try: - if current_driver['recommended'] and current_driver['from_distro']: - driver_status = 'recommended' - if pkg_driver_name.endswith("-open"): - new_recommended = pkg_driver_name.replace("-open", "") - except KeyError: - pass + version = int(re.search(r"nvidia-driver-([0-9]{3}).*", pkg_driver_name).groups()[0]) + open_preferred = version >= 560 + except: + open_preferred = False + + is_open = pkg_driver_name.endswith("-open") + current_driver = device['drivers'][pkg_driver_name] + recommended = current_driver.get("recommended", False) and current_driver.get("from_distro", False) + + if is_open: + closed_name = pkg_driver_name.replace("-open", "") + has_closed = closed_name in device['drivers'] + if has_closed: + if open_preferred: + print("Ignoring closed NVIDIA driver '%s' as the open one is preferred." % closed_name) + ignored.append(closed_name) + else: + print("Ignoring open NVIDIA driver '%s' as a closed one exists and is preferred." % pkg_driver_name) + if recommended: + device['drivers'][closed_name]["recommended"] = True + ignored.append(pkg_driver_name) for pkg_driver_name in device['drivers']: + if pkg_driver_name in ignored: + continue current_driver = device['drivers'][pkg_driver_name] # get general status driver_status = 'alternative' try: - if (current_driver['recommended'] and current_driver['from_distro']) or pkg_driver_name == new_recommended: + if (current_driver['recommended'] and current_driver['from_distro']): driver_status = 'recommended' except KeyError: pass @@ -657,9 +689,6 @@ def show_drivers(self): # define the order of introspection for section in ('recommended', 'alternative', 'manually_installed', 'no_driver'): for driver in sorted(drivers[section], key=lambda x: self.sort_string(drivers[section], x), reverse=True): - if str(driver).startswith("nvidia-driver") and str(driver).endswith(("-server", "-open")): - print("Ignoring server or open NVIDIA driver: ", driver) - continue radio_button = Gtk.RadioButton.new(None) label = Gtk.Label() label.set_markup(drivers[section][driver]['description'])