From b9425b012c2fa846cadef1d91f6567a1bff11d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Fri, 24 Jul 2026 10:09:00 +0200 Subject: [PATCH] Added basic functionnality --- client/gpu-detect.sh | 182 +++++++++++ server/generate_intel_ids.py | 116 +++++++ server/generate_nvidia_ids.py | 120 +++++++ server/ids-database/amd/legacy.ids | 0 server/ids-database/intel/current/xe2-x3.ids | 18 ++ server/ids-database/intel/legacy/gen11.ids | 15 + server/ids-database/intel/legacy/gen5-gen7 | 81 +++++ server/ids-database/intel/legacy/gen8.ids | 28 ++ .../ids-database/intel/legacy/gen9-gen9.5.ids | 97 ++++++ .../ids-database/intel/legacy/unsupported.ids | 30 ++ server/ids-database/intel/legacy/xe.ids | 104 +++++++ .../ids-database/nvidia/current/current.ids | 293 ++++++++++++++++++ .../nvidia/current/legacy_580.ids | 162 ++++++++++ .../ids-database/nvidia/legacy/legacy_340.ids | 244 +++++++++++++++ .../ids-database/nvidia/legacy/legacy_390.ids | 120 +++++++ .../ids-database/nvidia/legacy/legacy_470.ids | 117 +++++++ .../nvidia/legacy/unsupported.ids | 236 ++++++++++++++ server/intel.md | 42 +++ server/nvidia.md | 32 ++ 19 files changed, 2037 insertions(+) create mode 100644 client/gpu-detect.sh create mode 100644 server/generate_intel_ids.py create mode 100644 server/generate_nvidia_ids.py create mode 100644 server/ids-database/amd/legacy.ids create mode 100644 server/ids-database/intel/current/xe2-x3.ids create mode 100644 server/ids-database/intel/legacy/gen11.ids create mode 100644 server/ids-database/intel/legacy/gen5-gen7 create mode 100644 server/ids-database/intel/legacy/gen8.ids create mode 100644 server/ids-database/intel/legacy/gen9-gen9.5.ids create mode 100644 server/ids-database/intel/legacy/unsupported.ids create mode 100644 server/ids-database/intel/legacy/xe.ids create mode 100644 server/ids-database/nvidia/current/current.ids create mode 100644 server/ids-database/nvidia/current/legacy_580.ids create mode 100644 server/ids-database/nvidia/legacy/legacy_340.ids create mode 100644 server/ids-database/nvidia/legacy/legacy_390.ids create mode 100644 server/ids-database/nvidia/legacy/legacy_470.ids create mode 100644 server/ids-database/nvidia/legacy/unsupported.ids create mode 100644 server/intel.md create mode 100644 server/nvidia.md diff --git a/client/gpu-detect.sh b/client/gpu-detect.sh new file mode 100644 index 0000000..f5867b0 --- /dev/null +++ b/client/gpu-detect.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p bash coreutils gnugrep gum +# +# Based on https://wiki.debian.org/NvidiaGraphicsDrivers?action=AttachFile&do=view&target=nvidia-versions.sh +# +# Copyright © 2026 Raphaël Numbus +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see + +gum style --border-foreground="030" --bold --border=normal --padding="0 2" "GPU detection tool for NixOS" + +declare -A args=( + ["brand"]="all" + ["hw_accel"]="true" +) + +while [[ $# -gt 0 ]]; do + case "${1}" in + --brand|-b) + args["brand"]="${2}" + shift 2 + ;; + --hw_accel|-hw) + args["hw_accel"]="${2}" + shift 2 + ;; + --help|-h|*) + echo "Usage: gpu-detect --brand=[all/amd/intel/nvidia] --hw_accel=[true/false] [PCIID]..." + echo "" + echo "For each GPU installed in your system, the program" + echo "will provide you the needed NixOS configuration." + exit 0 + ;; + esac +done + +shopt -s compat31 nocasematch 2>/dev/null || { echo "Error: this script only works with bash." && exit; } # Avoid cryptic failure when running dash on this script + +# last time the PCI IDs were updated +LATEST="#VERSION#" +PACKAGE= +RET=1 + +NV_DETECT() { + + +NVGA=${1} +IDLISTDIR=/usr/share/nvidia +local VERSIONS + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-71xx.ids 2>/dev/null +then + VERSIONS[71]=71.86 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-96xx.ids 2>/dev/null +then + VERSIONS[96]=96.43 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-173xx.ids 2>/dev/null +then + VERSIONS[173]=173.14 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-304xx.ids 2>/dev/null +then + VERSIONS[304]=304.123 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-340xx.ids 2>/dev/null +then + VERSIONS[340]=340.76 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-390xx.ids 2>/dev/null +then + VERSIONS[390]=390.87 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-legacy-390xx-amd64.ids 2>/dev/null +then + VERSIONS[391]=390.87 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-tesla-418.ids 2>/dev/null +then + VERSIONS[418]=418.87.01 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-tesla-470.ids 2>/dev/null +then + VERSIONS[470]=470.57.02 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-tesla-535.ids 2>/dev/null +then + VERSIONS[535]=535.216.01 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia-open.ids 2>/dev/null +then + VERSIONS[990]=515.48.07 +fi + +if grep -q -i $NVGA $IDLISTDIR/nvidia.ids 2>/dev/null +then + # 999 means current + VERSIONS[999]=$LATEST +fi + + +if [[ ${#VERSIONS[*]} == 0 ]]; then + echo "Uh oh. Your card is not supported by any driver version up to $LATEST." + echo "A newer driver may add support for your card." + echo "Newer driver releases may be available in backports, unstable or experimental." + return +fi + + + +if [ -n "$PACKAGE" ]; then + echo "It is recommended to install the" + echo " $PACKAGE" + echo "package." + RET=0 +fi + +} + + +if [ -z "${1}" ]; then + + if ! (lspci --version) > /dev/null 2>&1; then + echo "ERROR: The 'lspci' command was not found. Please install the 'pciutils' package." >&2 + exit 1 + fi + + NV_DEVICES=$(lspci -mn | awk '{ gsub("\"",""); if ((${2} ~ "030[0-2]") && ($3 == "10de" || $3 == "12d2")) { print ${1} } }') + + if [ -z "$NV_DEVICES" ]; then + echo "No NVIDIA GPU detected." + exit 0 + fi + + echo "Detected NVIDIA GPUs:" + for d in $NV_DEVICES ; do + lspci -nn -s $d + done + + for d in $NV_DEVICES ; do + echo -e "\nChecking card: $(lspci -s $d | awk -F: '{print $3}')" + NV_DETECT "$(lspci -mn -s "$d" | awk '{ gsub("\"",""); print $3 $4 }')" + done + +else + + for id in "$@" ; do + PCIID=$(echo "$id" | sed -rn 's/^(10de)?:?([0-9a-fA-F]{4})$/10de\2/ip') + if [ -z "$PCIID" ]; then + echo "Error parsing PCI ID '$id'." + exit 2 + fi + + echo "Checking driver support for PCI ID [$(echo $PCIID | sed -r 's/(....)(....)/\1:\2/')]" + NV_DETECT "$PCIID" + done + +fi + +exit $RET diff --git a/server/generate_intel_ids.py b/server/generate_intel_ids.py new file mode 100644 index 0000000..b242af8 --- /dev/null +++ b/server/generate_intel_ids.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +import os +import re +import sys +import requests +from bs4 import BeautifulSoup + +# The target URLs. You can freely add any new Intel GPU driver documentation links here. +URLS = [ + "https://dgpu-docs.intel.com/overview/supported-hardware/xe-driver-gpus.html" +] + +def get_filename_from_url(url): + """ + Derives a clean .ids filename from the URL slug. + Examples: + .../legacy-gpus.html -> legacy.ids + .../i915-driver-gpus.html -> i915.ids + .../xe2-driver-gpus.html -> xe2.ids (for future updates) + """ + slug = url.split('/')[-1].replace('.html', '') + for suffix in ['-driver-gpus', '-gpus', '-driver']: + if slug.endswith(suffix): + return slug[:-len(suffix)] + '.ids' + return slug + '.ids' + +def extract_pci_ids(url): + """ + Scrapes the URL, dynamically locates the PCI ID column, and extracts + unique, clean 4-digit hexadecimal PCI IDs. + """ + print(f"Scraping: {url}") + headers = { + 'User-Agent': 'Mozilla/5.0 (NixOS Intel-detect Tool)' + } + + try: + response = requests.get(url, headers=headers, timeout=15) + response.raise_for_status() + except requests.RequestException as e: + print(f"Error fetching {url}: {e}", file=sys.stderr) + return [] + + soup = BeautifulSoup(response.text, 'html.parser') + pci_ids = set() + + tables = soup.find_all('table') + if not tables: + print(f"Warning: No data tables found on {url}", file=sys.stderr) + return [] + + for table in tables: + # 1. Inspect headers to locate the exact index of the PCI/Device ID column + thead = table.find('thead') + if thead: + headers_text = [th.get_text(strip=True).lower() for th in thead.find_all('th')] + else: + first_tr = table.find('tr') + headers_text = [th.get_text(strip=True).lower() for th in first_tr.find_all(['th', 'td'])] if first_tr else [] + + pci_col_idx = -1 + for idx, text in enumerate(headers_text): + if any(kwd in text for kwd in ['pci', 'device id', 'dev id', 'did']): + pci_col_idx = idx + break + + # Soft fallback: check if header just contains 'id' + if pci_col_idx == -1: + for idx, text in enumerate(headers_text): + if 'id' in text: + pci_col_idx = idx + break + + # 2. Iterate through rows and pull data + tbody = table.find('tbody') + rows = tbody.find_all('tr') if tbody else table.find_all('tr') + + for row in rows: + cells = row.find_all('td') + if not cells: + continue + + # Extract strictly from the matching column if found + if pci_col_idx != -1 and pci_col_idx < len(cells): + cell_text = cells[pci_col_idx].get_text(strip=True) + # Matches standalone 4-char hex strings, ignoring optional '0x' prefix + matches = re.findall(r'\b(?:0x)?([0-9a-fA-F]{4})\b', cell_text) + for match in matches: + pci_ids.add(match.lower()) + else: + # Absolute fallback: Scan all cells but guard heavily against false-positive string matches + for cell in cells: + cell_text = cell.get_text(strip=True) + matches = re.findall(r'\b(?:0x)?([0-9a-fA-F]{4})\b', cell_text) + for match in matches: + # Only accept if the cell text is short (an ID cell) or explicitly contains 0x + if len(cell_text) < 15 or '0x' in cell_text.lower(): + pci_ids.add(match.lower()) + + return sorted(list(pci_ids)) + +def main(): + for url in URLS: + filename = get_filename_from_url(url) + ids = extract_pci_ids(url) + + if ids: + with open(filename, 'w', encoding='utf-8') as f: + for pci_id in ids: + f.write(f"{pci_id}\n") + print(f"-> Successfully saved {len(ids)} IDs to {filename}\n") + else: + print(f"-> No IDs extracted for {url}. Skipping file write.\n") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/server/generate_nvidia_ids.py b/server/generate_nvidia_ids.py new file mode 100644 index 0000000..d5e1acc --- /dev/null +++ b/server/generate_nvidia_ids.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +import os +import re +import sys +import requests +from bs4 import BeautifulSoup + +def generate_nvidia_ids(url, output_dir="."): + print(f"Fetching NVIDIA chip manifests from: {url}") + headers = {'User-Agent': 'Mozilla/5.0 (NixOS NVIDIA-detect Tool)'} + + try: + response = requests.get(url, headers=headers) + response.raise_for_status() + except Exception as e: + print(f"Execution failed - unable to fetch manifest: {e}", file=sys.stderr) + sys.exit(1) + + soup = BeautifulSoup(response.text, 'html.parser') + driver_maps = {"current": []} + current_driver = "current" + + body = soup.body if soup.body else soup + + # Linear DOM traversal utilizing structural and literal textual boundaries + for element in body.descendants: + # 1. Identify text blocks capable of changing the tracking context + if element.name in ['h1', 'h2', 'h3', 'h4', 'h5', 'p', 'div']: + text = element.get_text(" ", strip=True) + + # Hard reset to stable driver branch when hitting the primary section header + if "Current NVIDIA GPUs" in text: + current_driver = "current" + continue + + # Switch to legacy branch tracking when encountering driver spec strings + match = re.search(r'The\s+(\d+)(?:\.\d+)?(?:\.xx)?\s+driver\s+supports', text, re.IGNORECASE) + if match: + ver = match.group(1) + current_driver = f"legacy_{ver}" + if current_driver == "legacy_470": + break + if current_driver not in driver_maps: + driver_maps[current_driver] = [] + continue + + # 2. Process data rows inside standard HTML tables + elif element.name == 'tr': + cells = [td.get_text(strip=True) for td in element.find_all(['td', 'th'])] + if len(cells) < 2: + continue + + # Evaluate columns looking for the primary 4-digit hex PCI ID + for cell in cells[1:]: + cleaned = cell.strip() + if cleaned.lower().startswith('0x'): + cleaned = cleaned[2:] + + words = cleaned.split() + if not words: + continue + + first_word = words[0] + if re.match(r'^[0-9a-fA-F]{4}$', first_word): + pci_id = first_word.lower() + if pci_id not in driver_maps[current_driver]: + driver_maps[current_driver].append(pci_id) + break + + # 3. Fallback processing for older/minimalist pre-formatted text layouts + elif element.name == 'pre': + for line in element.get_text().split('\n'): + line = line.strip() + if not line: + continue + + if "Current NVIDIA GPUs" in line: + current_driver = "current" + continue + + match = re.search(r'The\s+(\d+)(?:\.\d+)?(?:\.xx)?\s+driver\s+supports', line, re.IGNORECASE) + if match: + ver = match.group(1) + current_driver = f"legacy_{ver}" + if current_driver not in driver_maps: + driver_maps[current_driver] = [] + continue + + parts = re.split(r'[,.]', line) + if len(parts) >= 2: + val = parts[1].strip() + if val.lower().startswith('0x'): + val = val[2:] + words = val.split() + if words: + first_word = words[0] + if re.match(r'^[0-9a-fA-F]{4}$', first_word): + pci_id = first_word.lower() + if pci_id not in driver_maps[current_driver]: + driver_maps[current_driver].append(pci_id) + + # Clean file generation + os.makedirs(output_dir, exist_ok=True) + for driver, ids in driver_maps.items(): + if not ids: + continue + filename = os.path.join(output_dir, f"{driver}.ids") + with open(filename, "w") as f: + for pci_id in sorted(ids): + f.write(f"{pci_id}\n") + print(f"Generated {filename} containing {len(ids)} mapped PCI IDs.") + +if __name__ == "__main__": + version = "595.84" + if len(sys.argv) > 1: + version = sys.argv[1] + target_url = f"https://download.nvidia.com/XFree86/Linux-x86_64/{version}/README/supportedchips.html" + else: + print("Please provide the driver version under following format : xxx.xx, for example : 595.84") + generate_nvidia_ids(target_url) \ No newline at end of file diff --git a/server/ids-database/amd/legacy.ids b/server/ids-database/amd/legacy.ids new file mode 100644 index 0000000..e69de29 diff --git a/server/ids-database/intel/current/xe2-x3.ids b/server/ids-database/intel/current/xe2-x3.ids new file mode 100644 index 0000000..0f79f1f --- /dev/null +++ b/server/ids-database/intel/current/xe2-x3.ids @@ -0,0 +1,18 @@ +6420 +64a0 +b080 +b081 +b082 +b083 +b084 +b085 +b086 +b087 +b090 +b0a0 +e20b +e20c +e211 +e212 +e222 +e223 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/gen11.ids b/server/ids-database/intel/legacy/gen11.ids new file mode 100644 index 0000000..782dbe1 --- /dev/null +++ b/server/ids-database/intel/legacy/gen11.ids @@ -0,0 +1,15 @@ +8A51 +8A52 +8A53 +8A50 +8A57 +8A59 +8A54 +8A5A +8A5C +8A5B +8A5D +8A56 +8A58 +8A70 +8A71 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/gen5-gen7 b/server/ids-database/intel/legacy/gen5-gen7 new file mode 100644 index 0000000..81595d2 --- /dev/null +++ b/server/ids-database/intel/legacy/gen5-gen7 @@ -0,0 +1,81 @@ +0042 +0046 +0102 +0106 +010A +0112 +0122 +0116 +0126 +015A +0152 +0156 +016A +0162 +0166 +0402 +0406 +040A +040B +040E +0C02 +0C06 +0C0A +0C0B +0C0E +0A02 +0A06 +0A0A +0A0B +0A0E +0D02 +0D06 +0D0A +0D0B +0D0E +0A1E +041E +0A16 +041B +0C12 +0C16 +0C1A +0C1B +0C1E +0A12 +0A1A +0A1B +0D16 +0D1A +0D1B +0D1E +041A +0412 +0416 +0D12 +0D26 +0D22 +0A2E +0A26 +0422 +0426 +042A +042B +042E +0C22 +0C26 +0C2A +0C2B +0C2E +0A22 +0A2A +0A2B +0D2A +0D2B +0D2E +0F30 +0F31 +0F32 +0F33 +0157 +0155 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/gen8.ids b/server/ids-database/intel/legacy/gen8.ids new file mode 100644 index 0000000..df8f357 --- /dev/null +++ b/server/ids-database/intel/legacy/gen8.ids @@ -0,0 +1,28 @@ +22B1 +22B0 +22B2 +22B3 +1602 +1606 +160A +160B +160D +160E +161E +161B +161D +161A +1616 +1612 +162D +162E +162B +162A +1626 +1622 +163D +163A +1632 +163E +163B +1636 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/gen9-gen9.5.ids b/server/ids-database/intel/legacy/gen9-gen9.5.ids new file mode 100644 index 0000000..dd59b82 --- /dev/null +++ b/server/ids-database/intel/legacy/gen9-gen9.5.ids @@ -0,0 +1,97 @@ +190A +190E +1902 +1906 +190B +191E +191D +1916 +1921 +1913 +1915 +1917 +191A +1912 +191B +192D +192B +1927 +1926 +1923 +193A +193D +1932 +193B +192A +5A84 +0A84 +1A84 +5A85 +1A85 +3184 +3185 +590A +5908 +590E +5902 +5906 +590B +5913 +5915 +87C0 +591C +591E +591A +591D +5916 +5921 +5912 +591B +5917 +5927 +5926 +5923 +593B +3EA9 +3EA0 +3E96 +3E9A +3E94 +9BC6 +9BE6 +9BF6 +3E91 +3E92 +3E98 +3E9B +9BC5 +9BC8 +87CA +3EA3 +9B41 +9BC0 +9BC2 +9BC4 +9BCA +9BCB +9BCC +3EA4 +9B21 +9BA0 +9BA2 +9BA4 +9BAA +9BAB +9BAC +3E90 +3E93 +3E99 +3E9C +3EA1 +9BA5 +9BA8 +3EA2 +3EA7 +3EA6 +3EA5 +3EA8 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/unsupported.ids b/server/ids-database/intel/legacy/unsupported.ids new file mode 100644 index 0000000..7033ba4 --- /dev/null +++ b/server/ids-database/intel/legacy/unsupported.ids @@ -0,0 +1,30 @@ +3577 +2562 +3582 +358E +2572 +2582 +2582 +258A +2592 +2772 +27A2 +27AE +29B2 +29C2 +29D2 +A011 +A001 +2A12 +2A02 +2972 +2992 +2982 +29A2 +2E42 +2E92 +2E32 +2E22 +2E12 +2E02 +2A42 \ No newline at end of file diff --git a/server/ids-database/intel/legacy/xe.ids b/server/ids-database/intel/legacy/xe.ids new file mode 100644 index 0000000..b4779a5 --- /dev/null +++ b/server/ids-database/intel/legacy/xe.ids @@ -0,0 +1,104 @@ +0bd5 +0bda +4541 +4551 +4555 +4557 +4571 +4626 +4628 +462a +4680 +4682 +4688 +468a +468b +4690 +4692 +4693 +46a0 +46a1 +46a2 +46a3 +46a6 +46a8 +46aa +46b0 +46b1 +46b2 +46b3 +46c0 +46c1 +46c2 +46c3 +46d0 +46d1 +46d2 +46d3 +46d4 +4905 +4907 +4908 +4909 +4c8a +4c8b +4c90 +4c9a +4e51 +4e55 +4e57 +4e61 +4e71 +5690 +5691 +5692 +5693 +5694 +5696 +5697 +56a0 +56a1 +56a2 +56a5 +56a6 +56b0 +56b1 +56b2 +56b3 +56ba +56bb +56bc +56bd +56c0 +56c1 +7d40 +7d41 +7d45 +7d51 +7d55 +7d67 +7dd5 +9a40 +9a49 +9a59 +9a60 +9a68 +9a70 +9a78 +a721 +a780 +a781 +a782 +a783 +a788 +a789 +a78a +a78b +a7a0 +a7a1 +a7a8 +a7a9 +a7aa +a7ab +a7ac +a7ad \ No newline at end of file diff --git a/server/ids-database/nvidia/current/current.ids b/server/ids-database/nvidia/current/current.ids new file mode 100644 index 0000000..4d8212d --- /dev/null +++ b/server/ids-database/nvidia/current/current.ids @@ -0,0 +1,293 @@ +1e02 +1e04 +1e07 +1e09 +1e30 +1e36 +1e78 +1e81 +1e82 +1e84 +1e87 +1e89 +1e90 +1e91 +1e93 +1eb0 +1eb1 +1eb5 +1eb6 +1eb8 +1ec2 +1ec7 +1ed0 +1ed1 +1ed3 +1ef5 +1f02 +1f03 +1f06 +1f07 +1f08 +1f0a +1f0b +1f10 +1f11 +1f12 +1f14 +1f15 +1f36 +1f42 +1f47 +1f50 +1f51 +1f54 +1f55 +1f76 +1f82 +1f83 +1f91 +1f95 +1f96 +1f97 +1f98 +1f99 +1f9c +1f9d +1f9f +1fa0 +1fb0 +1fb1 +1fb2 +1fb6 +1fb7 +1fb8 +1fb9 +1fba +1fbb +1fbc +1fdd +1ff0 +1ff2 +1ff9 +20b0 +20b2 +20b3 +20b5 +20b6 +20b7 +20bd +20f1 +20f3 +20f5 +20f6 +20fd +2182 +2184 +2187 +2188 +2189 +2191 +2192 +21c4 +21d1 +2203 +2204 +2206 +2207 +2208 +220a +220d +2216 +2230 +2231 +2232 +2233 +2235 +2236 +2237 +2238 +230e +2321 +2322 +2324 +2329 +232c +2330 +2331 +2335 +2339 +233a +233b +2342 +2348 +2414 +2420 +2438 +2460 +2482 +2484 +2486 +2487 +2488 +2489 +248a +249c +249d +24a0 +24b0 +24b1 +24b6 +24b7 +24b8 +24b9 +24ba +24bb +24c7 +24c9 +24dc +24dd +24e0 +24fa +2503 +2504 +2507 +2508 +2520 +2521 +2523 +2531 +2544 +2560 +2563 +2571 +2582 +2584 +25a0 +25a2 +25a5 +25a6 +25a7 +25a9 +25aa +25ab +25ac +25ad +25b0 +25b2 +25b6 +25b8 +25b9 +25ba +25bb +25bc +25bd +25e0 +25e2 +25e5 +25ec +25ed +25f9 +25fa +25fb +2684 +2685 +2689 +26b1 +26b2 +26b3 +26b5 +26b9 +26ba +2702 +2704 +2705 +2709 +2717 +2730 +2757 +2770 +2782 +2783 +2786 +2788 +27a0 +27b0 +27b1 +27b2 +27b6 +27b8 +27ba +27bb +27e0 +27fb +2803 +2805 +2808 +2820 +2822 +2838 +2860 +2882 +28a0 +28a1 +28a3 +28b0 +28b8 +28b9 +28ba +28bb +28e0 +28e1 +28e3 +28f8 +2901 +2909 +2941 +29bb +2b85 +2b87 +2b8c +2bb1 +2bb3 +2bb4 +2bb5 +2bb9 +2c02 +2c05 +2c18 +2c19 +2c31 +2c33 +2c34 +2c38 +2c39 +2c3a +2c58 +2c59 +2c77 +2c79 +2d04 +2d05 +2d18 +2d19 +2d30 +2d39 +2d58 +2d59 +2d79 +2d83 +2d98 +2db8 +2db9 +2dd8 +2df9 +2e12 +2f04 +2f06 +2f18 +2f38 +2f58 +3182 +31c2 +31c3 diff --git a/server/ids-database/nvidia/current/legacy_580.ids b/server/ids-database/nvidia/current/legacy_580.ids new file mode 100644 index 0000000..4e0c0fc --- /dev/null +++ b/server/ids-database/nvidia/current/legacy_580.ids @@ -0,0 +1,162 @@ +1340 +1341 +1344 +1346 +1347 +1348 +1349 +134b +134d +134e +134f +137a +137b +137d +1380 +1381 +1382 +1390 +1391 +1392 +1393 +1398 +1399 +139a +139b +139c +139d +13b0 +13b1 +13b2 +13b3 +13b4 +13b6 +13b9 +13ba +13bb +13bc +13c0 +13c2 +13d7 +13d8 +13d9 +13da +13f0 +13f1 +13f2 +13f3 +13f8 +13f9 +13fa +13fb +1401 +1402 +1406 +1407 +1427 +1430 +1431 +1436 +15f0 +15f7 +15f8 +15f9 +1617 +1618 +1619 +161a +1667 +174d +174e +179c +17c2 +17c8 +17f0 +17f1 +17fd +1b00 +1b02 +1b06 +1b30 +1b38 +1b80 +1b81 +1b82 +1b83 +1b84 +1b87 +1ba0 +1ba1 +1ba2 +1bb0 +1bb1 +1bb3 +1bb4 +1bb5 +1bb6 +1bb7 +1bb8 +1bb9 +1bbb +1bc7 +1be0 +1be1 +1c02 +1c03 +1c04 +1c06 +1c07 +1c09 +1c20 +1c21 +1c22 +1c23 +1c30 +1c31 +1c60 +1c61 +1c62 +1c81 +1c82 +1c83 +1c8c +1c8d +1c8f +1c90 +1c91 +1c92 +1c94 +1c96 +1cb1 +1cb2 +1cb3 +1cb6 +1cba +1cbb +1cbc +1cbd +1cfa +1cfb +1d01 +1d02 +1d10 +1d11 +1d12 +1d13 +1d16 +1d33 +1d34 +1d52 +1d81 +1db1 +1db3 +1db4 +1db5 +1db6 +1db7 +1db8 +1dba +1df0 +1df2 +1df5 +1df6 diff --git a/server/ids-database/nvidia/legacy/legacy_340.ids b/server/ids-database/nvidia/legacy/legacy_340.ids new file mode 100644 index 0000000..daa757f --- /dev/null +++ b/server/ids-database/nvidia/legacy/legacy_340.ids @@ -0,0 +1,244 @@ +0191 +0193 +0194 +0197 +019d +019e +0400 +0401 +0402 +0403 +0404 +0405 +0406 +0407 +0408 +0409 +040a +040b +040c +040d +040e +040f +0410 +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +05e0 +05e1 +05e2 +05e3 +05e6 +05e7 +05ea +05eb +05ed +05f8 +05f9 +05fd +05fe +05ff +0600 +0601 +0602 +0603 +0604 +0605 +0606 +0607 +0608 +0609 +060a +060b +060c +060d +060f +0610 +0611 +0612 +0613 +0614 +0615 +0617 +0618 +0619 +061a +061b +061c +061d +061e +061f +0621 +0622 +0623 +0625 +0626 +0627 +0628 +062a +062b +062c +062d +062e +0630 +0631 +0632 +0635 +0637 +0638 +063a +0640 +0641 +0643 +0644 +0645 +0646 +0647 +0648 +0649 +064a +064b +064c +0651 +0652 +0653 +0654 +0655 +0656 +0658 +0659 +065a +065b +065c +06e0 +06e1 +06e2 +06e3 +06e4 +06e5 +06e6 +06e7 +06e8 +06e9 +06ea +06eb +06ec +06ef +06f1 +06f8 +06f9 +06fa +06fb +06fd +06ff +0840 +0844 +0845 +0846 +0847 +0848 +0849 +084a +084b +084c +084d +084f +0860 +0861 +0862 +0863 +0864 +0865 +0866 +0867 +0868 +0869 +086a +086c +086d +086e +086f +0870 +0871 +0872 +0873 +0874 +0876 +087a +087d +087e +087f +08a0 +08a2 +08a3 +08a4 +08a5 +0a20 +0a22 +0a23 +0a26 +0a27 +0a28 +0a29 +0a2a +0a2b +0a2c +0a2d +0a32 +0a34 +0a35 +0a38 +0a3c +0a60 +0a62 +0a63 +0a64 +0a65 +0a66 +0a67 +0a68 +0a69 +0a6a +0a6c +0a6e +0a6f +0a70 +0a71 +0a72 +0a73 +0a74 +0a75 +0a76 +0a78 +0a7a +0a7c +0ca0 +0ca2 +0ca3 +0ca4 +0ca5 +0ca7 +0ca8 +0ca9 +0cac +0caf +0cb0 +0cb1 +0cbc +10c0 +10c3 +10c5 +10d8 diff --git a/server/ids-database/nvidia/legacy/legacy_390.ids b/server/ids-database/nvidia/legacy/legacy_390.ids new file mode 100644 index 0000000..54d6a52 --- /dev/null +++ b/server/ids-database/nvidia/legacy/legacy_390.ids @@ -0,0 +1,120 @@ +06c0 +06c4 +06ca +06cd +06d1 +06d2 +06d8 +06d9 +06da +06dc +06dd +06de +06df +0dc0 +0dc4 +0dc5 +0dc6 +0dcd +0dce +0dd1 +0dd2 +0dd3 +0dd6 +0dd8 +0dda +0de0 +0de1 +0de2 +0de3 +0de4 +0de5 +0de7 +0de8 +0de9 +0dea +0deb +0dec +0ded +0dee +0def +0df0 +0df1 +0df2 +0df3 +0df4 +0df5 +0df6 +0df7 +0df8 +0df9 +0dfa +0dfc +0e22 +0e23 +0e24 +0e30 +0e31 +0e3a +0e3b +0f00 +0f01 +0f02 +0f03 +1040 +1042 +1048 +1049 +104a +104b +104c +1050 +1051 +1052 +1054 +1055 +1056 +1057 +1058 +1059 +105a +105b +107c +107d +1080 +1081 +1082 +1084 +1086 +1087 +1088 +1089 +108b +1091 +1094 +1096 +109a +109b +1140 +1200 +1201 +1203 +1205 +1206 +1207 +1208 +1210 +1211 +1212 +1213 +1241 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +124b +124d +1251 diff --git a/server/ids-database/nvidia/legacy/legacy_470.ids b/server/ids-database/nvidia/legacy/legacy_470.ids new file mode 100644 index 0000000..cee32b0 --- /dev/null +++ b/server/ids-database/nvidia/legacy/legacy_470.ids @@ -0,0 +1,117 @@ +0fc6 +0fc8 +0fc9 +0fcd +0fce +0fd1 +0fd2 +0fd3 +0fd4 +0fd5 +0fd8 +0fd9 +0fdf +0fe0 +0fe1 +0fe2 +0fe3 +0fe4 +0fe9 +0fea +0fec +0fed +0fee +0ff6 +0ff8 +0ff9 +0ffa +0ffb +0ffc +0ffd +0ffe +0fff +1001 +1004 +1005 +1007 +1008 +100a +100c +1021 +1022 +1023 +1024 +1026 +1027 +1028 +1029 +102a +102d +103a +103c +1180 +1183 +1184 +1185 +1187 +1188 +1189 +118a +118e +118f +1193 +1194 +1195 +1198 +1199 +119a +119d +119e +119f +11a0 +11a1 +11a2 +11a3 +11a7 +11b4 +11b6 +11b7 +11b8 +11ba +11bc +11bd +11be +11c0 +11c2 +11c3 +11c4 +11c5 +11c6 +11c8 +11cb +11e0 +11e1 +11e2 +11e3 +11fa +11fc +1280 +1281 +1282 +1284 +1286 +1287 +1288 +1289 +128b +1290 +1291 +1292 +1293 +1295 +1296 +1298 +1299 +129a +12b9 +12ba diff --git a/server/ids-database/nvidia/legacy/unsupported.ids b/server/ids-database/nvidia/legacy/unsupported.ids new file mode 100644 index 0000000..807df04 --- /dev/null +++ b/server/ids-database/nvidia/legacy/unsupported.ids @@ -0,0 +1,236 @@ +0020 +0028 +0029 +002c +002d +00a0 +0100 +0101 +0103 +0150 +0151 +0152 +0153 +0110 +0111 +0112 +0113 +0170 +0171 +0172 +0173 +0174 +0175 +0176 +0177 +0178 +0179 +017a +017c +017d +0181 +0182 +0183 +0185 +0188 +018a +018b +018c +01a0 +01f0 +0200 +0201 +0202 +0203 +0250 +0251 +0253 +0258 +0259 +025b +0280 +0281 +0282 +0286 +0288 +0289 +028c +00fa +00fb +00fc +00fd +00fe +0301 +0302 +0308 +0309 +0311 +0312 +0314 +031a +031b +031c +0320 +0321 +0322 +0323 +0324 +0325 +0326 +0327 +0328 +032a +032b +032c +032d +0330 +0331 +0332 +0333 +0334 +0338 +033f +0341 +0342 +0343 +0344 +0347 +0348 +034c +034e +0040 +0041 +0042 +0043 +0044 +0045 +0046 +0047 +0048 +004e +0090 +0091 +0092 +0093 +0095 +0098 +0099 +009d +00c0 +00c1 +00c2 +00c3 +00c8 +00c9 +00cc +00cd +00ce +00f1 +00f2 +00f3 +00f4 +00f5 +00f6 +00f8 +00f9 +0140 +0141 +0142 +0143 +0144 +0145 +0146 +0147 +0148 +0149 +014a +014c +014d +014e +014f +0160 +0161 +0162 +0163 +0164 +0165 +0166 +0167 +0168 +0169 +016a +01d0 +01d1 +01d2 +01d3 +01d6 +01d7 +01d8 +01da +01db +01dc +01dd +01de +01df +0211 +0212 +0215 +0218 +0221 +0222 +0240 +0241 +0242 +0244 +0245 +0247 +0290 +0291 +0292 +0293 +0294 +0295 +0297 +0298 +0299 +029a +029b +029c +029d +029e +029f +02e0 +02e1 +02e2 +02e3 +02e4 +038b +0390 +0391 +0392 +0393 +0394 +0395 +0397 +0398 +0399 +039c +039e +03d0 +03d1 +03d2 +03d5 +03d6 +0531 +0533 +053a +053b +053e +07e0 +07e1 +07e2 +07e3 +07e5 +0fef +0ff2 +11bf \ No newline at end of file diff --git a/server/intel.md b/server/intel.md new file mode 100644 index 0000000..71db1a7 --- /dev/null +++ b/server/intel.md @@ -0,0 +1,42 @@ +# Intel APIs for hardware-acceleration + +### ⚠️ Warning: + +CPU and iGPU generations DO NOT coincide: they are two separate things. For example, when talking about Graphics (cf. "GPU Generation" in the table below) gen11, we are not talking about Intel® Core™ 11th gen processors but rather the processors that contain gen11 graphics (see the table below). + +### APIs Overview + +#### VA-API (Video Acceleration API): + +This is the gold standard for Intel on Linux. Every player, browser, and transcoder (FFmpeg, GStreamer, mpv, Chromium) uses VA-API to talk to Intel hardware. + +#### QSV (Quick Sync Video): + +This is Intel's marketing name for the hardware encoding/decoding SIP block. On Linux, QSV isn't a separate driver; it is a high-level API layer exposed through oneVPL (or legacy Media SDK) that runs on top of the VA-API infrastructure. + +#### VDPAU: This is NVIDIA's legacy framework. + +Intel does not support VDPAU natively. While a translation wrapper exists (libvdpau-va-gl), it is obsolete and unmaintained. + +### API Compatibility + +|GPU Generation|CPU Architecture(s) (iGPUs)|GPU Architecture(s) (dGPUs)|Codec Capabilities (VA-API)|Libva driver name|Module name|QSV|GuC / HuC / FBC|openCL|NixOS Config Packages| +|--|----------|--|--|--|--|--|--|--|--| +|Gen 5 to Gen 7|Westmere (Intel® Core™ **1st gen**),
Sandy Bridge (Intel® Core™ **2nd gen**),
Ivy Bridge (Intel® Core™ **3rd gen**),
Haswell (Intel® Core™ **4th gen**),
Bay Trail (Intel® **Atom™ processor E3800** product family)|None|H.264, MPEG2, VC-1 decode only. No HEVC/AV1.|i965|i915|In theory yes, but **unsupported**. [Why?](#deprecation-of-intels-media-sdk)|Unsupported|Unsupported|`intel-vaapi-driver`| +|Gen 8|Broadwell (Intel® Core™ **5th gen**),
Cherryview and Braswell (Intel® **Atom™**, **Celeron™** and **Pentium™** processors)|None|Limited HEVC (8-bit) decode, VP8 decode/encode.|iHD (fallback to i965 available)|i915|In theory yes, but **unsupported**. [Why?](#deprecation-of-intels-media-sdk)|GuC and HuC are unsupported.
Enable FBC with kernel parameter: `i915.enable_fbc=1`|`intel-compute-runtime-legacy1` on Broadwell only.|`intel-media-driver`| +|Gen 9 / 9.5|Skylake (Intel® Core™ **6th gen**),
Kaby Lake (Intel® Core™ **7th gen**),
Coffee Lake (Intel® Core™ **8th gen** and **9th gen**), Comet Lake (Intel® Core™ **10th gen**),
Gemini Lake (Intel® **Celeron™** and **Pentium™ Silver**),
Apollo Lake (Intel® **Atom™**, **Celeron™** and **Pentium™**)|None|Adds full hardware HEVC 8/10-bit decode/encode, VP9 8-bit decode/encode (Gen 9), VP9 10-bit decode (Gen 9.5).|iHD (fallback to i965 available)|i915|In theory yes, but **unsupported**. [Why?](#deprecation-of-intels-media-sdk)|Kernel parameters:
`i915.enable_guc=2`
`i915.enable_fbc=1`|`intel-compute-runtime-legacy1`|`intel-media-driver`| +|Gen 11|Ice Lake (Intel® Core™ **10th gen**),
Jasper Lake and Elkhart Lake (Intel® **Atom™**, **Celeron™** and **Pentium Silver™**)|None|HEVC 10-bit decode/encode, VP9 10-bit decode/encode. Still no AV1.|iHD|i915|In theory yes, but **unsupported**. [Why?](#deprecation-of-intels-media-sdk)|Kernel parameters:
`i915.enable_guc=2`
`i915.enable_fbc=1`|`intel-compute-runtime-legacy1` except on Jasper Lake.|`intel-media-driver`| +Xe (Gen 12 / Xe-LP)|Rocket Lake (Intel® Core™ **11th gen**),
Tiger Lake (Intel® Core™ **11th gen**),
Alder Lake (Intel® Core™ **12th gen**),
Raptor Lake (Intel® Core™ **13th** and **14th gen**),
Twin Lake (Intel® **N-series**)|DG1|Adds AV1 8/10-bit Decode. No AV1 Encode.|iHD|i915 (Experimental Xe probe possible)|Yes, modern oneVPL stack.|Kernel parameters:
`i915.enable_guc=3`
`i915.enable_fbc=1`|`intel-compute-runtime`|`intel-media-driver`, `vpl-gpu-rt`| +|Xe-HPG / Xe-LPG|Meteor Lake (Core Ultra **Series 1**),
Arrow Lake (Core Ultra **Series 2**)|Alchemist (Arc A-Series)|Adds full AV1 8/10-bit Encode alongside Decode.|iHD|i915 or Xe (Native dual support; kernels default to Xe for dGPUs)|Yes, modern oneVPL stack.|Already enabled by default.|`intel-compute-runtime`|`intel-media-driver`, `vpl-gpu-rt`| +|Xe2|Lunar Lake (Core Ultra **Series 2**)|Battlemage (Arc B-Series)|HEVC, VP9, AV1 (Decode/Encode). Adds early VVC (H.266) Decode support.|iHD|Xe|Yes, modern oneVPL stack.|Already enabled by default.|`intel-compute-runtime`|`intel-media-driver`, `vpl-gpu-rt`| +|Xe3|Panther Lake (Core Ultra **Series 3**)|None announced|Same as Xe2 with updated structural performance blocks.|iHD|Xe|Yes, modern oneVPL stack.|Already enabled by default.|`intel-compute-runtime`|`intel-media-driver`, `vpl-gpu-rt`| + +### Challenges + +#### Deprecation of Intel's media SDK + +Intel **10th gen** processors (Ice Lake, Jasper Lake, Elkhart Lake) **and older** generations lost support for QSV (Quick Sync Video) on Linux, since the Media SDK has been deprecated by Intel. You therefore have to switch to VA-API. Please use newer hardware if you are shopping for hardware. + +Know that while installing the Media SDK package might get QSV to work, the package **is considered insecure** with multiple CVEs concerning privilege escalation. Installing it is **HIGHLY DISCOURAGED**. + +Please read the [deprecation notice](https://github.com/Intel-Media-SDK/MediaSDK) for more info. \ No newline at end of file diff --git a/server/nvidia.md b/server/nvidia.md new file mode 100644 index 0000000..01ada53 --- /dev/null +++ b/server/nvidia.md @@ -0,0 +1,32 @@ +# NVIDIA APIs for hardware-acceleration + +### APIs Overview + +#### NVDEC +NVIDIA Video Decoder (formerly NVCUVID) is a proprietary API that enables hardware-accelerated video decoding by offloading compute-intensive video parsing and bitstream decoding from the CPU to a dedicated, fixed-function SIP core on the GPU die. It supports copying decoded frames directly into NVIDIA graphics or CUDA memory surfaces, minimizing latency for real-time video processing pipelines, AI inference data preparation, and transcoding workflows. + +#### NVENC +NVIDIA Video Encoder is a proprietary, dedicated hardware block introduced with the Kepler architecture that handles video stream encoding entirely independent of the primary graphics and CUDA compute cores. By managing bitstream compression natively (supporting H.264, HEVC, and AV1 depending on generation), it guarantees minimal performance degradation during demanding rendering tasks like real-time gaming or streaming. It features configurable rate control, sub-frame latency options, and multi-stream scaling boundaries. + +#### VA-API +Video Acceleration API is an open-source library and standardized API designed for Linux and Unix-like operating systems. Because NVIDIA does not natively implement VA-API in their proprietary display drivers, hardware acceleration inside standard applications that rely on it (such as Firefox or Chromium-based browsers) requires a translation layer. In the NixOS ecosystem, this is achieved via the `nvidia-vaapi-driver` wrapper, which transparently maps VA-API runtime calls down to NVIDIA's underlying proprietary NVDEC backend. + +#### VDPAU +Video Decode and Presentation API for Unix is an open-source API originally developed by NVIDIA in 2008 to bring full hardware-accelerated video decoding and post-processing (deinterlacing, scaling, color correction) to Linux. While VDPAU served as the historical standard for video players like MPlayer and VLC on older architectures (Tesla through Maxwell), it lacks modern codec capabilities like HEVC or AV1. It is currently categorized as a legacy framework but remains crucial for maintaining backwards compatibility with older Linux applications. + +### API Compatibility + +### API Compatibility + +| GPU Generation | Codec Capabilities | Supported APIs | NixOS Config Packages | +| :--- | :--- | :--- | :--- | +| **Tesla**
*(GeForce 8/9/200/300, NVS 300)* | **Decode:** MPEG-1, MPEG-2, VC-1/WMV9, H.264 (AVC)
**Encode:** None | VDPAU | **Driver:** `legacy_340`
**Backend:** `pkgs.libvdpau` | +| **Fermi**
*(GeForce 400/500)* | **Decode:** MPEG-1/2, VC-1, H.264, VP8 (selective VP5 models)
**Encode:** None | VDPAU, NVDEC (Early NVCUVID) | **Driver:** `legacy_390`
**Backend:** `pkgs.libvdpau` | +| **Kepler**
*(GeForce 600/700)* | **Decode:** MPEG-1/2, VC-1, H.264, VP8
**Encode:** H.264 (1st Gen NVENC) | VDPAU, NVDEC, NVENC | **Driver:** `legacy_470` *(600 series)* or `legacy_580` *(700 series)*
**Backend:** `pkgs.libvdpau` | +| **Maxwell (1st Gen)**
*(GeForce GTX 750/750 Ti)* | **Decode:** MPEG-1/2, VC-1, H.264, VP8
**Encode:** H.264 (2nd Gen NVENC) | VDPAU, NVDEC, NVENC | **Driver:** `legacy_580`
**Backend:** `pkgs.libvdpau` | +| **Maxwell (2nd Gen)**
*(GeForce 900 series)* | **Decode:** MPEG-1/2, VC-1, H.264, HEVC/H.265 (Partial/Hybrid; Full 8/10-bit on GM206), VP9 (Hybrid)
**Encode:** H.264, HEVC (8-bit, 3rd Gen NVENC) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `legacy_580`
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | +| **Pascal**
*(GeForce 10 series)* | **Decode:** MPEG-2, VC-1, H.264, HEVC (8/10/12-bit), VP8, VP9 (8/10-bit)
**Encode:** H.264, HEVC (8/10-bit, 4th Gen NVENC) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `legacy_580`
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | +| **Turing / Volta**
*(GeForce 16/20 series, Titan V)* | **Decode:** H.264, HEVC (up to 12-bit 4:4:4), VP9 (10/12-bit)
**Encode:** H.264, HEVC (Adds B-Frames, 5th/6th Gen NVENC) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `legacy_580` *(16 series)* or `stable` *(20 series)*
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | +| **Ampere**
*(GeForce 30 series)* | **Decode:** Adds AV1 (up to 10-bit), H.264, HEVC, VP9
**Encode:** H.264, HEVC (7th Gen NVENC) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `stable`
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | +| **Ada Lovelace**
*(GeForce 40 series)* | **Decode:** AV1, H.264, HEVC, VP9
**Encode:** Adds AV1 (8th Gen NVENC, dual encoders on select models) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `stable`
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | +| **Blackwell**
*(GeForce 50 series)* | **Decode:** Adds 4:2:2 (H.264/HEVC), 2x H.264 throughput, AV1, HEVC, VP9 (6th Gen NVDEC)
**Encode:** Adds 4:2:2 (H.264/HEVC), AV1 UHQ Mode (9th Gen NVENC) | VDPAU, NVDEC, NVENC, VA-API (via wrapper) | **Driver:** `stable`
**Backend:** `pkgs.nvidia-vaapi-driver` or legacy VDPAU `pkgs.libvdpau` | \ No newline at end of file