Skip to content

Commit fe96ef7

Browse files
authored
Update how nvidia drivers are filtered, to align with upstream (#104)
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
1 parent ffc5200 commit fe96ef7

1 file changed

Lines changed: 43 additions & 14 deletions

File tree

usr/lib/linuxmint/mintdrivers/mintdrivers.py

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -458,26 +458,58 @@ def gather_device_data(self, device):
458458
except KeyError:
459459
pass
460460

461-
# -open nvidia drivers are recommended now over normal ones. Go thru the list and get the version of the recommended one,
462-
# then we can flag the non-'open' one instead.
463-
new_recommended = None
461+
"""
462+
- Never show server drivers.
463+
- Pre 560: closed source drivers are recommended. Override any recommended -open drivers with the closed
464+
source equivalent.
465+
- Post 560 (02/13/2025: open-source drivers are recommended by their devs, and closed source drivers may
466+
not be available for a given version.
467+
"""
468+
ignored = []
469+
464470
for pkg_driver_name in device['drivers']:
465-
current_driver = device['drivers'][pkg_driver_name]
471+
if not pkg_driver_name.startswith("nvidia-"):
472+
continue
473+
if pkg_driver_name in ignored:
474+
print("Skipping ignored NVIDIA driver '%s'" % pkg_driver_name)
475+
continue
476+
if pkg_driver_name.endswith(("-server", "-server-open")):
477+
print("Ignoring server NVIDIA driver '%s'" % pkg_driver_name)
478+
ignored.append(pkg_driver_name)
479+
continue
480+
466481
try:
467-
if current_driver['recommended'] and current_driver['from_distro']:
468-
driver_status = 'recommended'
469-
if pkg_driver_name.endswith("-open"):
470-
new_recommended = pkg_driver_name.replace("-open", "")
471-
except KeyError:
472-
pass
482+
version = int(re.search(r"nvidia-driver-([0-9]{3}).*", pkg_driver_name).groups()[0])
483+
open_preferred = version >= 560
484+
except:
485+
open_preferred = False
486+
487+
is_open = pkg_driver_name.endswith("-open")
488+
current_driver = device['drivers'][pkg_driver_name]
489+
recommended = current_driver.get("recommended", False) and current_driver.get("from_distro", False)
490+
491+
if is_open:
492+
closed_name = pkg_driver_name.replace("-open", "")
493+
has_closed = closed_name in device['drivers']
494+
if has_closed:
495+
if open_preferred:
496+
print("Ignoring closed NVIDIA driver '%s' as the open one is preferred." % closed_name)
497+
ignored.append(closed_name)
498+
else:
499+
print("Ignoring open NVIDIA driver '%s' as a closed one exists and is preferred." % pkg_driver_name)
500+
if recommended:
501+
device['drivers'][closed_name]["recommended"] = True
502+
ignored.append(pkg_driver_name)
473503

474504
for pkg_driver_name in device['drivers']:
505+
if pkg_driver_name in ignored:
506+
continue
475507
current_driver = device['drivers'][pkg_driver_name]
476508

477509
# get general status
478510
driver_status = 'alternative'
479511
try:
480-
if (current_driver['recommended'] and current_driver['from_distro']) or pkg_driver_name == new_recommended:
512+
if (current_driver['recommended'] and current_driver['from_distro']):
481513
driver_status = 'recommended'
482514
except KeyError:
483515
pass
@@ -657,9 +689,6 @@ def show_drivers(self):
657689
# define the order of introspection
658690
for section in ('recommended', 'alternative', 'manually_installed', 'no_driver'):
659691
for driver in sorted(drivers[section], key=lambda x: self.sort_string(drivers[section], x), reverse=True):
660-
if str(driver).startswith("nvidia-driver") and str(driver).endswith(("-server", "-open")):
661-
print("Ignoring server or open NVIDIA driver: ", driver)
662-
continue
663692
radio_button = Gtk.RadioButton.new(None)
664693
label = Gtk.Label()
665694
label.set_markup(drivers[section][driver]['description'])

0 commit comments

Comments
 (0)