diff --git a/inxi b/inxi index 5325d40..edc3633 100755 --- a/inxi +++ b/inxi @@ -49,9 +49,9 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.29'; -my $self_date='2023-09-17'; -my $self_patch='01'; +my $self_version='3.3.30'; +my $self_date='2023-09-25'; +my $self_patch='00'; ## END INXI INFO ## my ($b_pledge,@pledges); @@ -1953,6 +1953,12 @@ sub display_data { # kde 5/plasma desktop 5, this is maybe an extra package and won't be used ['about-distro',''], ['aticonfig','--adapter=all --od-gettemperature'], + ['clinfo',''], + ['clinfo','--list'], + ['clinfo','--raw'], # machine friendly + ['eglinfo',''], + ['eglinfo','-B'], + ['es2_info',''], ['glxinfo',''], ['glxinfo','-B'], ['kded','--version'], @@ -1987,6 +1993,8 @@ sub display_data { ['vainfo',''], ['vdpauinfo',''], ['vulkaninfo',''], + ['vulkaninfo','--summary'], + # ['vulkaninfo','--json'], # outputs to file, not sure how to output to stdout ['wayland-info',''], # not packaged as far as I know yet ['weston-info',''], ['wmctrl','-m'], @@ -2667,7 +2675,7 @@ sub download_file { ## NOTE: 1 is success, 0 false for Perl if ($dl{'dl'} eq 'tiny'){ $cmd = "Using tiny: type: $type \nurl: $url \nfile: $file"; - $result = get_file($type, $url, $file); + $result = get_file_tiny_http($type, $url, $file); $debug_data = ($type ne 'stdout') ? $result : 'Success: stdout data not null.'; } # But: 0 is success, and 1 is false for these @@ -2699,7 +2707,7 @@ sub download_file { return $result; } -sub get_file { +sub get_file_tiny_http { my ($type, $url, $file) = @_; my $tiny = HTTP::Tiny->new; # note: default is no verify, so default here actually is to verify unless overridden @@ -2755,7 +2763,11 @@ sub set_downloader { # It is NOT part of core modules. IO::Socket::SSL is also required # For some https connections so only use tiny as option if both present if ($dl{'tiny'}){ - if (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){ + # this only for -U 4, grab file with ftp to avoid unsupported SSL issues + if ($use{'ftp-download'}){ + $dl{'tiny'} = 0; + } + elsif (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){ HTTP::Tiny->import; IO::Socket::SSL->import; $dl{'tiny'} = 1; @@ -3034,11 +3046,13 @@ sub check_items { } elsif ($type eq 'recommended display information programs'){ if ($bsd_type){ - @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr); + @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo + xrandr); $info_os = 'info-bsd'; } else { - @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr); + @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo + xrandr); } $b_program = 1; $item = 'Program'; @@ -3555,17 +3569,33 @@ sub set_item_data { 'rpm' => 'wget', }, ## Programs-Display ## + 'eglinfo' => { + 'info' => '-G X11/Wayland EGL info', + 'info-bsd' => '-G X11/Wayland EGL info', + 'apt' => 'mesa-utils (or: mesa-utils-extra)', + 'pacman' => 'mesa-demos', + 'pkgtool' => 'mesa', + 'rpm' => 'egl-utils (SUSE: Mesa-demo-egl)', + }, 'glxinfo' => { - 'info' => '-G (X) glx info', - 'info-bsd' => '-G (X) glx info', + 'info' => '-G X11 GLX info', + 'info-bsd' => '-G X11 GLX info', 'apt' => 'mesa-utils', 'pacman' => 'mesa-demos', 'pkgtool' => 'mesa', - 'rpm' => 'glx-utils (SUSE: Mesa-demo-x)', + 'rpm' => 'glx-utils (Fedora: glx-utils; SUSE: Mesa-demo-x)', + }, + 'vulkaninfo' => { + 'info' => '-G Vulkan API info', + 'info-bsd' => '-G Vulkan API info', + 'apt' => 'vulkan-tools', + 'pacman' => 'vulkan-tools', + 'pkgtool' => 'vulkan-tools', + 'rpm' => 'vulkan-demos (Fedora: vulkan-tools; SUSE: vulkan-demos)', }, 'wmctrl' => { 'info' => '-S active window manager (fallback)', - 'info-bsd' => '-S active window managerr (fallback)', + 'info-bsd' => '-S active window manager (fallback)', 'apt' => 'wmctrl', 'pacman' => 'wmctrl', 'pkgtool' => 'wmctrl', @@ -3577,7 +3607,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xdpyinfo', 'pkgtool' => 'xdpyinfo', - 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdpyinfo)', + 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdpyinfo)', }, 'xdriinfo' => { 'info' => '-G (X) DRI driver (if missing, fallback to Xorg log)', @@ -3585,7 +3615,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xdriinfo', 'pkgtool' => 'xdriinfo', - 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdriinfo)', + 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdriinfo)', }, 'xprop' => { 'info' => '-S (X) desktop data', @@ -3593,7 +3623,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xprop', 'pkgtool' => 'xprop', - 'rpm' => 'x11-utils', + 'rpm' => 'x11-utils (Fedora/SUSE: xprop)', }, 'xrandr' => { 'info' => '-G (X) monitors(s) resolution; -Ga monitor data', @@ -3601,7 +3631,7 @@ sub set_item_data { 'apt' => 'x11-xserver-utils', 'pacman' => 'xrandr', 'pkgtool' => 'xrandr', - 'rpm' => 'x11-server-utils (Fedora: xrandr)', + 'rpm' => 'x11-server-utils (SUSE/Fedora: xrandr)', }, ## Perl Modules ## 'Cpanel::JSON::XS' => { @@ -4543,15 +4573,12 @@ sub get_defaults { 'ftp-upload' => 'ftp.smxi.org/incoming', 'inxi-branch-1' => 'https://codeberg.org/smxi/inxi/raw/one/', 'inxi-branch-2' => 'https://codeberg.org/smxi/inxi/raw/two/', - 'inxi-dev' => 'https://smxi.org/in/', - 'inxi-main' => 'https://codeberg.org/smxi/inxi/raw/master/', - 'inxi-pinxi' => 'https://codeberg.org/smxi/inxi/raw/inxi-perl/', - 'inxi-man' => "https://smxi.org/in/$self_name.1", - 'inxi-man-gh' => "https://codeberg.org/smxi/inxi/raw/master/$self_name.1", - 'pinxi-man' => "https://smxi.org/in/$self_name.1", - 'pinxi-man-gh' => "https://codeberg.org/smxi/inxi/raw/inxi-perl/$self_name.1", + "$self_name-dev" => 'https://smxi.org/in/', + "$self_name-dev-ftp" => 'ftp://ftp.smxi.org/outgoing/', + "inxi-main" => 'https://codeberg.org/smxi/inxi/raw/master/', + 'pinxi-main' => 'https://codeberg.org/smxi/pinxi/raw/master/', ); - if (exists $defaults{$type}){ + if ($defaults{$type}){ return $defaults{$type}; } else { @@ -4571,7 +4598,6 @@ sub update_me { $self_path =~ s/\/$//; # dirname sometimes ends with /, sometimes not $self_download =~ s/\/$//; # dirname sometimes ends with /, sometimes not my $full_self_path = "$self_path/$self_name"; - if ($b_irc){ error_handler('not-in-irc', "-U/--update") } @@ -4588,7 +4614,6 @@ sub update_me { $output = ''; $self_download = "$self_download/$self_name"; $file_contents = download_file('stdout', $self_download); - # then do the actual download if ($file_contents){ # make sure the whole file got downloaded and is in the variable @@ -4607,7 +4632,7 @@ sub update_me { print $output; $output = ''; if ($use{'man'}){ - update_man($download_id); + update_man($self_download,$download_id); } else { print "Skipping man download because branch version is being used.\n"; @@ -4627,7 +4652,7 @@ sub update_me { sub update_man { eval $start if $b_log; - my ($download_id) = @_; + my ($self_download,$download_id) = @_; my $man_file_location = set_man_location(); my $man_file_path = "$man_file_location/$self_name.1" ; my ($file_contents,$man_file_url,$output,$program) = ('','','',''); @@ -4653,13 +4678,8 @@ sub update_man { print "Required program gzip not found. Unable to install man page.\n"; return 0; } - # first choice is inxi.1/pinxi.1 from gh, second from smxi.org - if ($download_id ne 'dev server'){ - $man_file_url = get_defaults($self_name . '-man-gh'); - } - else { - $man_file_url = get_defaults($self_name . '-man'); - } + # first choice is inxi.1/pinxi.1 from gh, second from smxi.org + $man_file_url = $self_download . '.1'; print "Updating $self_name.1 in $man_file_location\n"; print "using $download_id branch as download source\n"; print "Downloading man page file...\n"; @@ -5343,11 +5363,11 @@ sub get { 'fake:s' => sub { my ($opt,$arg) = @_; if ($arg){ - my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|iomem|ip-if|ipmi|'; - $wl .= 'logical|lspci|partitions|pciconf|pcictl|pcidump|'; + my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|egl|elbrus|glx|'; + $wl .= 'iomem|ip-if|ipmi|logical|lspci|partitions|pciconf|pcictl|pcidump|'; $wl .= 'raid-btrfs|raid-hw|raid-lvm|raid-md|raid-soft|raid-zfs|'; $wl .= 'sensors|sensors-sys|swaymsg|sys-mem|sysctl|uptime|usbconfig|'; - $wl .= 'usbdevs|vmstat|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr'; + $wl .= 'usbdevs|vmstat|vulkan|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr'; for (split(',',$arg)){ if ($_ =~ /\b($wl)\b/){ $fake{lc($1)} = 1; @@ -5513,7 +5533,7 @@ sub get { $debugger{'sys-force'} = 1;}, 'tty' => sub { # workaround for ansible/scripts running this $b_irc = 0;}, - 'U|update:s' => sub { # 1,2,3 OR http://myserver/path/inxi + 'U|update:s' => sub { # 1,2,3,4 OR http://myserver/path/inxi my ($opt,$arg) = @_; process_updater($opt,$arg);}, 'usb-sys' => sub { @@ -5556,7 +5576,7 @@ sub post_process { main::set_downloader(); } $use{'man'} = 0 if (!$use{'yes-man'} || $use{'no-man'}); - main::update_me($self_download, $download_id) if $use{'update-trigger'}; + main::update_me($self_download,$download_id) if $use{'update-trigger'}; main::set_xorg_log() if $show{'graphic'}; if ($b_pledge){ my $b_update; @@ -5587,7 +5607,10 @@ sub post_process { main::error_handler('bad-arg', '-l/-u', 'missing required option(s) -j, -o, -p, -P'); } $extra = 3 if $b_admin; - $show{'graphic-basic'} = 0 if $show{'graphic-full'} && $extra > 1; + # this turns off basic for F/v graphic output levels. + if ($show{'graphic-basic'} && $show{'graphic-full'} && $extra > 1){ + $show{'graphic-basic'} = 0; + } if ($force{'rpm'}){ $force{'pkg'} = 1; delete $force{'rpm'}; @@ -5685,32 +5708,39 @@ sub process_updater { $use{'downloader'} = 1; if ($use{'update'}){ $use{'update-trigger'} = 1; - if (!$arg && $self_name eq 'pinxi'){ + if (!$arg){ $use{'man'} = 1; - $download_id = 'inxi-perl branch'; - $self_download = main::get_defaults('inxi-pinxi'); + $download_id = "$self_name main branch"; + $self_download = main::get_defaults("$self_name-main"); } elsif ($arg && $arg eq '3'){ $use{'man'} = 1; $download_id = 'dev server'; - $self_download = main::get_defaults('inxi-dev'); + $self_download = main::get_defaults("$self_name-dev"); } - else { - if (!$arg){ - $download_id = 'main branch'; - $self_download = main::get_defaults('inxi-main'); - $use{'man'} = 1; - $use{'yes-man'} = 1; - } - elsif ($arg =~ /^[12]$/){ + elsif ($arg && $arg eq '4'){ + $use{'man'} = 1; + $use{'ftp-download'} = 1; + $download_id = 'dev server ftp'; + $self_download = main::get_defaults("$self_name-dev-ftp"); + } + elsif ($arg =~ /^[12]$/){ + if ($self_name eq 'inxi'){ $download_id = "branch $arg"; $self_download = main::get_defaults("inxi-branch-$arg"); } - elsif ($arg =~ /^http/){ - $download_id = 'alt server'; - $self_download = $arg; + else { + main::error_handler('bad-arg', $opt, $arg); } } + elsif ($arg =~ /^(ftp|https?):/){ + $download_id = 'alt server'; + $self_download = $arg; + } + if ($self_download && $self_name eq 'inxi'){ + $use{'man'} = 1; + $use{'yes-man'} = 1; + } if (!$self_download){ main::error_handler('bad-arg', $opt, $arg); } @@ -5778,7 +5808,7 @@ sub show_options { ['1', '', '--gpu', "Deprecated. Triggers -Ga."], ['1', '-G', '--graphics', "Graphics info (devices(s), drivers, display protocol (if available), display server/Wayland compositor, resolution, X.org: - renderer, OpenGL version; Xvesa: VBE info."], + renderer, basic EGL, OpenGL, Vulkan API data; Xvesa API: VBE info."], ['1', '-i', '--ip', "WAN IP address and local interfaces (requires ifconfig or ip network tool). Triggers -n. Not shown with -F for user security reasons. You shouldn't paste your local/WAN IP."], @@ -5956,9 +5986,9 @@ sub show_options { ['2', '-E', '', "PCI/USB Bus ID of device, driver version, LMP version."], ['2', '-G', '', "GPU arch (AMD/Intel/Nvidia only); Specific vendor/product - information (if relevant); PCI/USB ID of device; Direct rendering status - (in X); Screen number GPU is running on (Nvidia only); device temp (Linux, - if found)."], + information (if relevant); PCI/USB ID of device; Screen number GPU is running + on (Nvidia only); device temp (Linux, if found); APIs: EGL: active/inactive + platforms; OpenGL: direct rendering status (in X); Vulkan device counts."], ['2', '-i', '', "For IPv6, show additional scope addresses: Global, Site, Temporary, Unknown. See --limit for large counts of IP addresses."], ['2', '-I', '', "Default system GCC. With -xx, also shows other installed @@ -6005,11 +6035,12 @@ sub show_options { (if found); USB rev, speed, lanes (if found)."], ['2', '-G', '', "Chip vendor:product ID for each video device; Output ports, used and empty; PCIe speed, lanes (if found); USB rev, speed, lanes (if - found); Xorg: OpenGL compatibility version, if free drivers and available; - Xorg compositor; alternate Xorg drivers (if available. Alternate means driver - is on automatic driver check list of Xorg for the device vendor, but is not - installed on system); Xorg Screen data: ID, s-res, dpi; Monitors: ID, - position (if > 1), resolution, dpi, model, diagonal."], + found); Xorg: Xorg compositor; alternate Xorg drivers (if available. Alternate + means driver is on automatic driver check list of Xorg for the device vendor, + but is not installed on system); Xorg Screen data: ID, s-res, dpi; Monitors: + ID, position (if > 1), resolution, dpi, model, diagonal; APIs: EGL: per + platform report; OpenGL: ES version, device-ID, display-ID (if not found in + Display line); Vulkan: per device report."], ['2', '-I', '', "Other detected installed gcc versions (if present). System default target/runlevel. Adds parent program (or pty/tty) for shell info if not in IRC. Adds Init version number, RC (if found). Adds per package manager @@ -6053,7 +6084,8 @@ sub show_options { ['2', '-E', '', "Serial number, class ID, bluetooth device class ID, HCI version and revision."], ['2', '-G', '', "Device serial number, class ID; Xorg Screen size, diag; - Monitors: hz, size, modes, serial, scale, modes (max/min)."], + Monitors: hz, size, modes, serial, scale, modes (max/min); APIs: EGL: hardware + driver info; Vulkan: layer count, device hardware vendor."], ['2', '-I', '', "For 'Shell:' adds ([doas|su|sudo|login]) to shell name if present; adds default shell+version if different; for 'running in:' adds (SSH) if SSH session; adds wakeups: (from suspend) to Uptime."], @@ -6099,7 +6131,8 @@ sub show_options { non-free driver info (Nvidia only); PCIe lanes-max: gen, speed, lanes (if relevant); USB mode (if found); list of alternate kernel modules/drivers for device(s) (if available); Monitor built year, gamma, screen ratio (if - available)."], + available); APIs: OpenGL: device memory, unified memory status; Vulkan: adds + full device report, device name, driver version, surfaces."], ['2', '-I', '', "Adds to Packages total number of lib files found for each package manager and pm tools (if not -r); adds init service tool."], ['2', '-j,-p,-P', '', "For swap (if available): swappiness and vfs cache @@ -6140,11 +6173,12 @@ sub show_options { otherwise user is fine. Man page installs require root. No arguments downloads from main $self_name git repo."], ['1', '', '', "Use alternate sources for updating $self_name"], - ['2', '1', '', "Get the git branch one version."], - ['2', '2', '', "Get the git branch two version."], ['3', '3', '', "Get the dev server (smxi.org) version."], - ['2', '', '', "Get a version of $self_name from your own server. - Use the full download path, e.g.^$self_name^-U^https://myserver.com/inxi"], + ['3', '4', '', "Get the dev server (smxi.org) FTP version. Use if SSL issues + and --no-ssl doesn't work."], + ['2', '', '', "Get a version of $self_name from your own + server. Use the full download path, e.g. + ^$self_name^-U ^https://myserver.com/inxi"], ); } push(@$rows, @@ -6951,19 +6985,21 @@ sub message { 'edid-revision' => "invalid EDID revision: $id", 'edid-sync' => "bad sync value: $id", 'edid-version' => "invalid EDID version: $id", - 'egl-wayland' => 'No known Wayland EGL/GBM data sources.', - 'egl-wayland-console' => 'No known Wayland EGL/GBM data sources.', + 'egl-null' => 'No EGL data available.', + 'egl-missing' => 'EGL data requires eglinfo. Check --recommends.', 'file-unreadable' => 'File not readable (permissions?)', - 'gfx-api' => 'No display API data. No known data sources.', - 'gfx-api-console' => 'No display API data available in console. Headless machine?', - 'gfx-api-xvesa' => 'No Xvesa VBE/GOP data found.', - 'gl-console-glxinfo-missing' => 'GL data unavailable in console and glxinfo missing.', - 'gl-console-root' => 'GL data unavailable in console for root.', - 'gl-console-try' => 'GL data unavailable in console. Try -G --display', - 'gl-display-root' => 'GL data unavailable for root.', - 'gl-null' => 'No GL data found on this system.', - 'gl-value-empty' => 'Unset. Missing GL driver?', - 'glxinfo-missing' => 'Unable to show GL data. Required tool glxinfo missing.', + 'gfx-api' => 'No display API data available.', + 'gfx-api-console' => 'No API data available in console. Headless machine?', + 'glx-console-glxinfo-missing' => 'GL data unavailable in console, glxinfo missing.', + 'glx-console-root' => 'GL data unavailable in console for root.', + 'glx-console-try' => 'GL data unavailable in console. Try -G --display', + 'glx-display-root' => 'GL data unavailable for root.', + 'glx-egl' => 'incomplete (EGL sourced)', + 'glx-egl-console' => 'console (EGL sourced)', + 'glx-egl-missing' => 'glxinfo missing (EGL sourced)', + 'glx-null' => 'No GL data available.', + 'glx-value-empty' => 'Unset. Missing GL driver?', + 'glxinfo-missing' => 'Unable to show GL data. glxinfo is missing.', 'IP' => "No $id found. Connected to web? SSL issues?", 'IP-dig' => "No $id found. Connected to web? SSL issues? Try --no-dig", 'IP-no-dig' => "No $id found. Connected to web? SSL issues? Try enabling dig", @@ -7050,8 +7086,10 @@ sub message { 'unknown-dev' => 'ERR-102', 'unknown-device-id' => 'unknown device ID', 'unknown-shell' => 'ERR-100', + 'vulkan-null' => 'No Vulkan data available.', 'weather-error' => "Error: $id", 'weather-null' => "No $id found. Internet connection working?", + 'xvesa-null' => 'No Xvesa VBE/GOP data found.', ); return $message{$type}; } @@ -11467,6 +11505,8 @@ sub cp_cpu_arch { my $check = main::message('note-check'); # See: docs/inxi-cpu.txt # print "type:$type fam:$family model:$model step:$stepping\n"; + # Note: AMD family is not Ext fam . fam but rather Ext-fam + fam. + # But model is Ext model . model... if ($type eq 'amd'){ if ($family eq '3'){ $arch = 'Am386'; @@ -11702,6 +11742,7 @@ sub cp_cpu_arch { elsif ($family eq '19'){ # AF # zen 4 raphael, phoenix 1 use n5 I believe # Epyc Bergamo zen4c 4nm, only few full model IDs, update when appear + # zen4c is for cloud hyperscale if ($model =~ /^(78)$/){ $arch = 'Zen 4c'; $gen = '5'; @@ -11731,9 +11772,26 @@ sub cp_cpu_arch { $note = $check; $process = 'TSMC n5 (5nm)'; $year = '2021-22';} - # Zen 5: TSMC n3 } - ## Roadmap: check to verify, AMD is usually closer to target than Intel + # Zen 5: TSMC n3/n4, epyc turin / granite ridge? / turin dense zen 5c 3nm + elsif ($family eq '20'){ # BF + if ($model =~ /^(0)$/){ + $arch = 'Zen 5'; + $gen = '5'; + $process = 'TSMC n3 (3nm)'; # turin could be 4nm, need more data + $year = '2023+';} + elsif ($model =~ /^(20|40)$/){ + $arch = 'Zen 5'; + $gen = '5'; + $process = 'TSMC n3 (3nm)'; # desktop, granite ridge, confirm 2024 + $year = '2024+';} + else { + $arch = 'Zen 5'; + $note = $check; + $process = 'TSMC n3/n4 (3,4nm)'; + $year = '2024+';} + } + # Roadmap: check to verify, AMD is usually closer to target than Intel # Epyc 4 genoa: zen 4, nm, 2022+ (dec 2022), cxl-1.1,pcie-5, ddr-5 } # we have no advanced data for ARM cpus, this is an area that could be improved? @@ -12217,13 +12275,13 @@ sub cp_cpu_arch { $arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800 $process = 'Intel 7 (10nm)'; $year = '2022+';} - elsif ($model =~ /^(BD)$/){ - $arch = 'Lunar Lake'; # 16 gn + elsif ($model =~ /^(BC|BD)$/){ + $arch = 'Lunar Lake'; # 15 gn $process = 'Intel 18a (1.8nm)'; $year = '2024+';} # check when actually in production # Meteor Lake-S maybe cancelled, replaced by arrow - elsif ($model =~ /^(C6)$/){ - $arch = 'Arrow Lake'; # 15 gn + elsif ($model =~ /^(C5|C6)$/){ + $arch = 'Arrow Lake'; # 14 gn # gfx tile is TSMC 3nm $process = 'Intel 20a (2nm)';# TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9) $year = '2024+';} # check when actually in production @@ -12238,11 +12296,11 @@ sub cp_cpu_arch { # Diamond Rapids: Intel 3 (7nm+), 2025 # Raptor Lake: 13 gen, Intel 7 (10nm), 2022 # Meteor Lake: 14 gen, Intel 4 (7nm+) - # Arrow Lake - 15 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024 - # Panther Lake - 15 gen, ? - # Beast Lake - 15 gen, ? - # Lunar Lake - 16 gen, Intel 18A (1.8nm), 2024-5 - # Nova Lake - 17 gen, Intel 18A (1.8nm), 2026 + # Arrow Lake - 14 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024 + # Lunar Lake - 15 gen, Intel 18A (1.8nm), 2024-5 + # Panther Lake - 15 gen, ?, late 2025, cougar cove Xe3 Celestial GPU architecture + # Beast Lake - 16 gen, ?, 2026? + # Nova Lake - 16 gen, Intel 18A (1.8nm), 2026 } # itanium 1 family 7 all recalled elsif ($family eq 'B'){ @@ -14127,18 +14185,19 @@ sub set_disk_vendors { ['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS # MU = Multiple_Flash_Reader too risky: |M[UZ][^L] HD103SI HD start risky # HM320II HM320II HM - ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CUT|[DG]3 Station|DUO\b|DUT|CKT|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM + ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CKT|CUT|[DG]3 Station|DUO\b|DUT|EB\dMW|GE4S5|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM # Android UMS Composite?U1 - ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''], + ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SN(\d+G|128|256)|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''], # these are HP/Sandisk cobranded. DX110064A5xnNMRI ids as HP and Sandisc ['(^DX[1-9])','^(HP\b|SANDDISK)','Sandisk/HP',''], # ssd drive, must come before seagate ST test # real, SSEAGATE Backup+; XP1600HE30002 | 024 HN (spinpoint) ; possible usb: 24AS # ST[numbers] excludes other ST starting devices ['([S]?SEAGATE|^((Barra|Fire)Cuda|BUP|EM\d{3}|Expansion|(ATA\s|HDD\s)?ST\d{2}|5AS|X[AFP])|Backup(\+|\s?Plus)\s?(Hub)?|DS2\d|Expansion Desk|FreeAgent|GoFlex|INIC|IronWolf|OneTouch|Slim\s?BK)','[S]?SEAGATE','Seagate',''], - ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''], + ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SN530|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''], # rare cases WDC is in middle of string ['(\bWDC\b|1002FAEX)','','Western Digital',''], - ## THEN BETTER KNOWN ONESs ## + + ## THEN BETTER KNOWN ONES ## ['^Acer','^Acer','Acer',''], # A-Data can be in middle of string ['^(.*\bA-?DATA|ASP\d|AX[MN]|CH11|FX63|HV[1-9]|IM2|HD[1-9]|HDD\s?CH|IUM|SX\d|Swordfish)','A-?DATA','A-Data',''], @@ -14147,7 +14206,7 @@ sub set_disk_vendors { ['^ATP','^ATP\b','ATP',''], # Force MP500 ['^(Corsair|Force\s|(Flash\s*)?(Survivor|Voyager)|Neutron|Padlock)','^Corsair','Corsair',''], - ['^(FUJITSU|MJA|MH[TVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''], + ['^(FUJITSU|MJA|MH[RTVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''], # MAB3045SP shows as HP or Fujitsu, probably HP branded fujitsu ['^(MAB\d)','^(HP\b|FUJITSU)','Fujitsu/HP',''], # note: 2012: wdc bought hgst @@ -14170,6 +14229,7 @@ sub set_disk_vendors { # note: get rid of: M[DGK] becasue mushkin starts with MK # note: seen: KXG50ZNV512G NVMe TOSHIBA 512GB | THNSN51T02DUK NVMe TOSHIBA 1024GB ['(TOSHIBA|TransMemory|KBG4|^((A\s)?DT01A|M[GKQ]\d|HDW|SA\d{2}G$|(008|016|032|064|128)G[379E][0-9A]$|[S]?TOS|THN)|0930|KSG\d)','S?(TOSHIBA|0930)','Toshiba',''], # scsi-STOSHIBA_STOR.E_EDITION_ + ## LAST: THEY ARE SHORT AND COULD LEAD TO FALSE ID, OR ARE UNLIKELY ## # unknown: AL25744_12345678; ADP may be usb 2.5" adapter; udisk unknown: Z1E6FTKJ 00AAKS # SSD2SC240G726A10 MRS020A128GTS25C EHSAJM0016GB @@ -14188,12 +14248,15 @@ sub set_disk_vendors { ['^(Advantech|SQF)','^Advantech','Advantech',''], ['^AEGO','^AEGO','AEGO',''], ['^AFOX','^AFOX','AFOX',''], + ['^AFTERSHOCK','^AFTERSHOCK','AFTERSHOCK',''], ['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''], ['^Aigo','^Aigo','Aigo',''], + ['^AirDisk','^AirDisk','AirDisk',''], ['^Aireye','^Aireye','Aireye',''], ['^Alcatel','^Alcatel','Alcatel',''], ['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''], ['^Alfawise','^Alfawise','Alfawise',''], + ['(^ALKETRON|FireWizard)','^ALKETRON','ALKETRON',''], ['^Android','^Android','Android',''], ['^ANACOMDA','^ANACOMDA','ANACOMDA',''], ['^Ant[\s_-]?Esports','^Ant[\s_-]?Esports','Ant Esports',''], @@ -14240,12 +14303,14 @@ sub set_disk_vendors { ['^Clover','^Clover','Clover',''], ['^CODi','^CODi','CODi',''], ['^Colorful\b','^Colorful','Colorful',''], + ['^CONSISTENT','^CONSISTENT','Consistent',''], # note: www.cornbuy.com is both a brand and also sells other brands, like newegg # addlink; colorful; goldenfir; kodkak; maxson; netac; teclast; vaseky ['^Corn','^Corn','Corn',''], ['^CnMemory|Spaceloop','^CnMemory','CnMemory',''], ['^(Creative|(Nomad\s?)?MuVo)','^Creative','Creative',''], ['^CSD','^CSD','CSD',''], + ['^CYX\b','^CYX','CYX',''], ['^(Dane-?Elec|Z Mate)','^Dane-?Elec','DaneElec',''], ['^DATABAR','^DATABAR','DataBar',''], # Daplink vfs is an ARM software thing @@ -14257,6 +14322,7 @@ sub set_disk_vendors { ['^DeLOCK','^Delock(\s?products)?','Delock',''], ['^Derler','^Derler','Derler',''], ['^detech','^detech','DETech',''], + ['^DEXP','^DEXP','DEXP',''], ['^DGM','^DGM\b','DGM',''], ['^(DICOM|MAESTRO)','^DICOM','DICOM',''], ['^Digifast','^Digifast','Digifast',''], @@ -14290,8 +14356,11 @@ sub set_disk_vendors { ['^(Shenzhen\s)?Etopso(\sTechnology)?','^(Shenzhen\s)?Etopso(\sTechnology)?','Etopso',''], ['^EURS','^EURS','EURS',''], ['^eVAULT','^eVAULT','eVAULT',''], + ['^EVM','^EVM','EVM',''], + ['^eVtran','^eVtran','eVtran',''], # NOTE: ESA3... may be IBM PCIe SAD card/drives ['^(EXCELSTOR|r technology)','^EXCELSTOR( TECHNO(LOGY)?)?','ExcelStor',''], + ['^EXRAM','^EXRAM','EXRAM',''], ['^EYOTA','^EYOTA','EYOTA',''], ['^EZCOOL','^EZCOOL','EZCOOL',''], ['^EZLINK','^EZLINK','EZLINK',''], @@ -14324,6 +14393,7 @@ sub set_disk_vendors { ['^(Gigabyte|GP-G)','^Gigabyte','Gigabyte',''], # SSD ['^Gigastone','^Gigastone','Gigastone',''], ['^Gigaware','^Gigaware','Gigaware',''], + ['^GJN','^GJN\b','GJN',''], ['^(Gloway|FER\d)','^Gloway','Gloway',''], ['^GLOWY','^GLOWY','Glowy',''], ['^Goldendisk','^Goldendisk','Goldendisk',''], @@ -14350,6 +14420,7 @@ sub set_disk_vendors { ['^HEMA','^HEMA','HEMA',''], ['(HEORIADY|^HX-0)','^HEORIADY','HEORIADY',''], ['^(Hikvision|HKVSN|HS-SSD)','^Hikvision','Hikvision',''], + ['^Hi[\s-]?Level ','^Hi[\s-]?Level ','Hi-Level',''], # ^HI\b with no Level? ['^(Hisense|H8G)','^Hisense','Hisense',''], ['^Hoodisk','^Hoodisk','Hoodisk',''], ['^HUAWEI','^HUAWEI','Huawei',''], @@ -14400,6 +14471,7 @@ sub set_disk_vendors { ['^KimMIDI','^KimMIDI','KimMIDI',''], ['^Kimtigo','^Kimtigo','Kimtigo',''], ['^Kingbank','^Kingbank','Kingbank',''], + ['^(KingCell|KC\b)','^KingCell','KingCell',''], ['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''], ['^KINGCOMP','^KINGCOMP','KingComp',''], ['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''], @@ -14408,7 +14480,7 @@ sub set_disk_vendors { ['^Kingrich','^Kingrich','Kingrich',''], ['^Kingsand','^Kingsand','Kingsand',''], ['KING\s?SHA\s?RE','KING\s?SHA\s?RE','KingShare',''], - ['^(KingSpec|ACSC|C3000|KS[DQ]|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], + ['^(KingSpec|ACSC|C3000|KS[DQ]|MSH|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], ['^KingSSD','^KingSSD','KingSSD',''], # kingwin docking, not actual drive ['^(EZD|EZ-Dock)','','Kingwin Docking Station',''], @@ -14429,7 +14501,7 @@ sub set_disk_vendors { ['^(Lazos|L-?ISS)','^Lazos','Lazos',''], ['^LDLC','^LDLC','LDLC',''], # LENSE30512GMSP34MEAT3TA / UMIS RPITJ256PED2MWX - ['^(LEN|UMIS)','^Lenovo','Lenovo',''], + ['^(LEN|UMIS|Think)','^Lenovo','Lenovo',''], ['^RPFT','','Lenovo O.E.M.',''], # JAJS300M120C JAJM600M256C JAJS600M1024C JAJS600M256C JAJMS600M128G ['^(Leven|JAJ[MS])','^Leven','Leven',''], @@ -14444,13 +14516,13 @@ sub set_disk_vendors { ['^(LSI|MegaRAID)','^LSI\b','LSI',''], ['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''], ['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''], - ['^(MacroVIP|MV\d)','^MacroVIP','MacroVIP',''], + ['^(MacroVIP|MV(\d|GLD))','^MacroVIP','MacroVIP',''], # maybe MV alone ['^Mainic','^Mainic','Mainic',''], + ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''], ['^Maxell','^Maxell','Maxell',''], ['^Maximus','^Maximus','Maximus',''], + ['^MAXIO','^MAXIO','Maxio',''], ['^Maxone','^Maxone','Maxone',''], - ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], - ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''], ['^MARVELL','^MARVELL','Marvell',''], ['^Maxsun','^Maxsun','Maxsun',''], ['^MDT\b','^MDT','MDT (rebuilt WD/Seagate)',''], # mdt rebuilds wd/seagate hdd @@ -14458,7 +14530,9 @@ sub set_disk_vendors { ['^MD[1-9]','^Max\s*Digital','MaxDigital',''], ['^Medion','^Medion','Medion',''], ['^(MEDIAMAX|WL\d{2})','^MEDIAMAX','MediaMax',''], + ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], ['^Mengmi','^Mengmi','Mengmi',''], + ['^MicroFrom','^MicroFrom','MicroFrom',''], ['^MGTEC','^MGTEC','MGTEC',''], # must come before micron ['^(Mtron|MSP)','^Mtron','Mtron',''], @@ -14477,8 +14551,9 @@ sub set_disk_vendors { ['^Morebeck','^Morebeck','Morebeck',''], ['^(Moser\s?Bear|MBIL)','^Moser\s?Bear','Moser Bear',''], ['^(Motile|SSM\d)','^Motile','Motile',''], - ['^(Motorola|XT\d{4})','^Motorola','Motorola',''], + ['^(Motorola|XT\d{4}|Moto[\s-]?[EG])','^Motorola','Motorola',''], ['^Moweek','^Moweek','Moweek',''], + ['^Move[\s-]?Speed','^Move[\s-]?Speed','Move Speed',''], #MRMAD4B128GC9M2C ['^(MRMA|Memoright)','^Memoright','Memoright',''], ['^MSI\b','^MSI\b','MSI',''], @@ -14488,11 +14563,13 @@ sub set_disk_vendors { ['^(Myson)','^Myson([\s-]?Century)?([\s-]?Inc\.?)?','Myson Century',''], ['^(Natusun|i-flashdisk)','^Natusun','Natusun',''], ['^(Neo\s*Forza|NFS\d)','^Neo\s*Forza','Neo Forza',''], - ['^(Netac|OnlyDisk|S535N)','^Netac','Netac',''], + ['^(Netac|NS\d{3}|OnlyDisk|S535N)','^Netac','Netac',''], + ['^Newsmy','^Newsmy','Newsmy',''], ['^NFHK','^NFHK','NFHK',''], # NGFF is a type, like msata, sata ['^Nik','^Nikimi','Nikimi',''], ['^NOREL','^NOREL(SYS)?','NorelSys',''], + ['^(N[\s-]?Tech|NT\d)','^N[\s-]?Tec','N Tech',''], # coudl be ^NT alone ['^ODYS','^ODYS','ODYS',''], ['^Olympus','^Olympus','Olympus',''], ['^Orico','^Orico','Orico',''], @@ -14516,15 +14593,17 @@ sub set_disk_vendors { ['^(Premiertek|QSSD|Quaroni)','^Premiertek','Premiertek',''], ['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''], ['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''], - # PS3109S9 is the result of an error condition with ssd drive + # PS3109S9 is the result of an error condition with ssd controller: Phison PS3109 ['^PUSKILL','^PUSKILL','Puskill',''], ['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK ['(^Quantum|Fireball)','^Quantum','Quantum',''], ['(^QOOTEC|QMT)','^QOOTEC','QOOTEC',''], - ['^QUMO','^QUMO','Qumo',''], + ['^(QUMO|Q\dDT)','^QUMO','Qumo',''], + ['^QOPP','^QOPP','Qopp',''], ['^Qunion','^Qunion','Qunion',''], ['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd ['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''], + ['^RAMOS','^RAMOS','RAmos',''], ['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''], ['^RCESSD','^RCESSD','RCESSD',''], ['^(Realtek|RTL)','^Realtek','Realtek',''], @@ -14537,6 +14616,7 @@ sub set_disk_vendors { #RTDMA008RAV2BWL comes with lenovo but don't know brand ['^Runcore','^Runcore','Runcore',''], ['^Rundisk','^Rundisk','RunDisk',''], + ['^RZX','^RZX\b','RZX',''], ['^(S3Plus|S3\s?SSD)','^S3Plus','S3Plus',''], ['^(Sabrent|Rocket)','^Sabrent','Sabrent',''], ['^Sage','^Sage(\s?Micro)?','Sage Micro',''], @@ -14553,6 +14633,7 @@ sub set_disk_vendors { ['(Silicon[\s-]?Power|^SP[CP]C|^Silicon|^Diamond|^HasTopSunlightpeed)','Silicon[\s-]?Power','Silicon Power',''], # simple drive could also maybe be hgst ['^(Simple\s?Tech|Simple[\s-]?Drive)','^Simple\s?Tech','SimpleTech',''], + ['^(Simmtronics?|S[79]\d{2}|ZipX)','^Simmtronics?','Simmtronics',''], ['^SINTECHI?','^SINTECHI?','SinTech (adapter)',''], ['^SiS\b','^SiS','SiS',''], ['Smartbuy','\s?Smartbuy','Smartbuy',''], # SSD Smartbuy 60GB; mSata Smartbuy 3 @@ -14563,9 +14644,11 @@ sub set_disk_vendors { ['^Skill','^Skill','Skill',''], ['^(SMART( Storage Systems)?|TX)','^(SMART( Storage Systems)?)','Smart Storage Systems',''], ['^Sobetter','^Sobetter','Sobetter',''], + ['^Solidata','^Solidata','Solidata',''], ['^(SOLIDIGM|SSDPFK)','^SOLIDIGM\b','solidgm',''], ['^(Sony|IM9|Microvalut|S[FR]-)','^Sony','Sony',''], ['^(SSSTC|CL1-)','^SSSTC','SSSTC',''], + ['^(SST|SG[AN])','^SST\b','SST',''], ['^STE[CK]','^STE[CK]','sTec',''], # wd bought this one ['^STORFLY','^STORFLY','StorFly',''], ['\dSUN\d','^SUN(\sMicrosystems)?','Sun Microsystems',''], @@ -14587,7 +14670,7 @@ sub set_disk_vendors { ['^(TC[\s-]*SUNBOW|X3\s\d+[GT])','^TC[\s-]*SUNBOW','TCSunBow',''], ['^(TDK|TF[1-9]\d|LoR)','^TDK','TDK',''], ['^TEAC','^TEAC','TEAC',''], - ['^(TEAM|T[\s-]?Create|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''], + ['^(TEAM|T[\s-]?Create|CX[12]\b|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''], ['^(Teclast|CoolFlash)','^Teclast','Teclast',''], ['^(tecmiyo)','^tecmiyo','TECMIYO',''], ['^Teelkoou','^Teelkoou','Teelkoou',''], @@ -14635,7 +14718,7 @@ sub set_disk_vendors { ['^Walton','^Walton','Walton',''], ['^(Wearable|Air-?Stash)','^Wearable','Wearable',''], ['^Wellcomm','^Wellcomm','Wellcomm',''], - ['^(wicgtyp|N900)','^wicgtyp','wicgtyp',''], + ['^(wicgtyp|N[V]?900)','^wicgtyp','wicgtyp',''], ['^Wilk','^Wilk','Wilk',''], ['^(WinMemory|SWG\d)','^WinMemory','WinMemory',''], ['^(Winton|WT\d{2})','^Winton','Winton',''], @@ -14662,6 +14745,7 @@ sub set_disk_vendors { ['^Zenfast','^Zenfast','Zenfast',''], ['^Zenith','^Zenith','Zenith',''], ['^ZEUSLAP','^ZEUSLAP','ZEUSLAP',''], + ['^ZEUSS','^ZEUSS','Zeuss',''], ['^(Zheino|CHN|CNM)','^Zheino','Zheino',''], ['^(Zotac|ZTSSD)','^Zotac','Zotac',''], ['^ZSPEED','^ZSPEED','ZSpeed',''], @@ -14918,7 +15002,8 @@ sub drive_speed { ## GraphicItem { package GraphicItem; -my ($b_primary,$b_wayland_data,%graphics,$monitor_ids,$monitor_map); +my ($b_primary,$b_wayland_data,%graphics,%mesa_drivers, +$monitor_ids,$monitor_map); my ($gpu_amd,$gpu_intel,$gpu_nv); sub get { @@ -14955,7 +15040,7 @@ sub get { # note: not perfect, but we need usb gfx to show for all types, soc, pci, etc usb_output($rows); display_output($rows); - display_api_output($rows); + display_api($rows); (%graphics,$monitor_ids,$monitor_map) = (); eval $end if $b_log; return $rows; @@ -15605,205 +15690,375 @@ sub monitors_output_full { eval $end if $b_log; } -## DISPLAY API OUTPUT ## -# as soon as EGL data source for Wayland appears add it! -sub display_api_output { +## DISPLAY API ## + +# API Output # + +# GLX/OpenGL EGL Vulkan XVesa +sub display_api { eval $start if $b_log; my $rows = $_[0]; - my $num = 0; - my ($api,$program,$type); # print ("$b_display : $b_root\n"); # xvesa is absolute, if it's there, it works in or out of display if ($graphics{'xvesa'}){ - xvesa_output($rows,\$num); + xvesa_output($rows); + return; } - else { + my ($b_egl,$b_egl_print,$b_glx,$b_glx_print,$b_vulkan,$api,$program,$type); + my $gl = {}; + if ($fake{'egl'} || ($program = main::check_program('eglinfo'))){ + gl_data('egl',$program,$rows,$gl); + $b_egl = 1; + } + if ($fake{'glx'} || ($program = main::check_program('glxinfo'))){ + gl_data('glx',$program,$rows,$gl) if $b_display; + $b_glx = 1; + } + # Note: we let gl/egl output handle null or root null data issues + if ($gl->{'glx'}){ + process_glx_data($gl->{'glx'},$b_glx); + } + # egl/vulkan give data out of display, and for root + # if ($b_egl}){ + if ($b_egl && ($show{'graphic-full'} || !$gl->{'glx'})){ + egl_output($rows,$gl); + $b_egl_print = 1; + } + # fill in whatever was missing from eglinfo, or if legacy system/no eglinfo + # if ($b_glx || $gl->{'glx'}){ + if (($show{'graphic-full'} && ($b_glx || $gl->{'glx'})) || + (!$show{'graphic-full'} && !$b_egl_print && ($b_glx || $gl->{'glx'}))){ + opengl_output($rows,$gl); + $b_glx = 1; + $b_glx_print = 1; + } + # if ($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))){ + if (($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))) && + ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print))){ + vulkan_output($program,$rows); + $b_vulkan = 1; + } + if ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print)){ + # remember, sudo/root usually has empty $DISPLAY as well if ($b_display){ - if (!$force{'wayland'} && ($program = main::check_program('glxinfo'))){ - opengl_output($program,$rows,\$num); + # first do positive tests, won't be set for sudo/root + if (!$b_glx && $graphics{'protocol'} eq 'x11'){ + $api = 'OpenGL'; + $type = 'glxinfo-missing'; } - # handles no data until we find one for wayland egl data - elsif ($graphics{'protocol'} eq 'wayland'){ - egl_output($rows,\$num); + elsif (!$b_egl && $graphics{'protocol'} eq 'wayland'){ + $api = 'EGL'; # /GBM + $type = 'egl-missing'; } - else { - if (main::check_program('X') || main::check_program('Xorg')){ - $api = 'OpenGL'; - $type = 'glxinfo-missing'; - } - # has to come after X tests, since X can have Xwayland installed. - elsif (main::check_program('Xwayland')){ - $api = 'EGL/GBM'; - $type = 'egl-wayland'; - } - else { - $api = 'N/A'; - $type = 'gfx-api'; - } - push(@$rows,{ - main::key($num++,1,1,'API') => $api, - main::key($num++,0,2,'Message') => main::message($type) - }); + elsif (!$b_glx && + (main::check_program('X') || main::check_program('Xorg'))){ + $api = 'OpenGL'; + $type = 'glxinfo-missing'; + } + elsif (!$b_egl && main::check_program('Xwayland')){ + $api = 'EGL'; + $type = 'egl-missing'; + } + elsif (!$b_egl && !$b_glx && !$b_vulkan) { + $api = 'N/A'; + $type = 'gfx-api'; } } else { - if ($graphics{'protocol'} eq 'wayland'){ - $api = 'EGL/GBM'; - $type = 'egl-wayland-console'; - } - elsif (main::check_program('glxinfo')){ + if (!$b_glx && + (main::check_program('X') || main::check_program('Xorg'))){ $api = 'OpenGL'; - $type = ($b_root) ? 'gl-console-root' : 'gl-console-try'; + $type = 'glx-console-glxinfo-missing'; } - elsif (main::check_program('X') || main::check_program('Xorg')){ - $api = 'OpenGL'; - $type = 'gl-console-glxinfo-missing'; - } - # has to come after X tests, since X can have Xwayland installed. - elsif (main::check_program('Xwayland')){ - $api = 'EGL/GBM'; - $type = 'egl-wayland-console'; + elsif (!$b_egl && main::check_program('Xwayland')){ + $api = 'EGL'; + $type = 'egl-console-missing'; } # we don't know what it is, headless system, non xwayland wayland - else { + elsif (!$b_egl && !$b_glx && !$b_vulkan) { $api = 'N/A'; $type = 'gfx-api-console'; } - push(@$rows,{ - main::key($num++,1,1,'API') => $api, - main::key($num++,0,2,'Message') => main::message($type) - }); } + no_data_output($api,$type,$rows) if $type; } eval $end if $b_log; } +sub no_data_output { + eval $start if $b_log; + my ($api,$type,$rows) = @_; + my $num = 0; + push(@$rows, { + main::key($num++,1,1,'API') => $api, + main::key($num++,0,2,'Message') => main::message($type) + }); + eval $end if $b_log; +} + sub egl_output { eval $start if $b_log; - my ($rows,$num) = @_; - push(@$rows,{ - main::key($num++,1,1,'API') => 'EGL/GBM', - main::key($num++,0,2,'Message') => main::message('egl-wayland') + my ($rows,$gl) = @_; + if (!$gl->{'egl'}){ + my $api = 'EGL'; + my $type = 'egl-null'; + no_data_output($api,$type,$rows); + return 0; + } + my ($i,$j,$num) = (0,scalar @$rows,0); + my ($value); + my $ref; + my $data = $gl->{'egl'}{'data'}; + my $plat = $gl->{'egl'}{'platforms'}; + push(@$rows, { + main::key($num++,1,1,'API') => 'EGL', }); + if ($extra < 2){ + $value = ($data->{'versions'}) ? join(',',sort keys %{$data->{'versions'}}): 'N/A'; + } + else { + $value = ($data->{'version'}) ? $data->{'version'}: 'N/A'; + } + $rows->[$j]{main::key($num++,0,2,'v')} = $value; + if ($extra < 2){ + $value = ($data->{'drivers'}) ? join(',',sort keys %{$data->{'drivers'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,2,'drivers')} = $value; + $value = ($data->{'platforms'}{'active'}) ? join(',',@{$data->{'platforms'}{'active'}}) : 'N/A'; + if ($extra < 1){ + $rows->[$j]{main::key($num++,0,2,'platforms')} = $value; + } + else { + $rows->[$j]{main::key($num++,1,2,'platforms')} = ''; + $rows->[$j]{main::key($num++,0,3,'active')} = $value; + $value = ($data->{'platforms'}{'inactive'}) ? join(',',@{$data->{'platforms'}{'inactive'}}) : 'N/A'; + $rows->[$j]{main::key($num++,0,3,'inactive')} = $value; + } + } + else { + if ($extra > 2 && $data->{'hw'}){ + $i = 0; + $rows->[$j]{main::key($num++,1,2,'hw')} = ''; + foreach my $key (sort keys %{$data->{'hw'}}){ + $value = ($key ne $data->{'hw'}{$key}) ? $data->{'hw'}{$key} . ' ' . $key: $key; + $rows->[$j]{main::key($num++,0,3,'drv')} = $value; + } + } + $rows->[$j]{main::key($num++,1,2,'platforms')} = ''; + $data->{'version'} ||= 0; + $i = 0; + foreach my $key (sort keys %$plat){ + next if !$plat->{$key}{'status'} || $plat->{$key}{'status'} eq 'inactive'; + if ($key eq 'device'){ + foreach my $id (sort keys %{$plat->{$key}}){ + next if ref $plat->{$key}{$id} ne 'HASH'; + $rows->[$j]{main::key($num++,1,3,$key)} = $id; + $ref = $plat->{$key}{$id}{'egl'}; + egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'}); + } + } + else { + $rows->[$j]{main::key($num++,1,3,$key)} = ''; + $ref = $plat->{$key}{'egl'}; + egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'}); + } + } + if (!$data->{'platforms'}{'active'}){ + $rows->[$j]{main::key($num++,0,3,'active')} = 'N/A'; + } + if ($data->{'platforms'}{'inactive'}){ + $rows->[$j]{main::key($num++,0,3,'inactive')} = join(',',@{$data->{'platforms'}{'inactive'}}); + } + } eval $end if $b_log; } +# args: 0: $rows; 1: data ref; 2: \$num; 3: $j; 4: indent; 5: $b_plat_v +sub egl_advanced_output { + my ($rows,$ref,$num,$j,$ind,$version) = @_; + my $value; + # version is set to 0 for math + if ($version && (!$ref->{'version'} || $version != $ref->{'version'})){ + $value = ($ref->{'version'}) ? $ref->{'version'} : 'N/A'; + $rows->[$j]{main::key($$num++,0,$ind,'egl')} = $value; + undef $value; + } + if ($ref->{'driver'}){ + $value = $ref->{'driver'}; + } + else { + if ($ref->{'vendor'} && $ref->{'vendor'} ne 'mesa'){ + $value = $ref->{'vendor'}; + } + $value ||= 'N/A'; + } + $rows->[$j]{main::key($$num++,0,$ind,'drv')} = $value; +} + sub opengl_output { eval $start if $b_log; - my ($program,$rows,$num) = @_; - # NOTE: glxinfo -B is not always available, unfortunately - my $glxinfo = main::grabber("$program $display_opt 2>/dev/null",'','','ref'); - # my $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt"; - # my @glxinfo = main::reader($file); - if (!@$glxinfo){ + my ($rows,$gl) = @_; + # egl will have set $glx if present + if (!$gl->{'glx'}){ + my $api = 'OpenGL'; my $type; - if ($b_root){ - $type = 'gl-display-root'; + if ($b_display){ + $type = ($b_root) ? 'glx-display-root': 'glx-null'; } else { - $type = 'gl-null'; + $type = ($b_root) ? 'glx-console-root' : 'glx-console-try'; } - push(@$rows, { - main::key($$num++,1,1,'API') => 'OpenGL', - main::key($$num++,0,2,'Message') => main::message($type) - }); - return; + no_data_output($api,$type,$rows); + return 0; } - # print join("\n", @$glxinfo),"\n"; - my $compat_version = ''; - my ($b_compat,$b_nogl,@core_profile_version,@direct_render,@renderer, - @opengl_version,@working); - foreach (@$glxinfo){ - next if /^\s/; - if (/^opengl renderer/i){ - @working = split(/:\s*/, $_, 2); - if ($working[1]){ - $working[1] = main::clean($working[1]); - } - # note: seen cases where gl drivers are missing, with empty field value. - else { - $b_nogl = 1; - $working[1] = main::message('gl-value-empty'); - } - push(@renderer, $working[1]); - } - # dropping all conditions from this test to just show full mesa information - # there is a user case where not f and mesa apply, atom mobo - # /opengl version/ && ( f || $2 !~ /mesa/){ - elsif (/^opengl version/i){ - @working = split(/:\s*/, $_, 2); - if ($working[1]){ - # fglrx started appearing with this extra string, does not appear - # to communicate anything of value - $working[1] =~ s/(Compatibility Profile Context|\(Compatibility Profile\))//; - $working[1] =~ s/\s\s/ /g; - $working[1] =~ s/^\s+|\s+$//; - push(@opengl_version, $working[1]); - # note: this is going to be off if ever multi opengl versions appear, - # never seen one - @working = split(/\s+/, $working[1]); - $compat_version = $working[0]; - } - elsif (!$b_nogl){ - push(@opengl_version, main::message('gl-value-empty')); - } - } - elsif (/^opengl core profile version/i){ - @working = split(/:\s*/, $_, 2); - # note: no need to apply empty message here since we don't have the data - # anyway - if ($working[1]){ - # fglrx started appearing with this extra string, does not appear - # to communicate anything of value - $working[1] =~ s/(Compatibility Profile Context|\((Compatibility|Core) Profile\))//; - $working[1] =~ s/\s\s/ /g; - $working[1] =~ s/^\s+|\s+$//; - push(@core_profile_version, $working[1]); - } - } - elsif (/direct rendering/){ - @working = split(/:\s*/, $_, 2); - push(@direct_render, $working[1]); - } - # if -B was always available, we could skip this, but it is not - elsif (/GLX Visuals/){ - last; - } - } - my ($direct_render,$renderer,$version) = ('N/A','N/A','N/A'); - $direct_render = join(', ', @direct_render) if @direct_render; - # non free drivers once filtered and cleaned show the same for core and compat - # but this stopped for some reason at 4.5/4.6 nvidia - if (@core_profile_version && @opengl_version && - join('', @core_profile_version) ne join('', @opengl_version) && - !(grep {/nvidia/i} @opengl_version)){ - @opengl_version = @core_profile_version; - $b_compat = 1; - } - $version = join(', ', @opengl_version) if @opengl_version; - $renderer = join(', ', @renderer) if @renderer; - my $j = scalar @$rows; + my ($j,$num) = (scalar @$rows,0); + my $value; + # print join("\n", %$gl),"\n"; + my $glx = $gl->{'glx'}; + $glx->{'opengl'}{'version'} ||= 'N/A'; push(@$rows, { - main::key($$num++,1,1,'API') => 'OpenGL', - main::key($$num++,0,2,'v') => ($version) ? $version : 'N/A', - main::key($$num++,1,2,'renderer') => ($renderer) ? $renderer : 'N/A', + main::key($num++,1,1,'API') => 'OpenGL', + main::key($num++,0,2,'v') => $glx->{'opengl'}{'version'}, }); - if ($b_compat && $extra > 1 && $compat_version){ - $rows->[$j]{main::key($$num++,0,2,'compat-v')} = $compat_version; + if ($glx->{'opengl'}{'compatibility'}{'version'}){ + $rows->[$j]{main::key($num++,0,2,'compat-v')} = $glx->{'opengl'}{'compatibility'}{'version'}; + } + if ($glx->{'opengl'}{'vendor'}){ + $rows->[$j]{main::key($num++,1,2,'vendor')} = $glx->{'opengl'}{'vendor'}; + $glx->{'opengl'}{'driver'}{'version'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,3,'v')} = $glx->{'opengl'}{'driver'}{'version'}; + } + if ($extra > 0 && $glx->{'glx-version'}){ + $rows->[$j]{main::key($num++,0,2,'glx-v')} = $glx->{'glx-version'}; + } + if ($extra > 1 && $glx->{'es'}{'version'}){ + $rows->[$j]{main::key($num++,0,2,'es-v')} = $glx->{'es'}{'version'};; + } + if ($glx->{'note'}){ + $rows->[$j]{main::key($num++,0,2,'note')} = $glx->{'note'}; + } + if ($extra > 0 && (!$glx->{'note'} || $glx->{'direct-render'})){ + $glx->{'direct-render'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'direct-render')} = $glx->{'direct-render'}; + } + if (!$glx->{'note'} || $glx->{'opengl'}{'renderer'}){ + $glx->{'opengl'}{'renderer'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'renderer')} = $glx->{'opengl'}{'renderer'}; + } + if ($extra > 1 && $glx->{'info'}){ + if ($glx->{'info'}{'vendor-id'} && $glx->{'info'}{'device-id'}){ + $value = $glx->{'info'}{'vendor-id'} . ':' . $glx->{'info'}{'device-id'}; + $rows->[$j]{main::key($num++,0,2,'device-ID')} = $value; + } + if ($b_admin && $glx->{'info'}{'device-memory'}){ + $rows->[$j]{main::key($num++,1,2,'memory')} = $glx->{'info'}{'device-memory'}; + if ($glx->{'info'}{'unified-memory'}){ + $rows->[$j]{main::key($num++,0,3,'unified')} = $glx->{'info'}{'unified-memory'}; + } + } + # display id depends on xdpyinfo in Display line, which may not be present, + if (!$graphics{'display-id'} && $glx->{'display-id'} && $extra > 1){ + $rows->[$j]{main::key($num++,0,2,'display-ID')} = $glx->{'display-id'}; + } + } + eval $end if $b_log; +} + +sub vulkan_output { + eval $start if $b_log; + my ($program,$rows) = @_; + my $vulkan = {}; + vulkan_data($program,$vulkan); + if (!%$vulkan){ + my $api = 'Vulkan'; + my $type = 'vulkan-null'; + no_data_output($api,$type,$rows); + return 0; + } + my $num = 0; + my $j = scalar @$rows; + my ($value); + my $data = $vulkan->{'data'}; + my $devices = $vulkan->{'devices'}; + $data->{'version'} ||= 'N/A'; + push(@$rows,{ + main::key($num++,1,1,'API') => 'Vulkan', + main::key($num++,0,2,'v') => $data->{'version'}, + }); + # this will be expanded with -a to a full device report + if ($extra < 2){ + $value = ($data->{'drivers'}) ? join(',',@{$data->{'drivers'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,2,'drivers')} = $value; + } + if ($extra > 2){ + $data->{'layers'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'layers')} = $data->{'layers'}; + } + if (!$b_admin){ + $value = ($data->{'surfaces'}) ? join(',',@{$data->{'surfaces'}}) : 'N/A'; + $rows->[$j]{main::key($num++,0,2,'surfaces')} = $value; } if ($extra > 0){ - $rows->[$j]{main::key($$num++,0,2,'direct-render')} = $direct_render; + if (!$devices){ + $rows->[$j]{main::key($num++,0,2,'devices')} = 'N/A'; + } + else { + if ($extra < 2){ + $value = scalar keys %{$devices}; + $rows->[$j]{main::key($num++,0,2,'devices')} = $value; + } + else { + foreach my $id (sort keys %$devices){ + $rows->[$j]{main::key($num++,1,2,'device')} = $id; + $devices->{$id}{'device-type'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,3,'type')} = $devices->{$id}{'device-type'}; + if ((($extra == 3 && !$b_admin) || + ($extra > 2 && !$devices->{$id}{'device-name'})) && + $devices->{$id}{'hw'} && $devices->{$id}{'hw'} ne 'nvidia'){ + $rows->[$j]{main::key($num++,0,3,'hw')} = $devices->{$id}{'hw'}; + } + if ($b_admin){ + $value = ($devices->{$id}{'device-name'}) ? + $devices->{$id}{'device-name'}: 'N/A'; + $rows->[$j]{main::key($num++,0,3,'name')} = $value; + } + if ($extra > 1){ + if ($devices->{$id}{'driver-name'}){ + $value = $devices->{$id}{'driver-name'}; + if ($devices->{$id}{'mesa'} && $value ne 'mesa'){ + $value = 'mesa ' . $value; + } + $rows->[$j]{main::key($num++,1,3,'driver')} = $value; + if ($b_admin && $devices->{$id}{'driver-info'}){ + $rows->[$j]{main::key($num++,0,4,'v')} = $devices->{$id}{'driver-info'}; + } + } + else { + $rows->[$j]{main::key($num++,0,3,'driver')} = 'N/A'; + } + $value = ($devices->{$id}{'device-id'} && $devices->{$id}{'vendor-id'}) ? + $devices->{$id}{'vendor-id'} . ':' . $devices->{$id}{'device-id'} : 'N/A'; + $rows->[$j]{main::key($num++,0,3,'device-ID')} = $value; + if ($b_admin){ + $value = ($devices->{$id}{'surfaces'}) ? + join(',',@{$devices->{$id}{'surfaces'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,3,'surfaces')} = $value; + } + } + } + } + } } eval $end if $b_log; } sub xvesa_output { eval $start if $b_log; - my ($rows,$num) = @_; + my ($rows) = @_; my ($controller,$dac,$interface,$ram,$source,$version); # note: goes to stderr, not stdout my @data = main::grabber($graphics{'xvesa'} . ' -listmodes 2>&1'); my $j = scalar @$rows; + my $num = 0; # gop replaced uga, both for uefi # WARNING! Never seen a GOP type UEFI, needs more data if ($data[0] && $data[0] =~ /^(VBE|GOP|UGA)\s+version\s+(\S+)\s\(([^)]+)\)/i){ @@ -15820,24 +16075,706 @@ sub xvesa_output { $ram = main::get_size($ram,'string'); } if (!$interface){ - $rows->[$j]{main::key($$num++,1,1,'API')} = 'VBE/GOP'; - $rows->[$j]{main::key($$num++,0,2,'Message')} = main::message('gfx-api-xvesa'); + $rows->[$j]{main::key($num++,1,1,'API')} = 'VBE/GOP'; + $rows->[$j]{main::key($num++,0,2,'Message')} = main::message('xvesa-null'); } else { - $rows->[$j]{main::key($$num++,1,1,'API')} = $interface; - $rows->[$j]{main::key($$num++,0,2,'v')} = ($version) ? $version : 'N/A'; - $rows->[$j]{main::key($$num++,0,2,'source')} = ($source) ? $source : 'N/A'; + $rows->[$j]{main::key($num++,1,1,'API')} = $interface; + $rows->[$j]{main::key($num++,0,2,'v')} = ($version) ? $version : 'N/A'; + $rows->[$j]{main::key($num++,0,2,'source')} = ($source) ? $source : 'N/A'; if ($dac){ - $rows->[$j]{main::key($$num++,0,2,'dac')} = $dac; - $rows->[$j]{main::key($$num++,0,2,'controller')} = $controller; + $rows->[$j]{main::key($num++,0,2,'dac')} = $dac; + $rows->[$j]{main::key($num++,0,2,'controller')} = $controller; } if ($ram){ - $rows->[$j]{main::key($$num++,0,2,'ram')} = $ram; + $rows->[$j]{main::key($num++,0,2,'ram')} = $ram; } } eval $end if $b_log; } +# API Data # +sub gl_data { + eval $start if $b_log; + my ($source,$program,$rows,$gl) = @_; + my ($b_opengl,$msg); + my ($gl_data,$results) = ([],[]); + # only check these if no eglinfo or eglinfo had no opengl data + $b_opengl = 1 if ($source eq 'egl' || !$gl->{'glx'}); + # NOTE: glxinfo -B is not always available, unfortunately + if ($dbg[56] || $b_log){ + $msg = "${line1}GL Source: $source\n${line3}"; + print $msg if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($source eq 'glx'){ + if (!$fake{'glx'}){ + $gl_data = main::grabber("$program $display_opt 2>/dev/null",'','','ref'); + } + else { + my $file; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-2012-nvidia-glx1.4.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxiinfo-t420-intel-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-mali-allwinner-lima-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-partial-intel-5500-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-vbox-debian-etch-1.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-x11-neomagic-lenny-1.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-nvidia-gl4.6-chr.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-intel-atom-dell_studio-bm.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-asus_1025c-atom-bm.txt"; + $gl_data= main::reader($file,'','ref'); + } + } + else { + if (!$fake{'egl'}){ + $gl_data = main::grabber("$program 2>/dev/null",'','','ref'); + } + else { + my $file; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-x11-3.txt"; + # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-c30.txt"; + # $file = "$fake_data_dir/grapOhics/egl-es/eglinfo-2022-x11-nvidia-egl1.5.txt"; + # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-nvidia-radu.txt"; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-intel-atom-dell_studio-bm.txt"; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-asus_1025c-atom-bm.txt"; + $gl_data = main::reader($file,'','ref'); + } + } + # print join("\n", @$gl_data),"\n"; + if (!$gl_data || !@$gl_data){ + if ($dbg[56] || $b_log){ + $msg = "No data found for GL Source: $source" if $dbg[56]; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + return 0; + } + # some error cases have only a few top value but not empty + elsif ($source eq 'glx' && scalar @$gl_data > 5){ + $gl->{'glx'}{'source'} = $source; + } + set_mesa_drivers() if $source eq 'egl' && !%mesa_drivers; + my ($b_device,$b_platform,$b_mem_info,$b_rend_info,$device,$platform, + $value,$value2,@working); + foreach my $line (@$gl_data){ + next if (!$b_rend_info && !$b_mem_info) && $line =~ /^(\s|0x)/; + if (($b_rend_info || $b_mem_info) && $line =~ /^\S/){ + ($b_mem_info,$b_rend_info) = (); + } + @working = split(/\s*:\s*/,$line,2); + next if !@working; + if ($dbg[56] || $b_log){ + $msg = $line; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($source eq 'egl'){ + # eglinfo: eglInitialize failed + # This is first line after platform fail for devices, but for Device + # it would be the second or later line. The Device platform can fail, or + # specific device can fail + if ($b_platform){ + $value = ($line =~ /Initialize failed/) ? 'inactive': 'active'; + push(@{$gl->{'egl'}{'data'}{'platforms'}{$value}},$platform); + $gl->{'egl'}{'platforms'}{$platform}{'status'} = $value; + $b_platform = 0; + } + # note: can be sub item: Platform Device platform:; Platform Device: + elsif ($working[0] =~ /^(\S+) platform/i){ + $platform = lc($1); + undef $device; + $b_platform = 1; + } + if ($platform && defined $device && $working[0] eq 'eglinfo'){ + push(@{$gl->{'egl'}{'data'}{'platforms'}{'inactive'}},"$platform-$device"); + undef $device; + } + if ($platform && $platform eq 'device' && $working[0] =~ /^Device #(\d+)/){ + $device = $1; + } + if ($working[0] eq 'EGL API version'){ + if (!defined $platform){ + $gl->{'egl'}{'data'}{'api-version'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'api-version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'api-version'} = $working[1]; + } + } + elsif ($working[0] eq 'EGL version string'){ + if (!defined $platform){ + $gl->{'egl'}{'data'}{'version'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'version'} = $working[1]; + } + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'versions'}{$working[1]}},$value); + if (!$gl->{'egl'}{'data'}{'version'} || + $working[1] > $gl->{'egl'}{'data'}{'version'}){ + $gl->{'egl'}{'data'}{'version'} = $working[1]; + } + } + elsif ($working[0] eq 'EGL vendor string'){ + $working[1] = lc($working[1]); + $working[1] =~ s/^(\S+)(\s.+|$)/$1/; + if (!defined $platform){ + $gl->{'egl'}{'data'}{'vendor'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'vendor'} = $working[1]; + if ($working[1] eq 'nvidia'){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1]; + } + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'vendor'} = $working[1]; + if ($working[1] eq 'nvidia'){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1]; + } + } + push(@{$gl->{'egl'}{'data'}{'vendors'}},$working[1]); + if ($working[1] eq 'nvidia'){ + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value); + $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $working[1]; + } + } + elsif ($working[0] eq 'EGL driver name'){ + if (!defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1]; + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'hw'} = $mesa_drivers{$working[1]}; + } + } + else { + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1]; + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'hw'} = $mesa_drivers{$working[1]}; + } + } + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value); + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $mesa_drivers{$working[1]}; + } + } + if ($working[0] eq 'EGL client APIs'){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])]; + } + } + } + # glx specific values, only found in glxinfo + else { + if (lc($working[0]) eq 'direct rendering'){ + $working[1] = lc($working[1]); + if (!$gl->{'glx'}{'direct-renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'direct-renders'}})){ + push(@{$gl->{'glx'}{'direct-renders'}}, $working[1]); + } + } + # name of display: does not always list the screen number + elsif (lc($working[0]) eq 'display'){ + if ($working[1] =~ /^(:\d+)\s+screen:\s+(\d+)/){ + $gl->{'glx'}{'display-id'} = $1 . '.' . $2; + } + } + elsif (lc($working[0]) eq 'glx version'){ + if (!$gl->{'glx'}{'glx-version'}){ + $gl->{'glx'}{'glx-version'} = $working[1]; + } + } + elsif (!$b_rend_info && $working[0] =~ /^Extended renderer info/i){ + $b_rend_info = 1; + } + # only check Memory info if no prior device memory found + elsif (!$b_mem_info && $working[0] =~ /^Memory info/i){ + $b_mem_info = (!$gl->{'glx'}{'info'} || !$gl->{'glx'}{'info'}{'device-memory'}) ? 1 : 0; + } + elsif ($b_rend_info){ + if ($line =~ /^\s+Vendor:\s+.*?\(0x([\da-f]+)\)$/){ + $gl->{'glx'}{'info'}{'vendor-id'} = sprintf("%04s",$1); + } + elsif ($line =~ /^\s+Device:\s+.*?\(0x([\da-f]+)\)$/){ + $gl->{'glx'}{'info'}{'device-id'} = sprintf("%04s",$1); + } + elsif ($line =~ /^\s+Video memory:\s+(\d+\s?[MG]B)$/){ + my $size = main::translate_size($1); + $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string'); + } + elsif ($line =~ /^\s+Unified memory:\s+(\S+)$/){ + $gl->{'glx'}{'info'}{'unified-memory'} = lc($1); + } + } + elsif ($b_mem_info){ + # fallback, nvidia does not seem to have Extended renderer info + if ($line =~ /^\s+Dedicated video memory:\s+(\d+\s?[MG]B)$/){ + my $size = main::translate_size($1); + $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string'); + $b_mem_info = 0; + } + # we're in the wrong memory block! + elsif ($line =~ /^\s+(VBO|Texture)/){ + $b_mem_info = 0; + } + } + elsif (lc($working[0]) eq 'opengl vendor string'){ + if ($working[1] =~ /^([^\s]+)(\s+\S+)?/){ + my $vendor = lc($1); + $vendor =~ s/(^mesa\/|[\.,]$)//; # Seen Mesa/X.org + if (!$gl->{'glx'}{'opengl'}{'vendor'}){ + $gl->{'glx'}{'opengl'}{'vendor'} = $vendor; + } + } + } + elsif (lc($working[0]) eq 'opengl renderer string'){ + if ($working[1]){ + $working[1] = main::clean($working[1]); + } + # note: seen cases where gl drivers are missing, with empty field value. + else { + $gl->{'glx'}{'no-gl'} = 1; + $working[1] = main::message('glx-value-empty'); + } + if (!$gl->{'glx'}{'opengl'}{'renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{'renderers'}})){ + push(@{$gl->{'glx'}{'opengl'}{'renderers'}}, $working[1]) ; + } + } + # Dropping all conditions from this test to just show full mesa information + # there is a user case where not f and mesa apply, atom mobo + # This can be the compatibility version, or just the version the hardware + # supports. Core version will override always if present. + elsif (lc($working[0]) eq 'opengl version string'){ + if ($working[1]){ + # first grab the actual gl version + # non free drivers like nvidia may only show their driver version info + if ($working[1] =~ /^(\S+)(\s|$)/){ + push(@{$gl->{'glx'}{'opengl'}{'versions'}}, $1); + } + # handle legacy format: 1.2 (1.5 Mesa 6.5.1) as well as more current: + # 4.5 (Compatibility Profile) Mesa 22.3.6 + # Note: legacy: fglrx starting adding compat strings but they don't + # change this result: + # 4.5 Compatibility Profile Context Mesa 15.3.6 + if ($working[1] =~ /(Mesa|NVIDIA)\s(\S+?)\)?$/i){ + if ($1 && $2 && !$gl->{'glx'}{'opengl'}{'driver'}){ + $gl->{'glx'}{'opengl'}{'driver'}{'vendor'} = lc($1); + $gl->{'glx'}{'opengl'}{'driver'}{'version'} = $2; + } + } + } + elsif (!$gl->{'glx'}{'no-gl'}){ + $gl->{'glx'}{'no-gl'} = 1; + push(@{$gl->{'glx'}{'opengl'}{'versions'}},main::message('glx-value-empty')); + } + } + # if -B was always available, we could skip this, but it is not + elsif ($line =~ /GLX Visuals/){ + last; + } + } + # eglinfo/glxinfo share these + if ($b_opengl){ + if ($working[0] =~ /^OpenGL (compatibility|core) profile version( string)?$/){ + $value = lc($1); + # note: no need to apply empty message here since we don't have the data + # anyway + if ($working[1]){ + # non free drivers like nvidia only show their driver version info + if ($working[1] =~ /^(\S+)(\s|$)/){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'versions'}}, $1); + } + # fglrx started appearing with this extra string, does not appear + # to communicate anything of value + if ($working[1] =~ /\s+(Mesa|NVIDIA)\s+(\S+)$/){ + if ($1 && $2 && !$gl->{'glx'}{'opengl'}{$value}{'vendor'}){ + $gl->{'glx'}{'opengl'}{$value}{'driver'}{'vendor'} = lc($1); + $gl->{'glx'}{'opengl'}{$value}{'driver'}{'version'} = $2; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = lc($1); + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'version'} = $2; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = lc($1); + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'version'} = $2; + } + } + } + } + } + elsif ($working[0] =~ /^OpenGL (compatibility|core) profile renderer?$/){ + $value = lc($1); + if ($working[1]){ + $working[1] = main::clean($working[1]); + } + # note: seen cases where gl drivers are missing, with empty field value. + else { + $gl->{'glx'}{'no-gl'} = 1; + $working[1] = main::message('glx-value-empty'); + } + if (!$gl->{'glx'}{'opengl'}{$value}{'renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'renderers'}})){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'renderers'}}, $working[1]) ; + } + if ($source eq 'egl' && $platform){ + if ($value eq 'core'){ + $value2 = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'renderers'}{$working[1]}},$value2); + } + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'renderer'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'renderer'} = $working[1]; + } + } + } + elsif ($working[0] =~ /^OpenGL (compatibility|core) profile vendor$/){ + $value = lc($1); + if (!$gl->{'glx'}{'opengl'}{$value}{'vendors'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'vendors'}})){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'vendors'}}, $working[1]) ; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = $working[1]; + } + + } + } + elsif (lc($working[0]) eq 'opengl es profile version string'){ + if ($working[1] && !$gl->{'glx'}{'es-version'}){ + # OpenGL ES 3.2 Mesa 23.0.3 + if ($working[1] =~ /^OpenGL ES (\S+) Mesa (\S+)/){ + $gl->{'glx'}{'es'}{'version'} = $1; + if ($2 && !$gl->{'glx'}{'es'}{'mesa-version'}){ + $gl->{'glx'}{'es'}{'mesa-version'} = $2; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'vendor'} = 'mesa'; + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'vendor'} = 'mesa'; + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'version'} = $working[1]; + } + } + } + } + } + } + } + main::log_data('dump',"$source \$results",$results) if $b_log; + if ($source eq 'egl'){ + print "GL Data: $source: ", Data::Dumper::Dumper $gl if $dbg[57]; + main::log_data('dump',"GL data: $source:",$gl) if $b_log; + } + else { + print "GL Data: $source: ", Data::Dumper::Dumper $gl->{'glx'} if $dbg[57]; + main::log_data('dump',"GLX data: $source:",$gl->{'glx'}) if $b_log; + } + eval $end if $b_log; +} + +sub process_glx_data { + eval $start if $b_log; + my ($glx,$b_glx) = @_; + my $value; + # Remember: if you test for a hash ref hash ref, you create the first hash ref! + if ($glx->{'direct-renders'}){ + $glx->{'direct-render'} = join(', ', @{$glx->{'direct-renders'}}); + } + if (!$glx->{'opengl'}{'renderers'} && $glx->{'opengl'}{'compatibility'} && + $glx->{'opengl'}{'compatibility'}{'renderers'}){ + $glx->{'opengl'}{'renderers'} = $glx->{'opengl'}{'compatibility'}{'renderers'}; + } + # This is tricky, GLX OpenGL version string can be compatibility version, + # but usually they are the same. Just in case, try this. Note these are + # x.y.z type numbering formats generally so use string compare + if ($glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'versions'}){ + $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'core'}{'versions'}})[-1]; + } + elsif ($glx->{'opengl'}{'versions'}){ + $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'versions'}})[-1]; + } + if ($glx->{'opengl'}{'version'} && + ($glx->{'opengl'}{'compatibility'} || $glx->{'opengl'}{'versions'})){ + # print "v: $glx->{'opengl'}{'version'}\n"; + # print Data::Dumper::Dumper $glx->{'opengl'}{'versions'}; + # print 'v1: ', (sort @{$glx->{'opengl'}{'versions'}})[0], "\n"; + # here we look for different versions, and determine most likely compat one + if ($glx->{'opengl'}{'compatibility'} && + $glx->{'opengl'}{'compatibility'}{'versions'} && + (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){ + $value = (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0]; + $glx->{'opengl'}{'compatibility'}{'version'} = $value; + } + elsif ($glx->{'opengl'}{'versions'} && + (sort @{$glx->{'opengl'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){ + $value = (sort @{$glx->{'opengl'}{'versions'}})[0]; + $glx->{'opengl'}{'compatibility'}{'version'} = $value; + } + } + if ($glx->{'opengl'}{'renderers'}){ + $glx->{'opengl'}{'renderer'} = join(', ', @{$glx->{'opengl'}{'renderers'}}); + } + # likely eglinfo or advanced glxinfo + if ($glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'core'} && + $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'} eq 'mesa' && + $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){ + $value = $glx->{'opengl'}{'vendor'} . ' '; + $value .= $glx->{'opengl'}{'core'}{'driver'}{'vendor'}; + $glx->{'opengl'}{'vendor'} = $value; + } + # this can be glxinfo only case, no eglinfo + elsif ($glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'driver'} && + $glx->{'opengl'}{'driver'}{'vendor'} && + $glx->{'opengl'}{'driver'}{'vendor'} eq 'mesa' && + $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'driver'}{'vendor'}){ + $value = $glx->{'opengl'}{'vendor'} . ' '; + $value .= $glx->{'opengl'}{'driver'}{'vendor'}; + $glx->{'opengl'}{'vendor'} = $value; + } + elsif (!$glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){ + $glx->{'opengl'}{'vendor'} = $glx->{'opengl'}{'core'}{'driver'}{'vendor'}; + } + if ((!$glx->{'opengl'}{'driver'} || + !$glx->{'opengl'}{'driver'}{'version'}) && + $glx->{'opengl'}{'core'} && + $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'version'}){ + $value = $glx->{'opengl'}{'core'}{'driver'}{'version'}; + $glx->{'opengl'}{'driver'}{'version'} = $value; + } + # only tripped when glx filled by eglinfo + if (!$glx->{'source'}){ + my $type; + if (!$b_glx){ + $type = 'glx-egl-missing'; + } + elsif ($b_display){ + $type = 'glx-egl'; + } + else { + $type = 'glx-egl-console'; + } + $glx->{'note'} = main::message($type); + } + print "GLX Data: ", Data::Dumper::Dumper $glx if $dbg[57]; + main::log_data('dump',"GLX data:",$glx) if $b_log; + eval $end if $b_log; +} + +sub vulkan_data { + eval $start if $b_log; + my ($program,$vulkan) = @_; + my ($data,$msg,@working); + my ($results) = ([]); + if ($dbg[56] || $b_log){ + $msg = "${line1}Vulkan Data\n${line3}"; + print $msg if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if (!$fake{'vulkan'}){ + $data = main::grabber("$program 2>/dev/null",'','','ref'); + } + else { + my $file; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-llvm-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-nvidia-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-amd-dz.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-mali-3.txt"; + $data = main::reader($file,'','ref'); + } + if (!$data){ + if ($dbg[56] || $b_log){ + $msg = "No Vulkan data found" if $dbg[56]; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + return 0; + } + set_mesa_drivers() if !%mesa_drivers; + my ($id,%active); + foreach my $line (@$data){ + next if $line =~ /^(\s*|-+|=+)$/; + @working = split(/\s*:\s*/,$line,2); + next if !@working; + if ($line =~ /^\S/){ + if ($active{'start'}){undef $active{'start'}} + if ($active{'layers'}){undef $active{'layers'}} + if ($active{'groups'}){undef $active{'groups'}} + if ($active{'limits'}){undef $active{'limits'}} + if ($active{'features'}){undef $active{'features'}} + if ($active{'extensions'}){undef $active{'extensions'}} + if ($active{'format'}){undef $active{'format'}} + if ($active{'driver'}){($active{'driver'},$id) = ()} + } + next if $active{'start'}; + next if $active{'groups'}; + next if $active{'limits'}; + next if $active{'features'}; + next if $active{'extensions'}; + next if $active{'format'}; + if ($dbg[56] || $b_log){ + $msg = $line; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($working[0] eq 'Vulkan Instance Version'){ + $vulkan->{'data'}{'version'} = $working[1]; + $active{'start'} = 1; + } + elsif ($working[0] eq 'Layers'){ + if ($working[1] =~ /count\s*=\s*(\d+)/){ + $vulkan->{'data'}{'layers'} = $1; + } + $active{'layers'} = 1; + } + # note: can't close this because Intel didn't use proper indentation + elsif ($working[0] eq 'Presentable Surfaces'){ + $active{'surfaces'} = 1; + } + elsif ($working[0] eq 'Device Groups'){ + $active{'groups'} = 1; + $active{'surfaces'} = 0; + } + elsif ($working[0] eq 'Device Properties and Extensions'){ + $active{'devices'} = 1; + $active{'surfaces'} = 0; + undef $id; + } + elsif ($working[0] eq 'VkPhysicalDeviceProperties'){ + $active{'props'} = 1; + } + elsif ($working[0] eq 'VkPhysicalDeviceDriverProperties'){ + $active{'driver'} = 1; + } + elsif ($working[0] =~ /^\S+Features/i){ + $active{'features'} = 1; + } + # seen as line starter string or inner VkPhysicalDeviceProperties + elsif ($working[0] =~ /^\s*\S+Limits/i){ + $active{'limits'} = 1; + } + elsif ($working[0] =~ /^FORMAT_/){ + $active{'format'} = 1; + } + elsif ($working[0] =~ /^(Device|Instance) Extensions/){ + $active{'extensions'} = 1; + } + if ($active{'surfaces'}){ + if ($working[0] eq 'GPU id'){ + if ($working[1] =~ /^(\d+)\s+\((.*?)\):?$/){ + $id = $1; + $vulkan->{'devices'}{$id}{'model'} = main::clean($2); + } + } + if (defined $id){ + # seen leading space, no leading space + if ($line =~ /^\s*Surface type/){ + $active{'surface-type'} = 1; + } + if ($active{'surface-type'} && $line =~ /\S+_(\S+)_surface$/){ + if (!$vulkan->{'devices'}{$id}{'surfaces'} || + !(grep {$_ eq $1} @{$vulkan->{'devices'}{$id}{'surfaces'}})){ + push(@{$vulkan->{'devices'}{$id}{'surfaces'}},$1); + } + if (!$vulkan->{'data'}{'surfaces'} || + !(grep {$_ eq $1} @{$vulkan->{'data'}{'surfaces'}})){ + push(@{$vulkan->{'data'}{'surfaces'}},$1); + } + } + if ($working[0] =~ /^\s*Formats/){ + undef $active{'surface-type'}; + } + } + } + if ($active{'devices'}){ + if ($working[0] =~ /^GPU(\d+)/){ + $id = $1; + } + elsif (defined $id){ + # apiVersion=4194528 (1.0.224); 1.3.246 (4206838); 79695971 (0x4c01063) + if ($line =~ /^\s+apiVersion\s*=\s*(\S+)(\s+\(([^)]+)\))?/i){ + my ($a,$b) = ($1,$3); + my $api = (!$b || $b =~ /^(0x)?\d+$/) ? $a : $b; + $vulkan->{'devices'}{$id}{'device-api-version'} = $api; + } + elsif ($line =~ /^\s+driverVersion\s*=\s*(\S+)/i){ + $vulkan->{'devices'}{$id}{'device-driver-version'} = $1; + } + elsif ($line =~ /^\s+vendorID\s*=\s*0x(\S+)/i){ + $vulkan->{'devices'}{$id}{'vendor-id'} = $1; + } + elsif ($line =~ /^\s+deviceID\s*=\s*0x(\S+)/i){ + $vulkan->{'devices'}{$id}{'device-id'} = $1; + } + # deviceType=DISCRETE_GPU; PHYSICAL_DEVICE_TYPE_DISCRETE_GPU + elsif ($line =~ /^\s+deviceType\s*=\s*(\S+?_TYPE_)?(\S+)$/i){ + $vulkan->{'devices'}{$id}{'device-type'} = lc($2); + $vulkan->{'devices'}{$id}{'device-type'} =~ s/_/-/g; + } + # deviceName=AMD Radeon RX 6700 XT (RADV NAVI22); AMD RADV HAWAII + # lvmpipe (LLVM 15.0.6, 256 bits); NVIDIA GeForce GTX 1650 Ti + elsif ($line =~ /^\s+deviceName\s*=\s*(\S+)(\s.*|$)/i){ + $vulkan->{'devices'}{$id}{'device-vendor'} = main::clean(lc($1)); + $vulkan->{'devices'}{$id}{'device-name'} = main::clean($1 . $2); + } + } + } + if ($active{'driver'}){ + if (defined $id){ + # driverName=llvmpipe; radv; + if ($line =~ /^\s+driverName\s*=\s*(\S+)(\s|$)/i){ + my $driver = lc($1); + if ($mesa_drivers{$driver}){ + $vulkan->{'devices'}{$id}{'hw'} = $mesa_drivers{$driver}; + } + $vulkan->{'devices'}{$id}{'driver-name'} = $driver; + if (!$vulkan->{'data'}{'drivers'} || + !(grep {$_ eq $driver} @{$vulkan->{'data'}{'drivers'}})){ + push(@{$vulkan->{'data'}{'drivers'}},$driver); + } + } + # driverInfo=Mesa 23.1.3 (LLVM 15.0.7); 525.89.02; Mesa 23.1.3 + elsif ($line =~ /^\s+driverInfo\s*=\s*((Mesa)\s)?(.*)/i){ + $vulkan->{'devices'}{$id}{'mesa'} = lc($2) if $2; + $vulkan->{'devices'}{$id}{'driver-info'} = $3; + } + } + } + } + main::log_data('dump','$results',$results) if $b_log; + print 'Vulkan Data: ', Data::Dumper::Dumper $vulkan if $dbg[57]; + main::log_data('dump','$vulkan',$vulkan) if $b_log; + eval $end if $b_log; +} + ## DISPLAY DATA WAYLAND ## sub display_data_wayland { eval $start if $b_log; @@ -15968,7 +16905,7 @@ sub wlinfo_data { $data = main::grabber("$program 2>/dev/null",'','strip','ref'); } else { - $file = "$fake_data_dir/wayland/weston-info-2-mon-1.txt"; + $file = "$fake_data_dir/graphics/wayland/weston-info-2-mon-1.txt"; $data = main::reader($file,'strip','ref'); } print 'wayland/weston-info raw: ', Data::Dumper::Dumper $data if $dbg[46]; @@ -16103,7 +17040,7 @@ sub swaymsg_data { } else { undef $monitor_ids; - $file = "$fake_data_dir/wayland/swaymsg-2-monitor-1.txt"; + $file = "$fake_data_dir/graphics/wayland/swaymsg-2-monitor-1.txt"; @data = main::reader($file,'strip'); } print 'swaymsg: ', Data::Dumper::Dumper \@data if $dbg[46]; @@ -16217,7 +17154,7 @@ sub wlrrandr_data { } else { undef $monitor_ids; - $file = "$fake_data_dir/wayland/wlr-randr-2-monitor-1.txt"; + $file = "$fake_data_dir/graphics/wayland/wlr-randr-2-monitor-1.txt"; $data = main::reader($file,'strip','ref'); } foreach (@$data){ @@ -16904,6 +17841,29 @@ sub display_drivers_x { # print 'source: ', Data::Dumper::Dumper $driver_data; return $driver_data; } +sub set_mesa_drivers { + %mesa_drivers = ( + 'anv' => 'intel', + 'crocus' => 'intel', + 'etnaviv' => 'vivante', + 'freedreno' => 'qualcomm', + 'i915' => 'intel', + 'i965' => 'intel', + 'iris' => 'intel', + 'lima' => 'mali', + 'nouveau' => 'nvidia', + 'panfrost' => 'mali/bifrost', + 'r200' => 'amd', + 'r300' => 'amd', + 'r600' => 'amd', + 'radeonsi' => 'amd', + 'radv' => 'amd', + 'svga3d' => 'vmware', + 'v3d' => 'broadcom', + 'v3dv' => 'broadcom', + 'vc4' => 'broadcom', + ); +} ## GPU DATA ## sub set_amd_data { @@ -17570,7 +18530,7 @@ sub set_nv_data { '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|2182|2184|' . - '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8', + '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8|28f8', 'code' => 'TUxxx', 'kernel' => '', 'legacy' => 0, @@ -17582,12 +18542,12 @@ sub set_nv_data { 'years' => '2018-22', }, {'arch' => 'Ampere', - 'ids' => '20b0|20b2|20b3|20b5|20b7|20f1|20f3|20f5|2203|2204|2206|2207|2208|' . - '220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|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|25a0|25a2|25a5|25ab|25ac|25b6|25b8|25b9|' . - '25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838', + 'ids' => '20b0|20b2|20b3|20b5|20b7|20bd|20f1|20f3|20f5|20f6|2203|2204|2206|' . + '2207|2208|220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|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|25a0|25a2|25a5|25ab|25ac|25b6|' . + '25b8|25b9|25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838', 'code' => 'GAxxx', 'kernel' => '', 'legacy' => 0, @@ -17596,10 +18556,10 @@ sub set_nv_data { 'series' => '535.xx+', 'status' => $status_current, 'xorg' => '', - 'years' => '2020-22', + 'years' => '2020-23', }, {'arch' => 'Hopper', - 'ids' => '2330|2331|2339', + 'ids' => '2321|2330|2331|2339', 'code' => 'GH1xx', 'kernel' => '', 'legacy' => 0, @@ -17611,8 +18571,8 @@ sub set_nv_data { 'years' => '2022+', }, {'arch' => 'Lovelace', - 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2820|' . - '2860|28a0|28a1|28e0|28e1', + 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2805|' . + '2820|2860|2882|28a0|28a1|28e0|28e1', 'code' => 'AD1xx', 'kernel' => '', 'legacy' => 0, @@ -18406,7 +19366,7 @@ sub lvm_data { PartitionData::set() if !$loaded{'partition-data'}; main::set_mapper() if !$loaded{'mapper'}; if ($fake{'logical'}){ - # my $file = "$fake_data_dir/lvm/lvs-test-1.txt"; + # my $file = "$fake_data_dir/raid-logical/lvm/lvs-test-1.txt"; # @data = main::reader($file,'strip'); } else { @@ -18783,8 +19743,8 @@ sub machine_data_fruid { } else { # my $file; - # $file = "$fake_data_dir/fruid/fruid-e904-1_full.txt"; - # $file = "$fake_data_dir/fruid/fruid-e804-1_full.txt"; + # $file = "$fake_data_dir/machine/fruid/fruid-e904-1_full.txt"; + # $file = "$fake_data_dir/machine/fruid/fruid-e804-1_full.txt"; # @fruid = main::reader($file,'strip'); } # print Data::Dumper::Dumper \@fruid; @@ -20400,9 +21360,9 @@ sub set_partitions { } else { my $file; - # $file = "$fake_data_dir/df/df-kTP-cygwin-1.txt"; - $file = "$fake_data_dir/df/df-kT-wrapped-1.txt"; - @partitions_working = main::reader($file); + # $file = "$fake_data_dir/block-devices/df/df-kTP-cygwin-1.txt"; + # $file = "$fake_data_dir/block-devices/df/df-kT-wrapped-1.txt"; + # @partitions_working = main::reader($file); } # print Data::Dumper::Dumper \@partitions_working; # Determine positions @@ -20569,7 +21529,7 @@ sub set_partitions { $fs = ($b_fs) ? $row[1]: get_mounts_fs($row[0],\@mount); } # assuming that all null/nullfs are parts of a logical fs - $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|wekafs|zfs)/; + $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|zfs)/; $id = join(' ', @row[$cols .. $#row]); $size = $row[$cols - $back_size]; if ($b_admin && -e "/sys/block/"){ @@ -20939,7 +21899,7 @@ sub set_filters { # hdfs, httpdirfs, hubicfuse, ipfs, juice, k(osmos)?fs, .*lafs, lizardfs, # lustre, magma, mapr, moosefs, nfs[34], objective, ocfs\d{0,2}, onefs, # orangefs, panfs, pnfs, pvfs\d{0,2}, rclone, restic, rozofs, s3fs, scality, - # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, xtreemfs + # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, wekafs, xtreemfs # Stackable/Union: aufs, e?cryptfs, encfs, erofs, gocryptfs, ifs, lofs, # mergerfs, mhddfs, overla(id|y)(fs)?, squashfs, unionfs; # ISO/Archive: archive(mount)?, atlas, avfs. borg, erofs, fuse-archive, @@ -20960,7 +21920,8 @@ sub set_filters { g gdrive gfarm git gluster gmail gocrypt google-drive-ocaml gp gphoto gv gzip hd httpd hubic ip juice k(osmos)? .*la lizard lustre magma mapr moose .*mtp null p?n objective oc one orange pan .*ptp pv rclone restic rozo - s s3 scality sheepdog sp ssh smb v9 vd vm vram wim(mount)? xb xml xtreem%); + s s3 scality sheepdog sp ssh smb v9 vd vm vram weka wim(mount)? xb xml + xtreem%); # Various RAM based system FS my @partition = (@all,qw%cgroup.* cgm config debug dev devtmp efivar fdesc hugetlb kern linproc linsys lxc none proc pty run security shm swap sys @@ -21979,14 +22940,14 @@ sub md_data { my ($mdstat) = @_; my $j = 0; if ($fake{'raid-md'}){ - #$mdstat = "$fake_data_dir/raid/md-4-device-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-rebuild-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-mirror-fserver2-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-raid10-abucodonosor.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-raid10-ant.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-weird-syntax.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-active-syntax.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-active-spare-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-4-device-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-rebuild-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-mirror-fserver2-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-abucodonosor.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-ant.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-weird-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-spare-syntax.txt"; } my @working = main::reader($mdstat,'strip'); # print Data::Dumper::Dumper \@working; @@ -22271,11 +23232,11 @@ sub zfs_data { my ($i,$j,$k) = (0,0,0); if ($fake{'raid-zfs'}){ # my $file; - # $file = "$fake_data_dir/raid/zpool-list-1-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-list-2-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-tank-1.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-gojev-1.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-w-spares-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-1-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-2-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-tank-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-gojev-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-w-spares-1.txt"; #@working = main::reader($file);$zpool = ''; } else { @@ -22484,9 +23445,9 @@ sub zfs_status { $k = 0; if ($fake{'raid-zfs'}){ my $file; - # $file = "$fake_data_dir/raid/zpool-status-1-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-status-2-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-status-tank-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-1-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-2-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-tank-1.txt"; #@pool_status = main::reader($file,'strip'); } else { @@ -23485,6 +24446,7 @@ sub speed_mapper { return ($speeds{$type}) ? $speeds{$type} . ' MT/s' : $type; } + ## START RAM VENDOR ## sub set_ram_vendors { $vendors = [ @@ -23505,6 +24467,7 @@ sub set_ram_vendors { ['^(G[A-Z]|Geil)','Geil','Geil',''], # Note: FA- but make loose FA ['^(F4|G[\s\.-]?Skill)','G[\s\.-]?Skill','G.Skill',''], + ['^(GJN)','GJN','GJN',''], ['^(HP)','','HP',''], # no IDs found ['^(HX|HyperX)','HyperX','HyperX',''], # Qimonda spun out of Infineon, same ids @@ -23521,9 +24484,11 @@ sub set_ram_vendors { # Before patriot just in case ['^(MN\d|PNY)','PNY\s','PNY',''], ['^(P[A-Z]|Patriot)','Patriot','Patriot',''], + ['^RAMOS','^RAMOS','RAmos',''], ['^(K[1-6][ABLT]|K\d|M[\d]{3}[A-Z]|Samsung)','Samsung','Samsung',''], ['^(SP|Silicon[\s-]?Power)','Silicon[\s-]?Power','Silicon Power',''], ['^(STK|Simtek)','Simtek','Simtek',''], + ['^(Simmtronics|Gamex)','^Simmtronics','Simmtronics',''], ['^(HM[ACT]|SK[\s-]?Hynix)','SK[\s-]?Hynix','SK-Hynix',''], # TED TTZD TLRD TDZAD TF4D4 TPD4 TXKD4 seen: HMT but could by skh #['^(T(ED|D[PZ]|F\d|LZ|P[DR]T[CZ]|XK)|Team[\s-]?Group)','Team[\s-]?Group','TeamGroup',''], @@ -24922,19 +25887,19 @@ sub ipmi_data { my $sensors = {}; if ($fake{'ipmi'}){ ## ipmitool ## - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-freebsd-offsite-backup.txt"; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensors/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-freebsd-offsite-backup.txt"; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool'; # ($b_ipmitool,$i_key,$i_value,$i_unit) = (1,0,1,2); # ipmitool sensors ## ipmi-sensors ## - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors'; # ($b_ipmitool,$i_key,$i_value,$i_unit) = (0,1,3,4); # ipmi-sensors # @data = main::reader($file); } @@ -25318,20 +26283,20 @@ sub load_lm_sensors { my ($adapter,$holder,$type) = ('','',''); if ($fake{'sensors'}){ # my $file; - # $file = "$fake_data_dir/sensors/amdgpu-w-fan-speed-stretch-k10.txt"; - # $file = "$fake_data_dir/sensors/peci-tin-geggo.txt"; - # $file = "$fake_data_dir/sensors/sensors-w-other-biker.txt"; - # $file = "$fake_data_dir/sensors/sensors-asus-chassis-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-devnull-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-jammin1.txt"; - # $file = "$fake_data_dir/sensors/sensors-mx-incorrect-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-maximus-arch-1.txt"; - # $file = "$fake_data_dir/sensors/kernel-58-sensors-ant-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-zenpower-nvme-2.txt"; - # $file = "$fake_data_dir/sensors/sensors-pch-intel-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-ppc-sr71.txt"; - # $file = "$fake_data_dir/sensors/sensors-coretemp-acpitz-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-applesmc-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/amdgpu-w-fan-speed-stretch-k10.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/peci-tin-geggo.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-w-other-biker.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-asus-chassis-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-devnull-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-jammin1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-mx-incorrect-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-maximus-arch-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/kernel-58-sensors-ant-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-zenpower-nvme-2.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-pch-intel-1.txt"; + # $file = "$fake_data_dir/sensors/slm-sensors/ensors-ppc-sr71.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-coretemp-acpitz-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-applesmc-1.txt"; # @sensors_data = main::reader($file); } else { @@ -27761,14 +28726,14 @@ sub set_dboot_data { $file = $system_files{'dmesg-boot'}; } else { - # $file = "$fake_data_dir/dmesg-boot/bsd-disks-diabolus.txt"; - # $file = "$fake_data_dir/dmesg-boot/freebsd-disks-solestar.txt"; - # $file = "$fake_data_dir/dmesg-boot/freebsd-enceladus-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/bsd-disks-diabolus.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-disks-solestar.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-enceladus-1.txt"; ## matches: toshiba: openbsd-5.6-sysctl-2.txt - # $file = "$fake_data_dir/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt"; ## matches: compaq: openbsd-5.6-sysctl-1.txt" - # $file = "$fake_data_dir/dmesg-boot/openbsd-dmesg.boot-1.txt"; - $file = "$fake_data_dir/dmesg-boot/openbsd-6.8-battery-sensors-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-dmesg.boot-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-6.8-battery-sensors-1.txt"; } if ($file){ return if ! -r $file; @@ -28793,8 +29758,8 @@ sub lspci_n_data { $b_lspci_n = 1; my (@data); if ($fake{'lspci'}){ - # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-n.txt"; - # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-n.txt"; + # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-n.txt"; + # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-n.txt"; # @data = main::reader($file,'strip'); } else { @@ -29019,15 +29984,15 @@ sub pci_grabber { $pattern = q/^[0-9a-f:]+:/; # i only added perl 5.14, don't use } if ($fake{'lspci'} || $fake{'pciconf'} || $fake{'pcictl'} || $fake{'pcidump'}){ - # my $file = "$fake_data_dir/pciconf/pci-freebsd-8.2-2"; - # my $file = "$fake_data_dir/pcidump/pci-openbsd-6.1-vm.txt"; - # my $file = "$fake_data_dir/pcictl/pci-netbsd-9.1-vm.txt"; - # my $file = "$fake_data_dir/lspci/racermach-1-knnv.txt"; - # my $file = "$fake_data_dir/lspci/rk016013-knnv.txt"; - # my $file = "$fake_data_dir/lspci/kot--book-lspci-nnv.txt"; - # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-nnkv.txt"; - # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-nnv.txt"; - # my $file = "$fake_data_dir/lspci/gx78b-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/pciconf/pci-freebsd-8.2-2"; + # my $file = "$fake_data_dir/pci/pcidump/pci-openbsd-6.1-vm.txt"; + # my $file = "$fake_data_dir/pci/pcictl/pci-netbsd-9.1-vm.txt"; + # my $file = "$fake_data_dir/pci/lspci/racermach-1-knnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/rk016013-knnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/kot--book-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-nnkv.txt"; + # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/gx78b-lspci-nnv.txt"; # $data = main::reader($file,'strip','ref'); } else { @@ -29871,6 +30836,8 @@ sub get_bsd_os { } sub get_linux_distro { + # NOTE: increasingly no distro release files are present, so this logic is + # deprecated, but still works often. # order matters! my @derived = qw(antix-version aptosid-version bodhibuilder.conf kanotix-version knoppix-version pclinuxos-release mandrake-release manjaro-release mx-version @@ -29893,11 +30860,8 @@ sub get_linux_distro { $osr_good .= 'raspberry pi os|slint|zorin'; # Force use of pretty name because that's only location of derived distro name my $osr_pretty = 'zinc'; - my ($b_issue,$b_lsb,$b_osr_pretty,$b_skip_issue,$b_skip_osr); my ($issue,$lsb_release) = ('/etc/issue','/etc/lsb-release'); - $b_issue = 1 if -f $issue; - $b_lsb = 1 if -f $lsb_release; # Note: OpenSuse Tumbleweed 2018-05 has made /etc/issue created by sym link to /run/issue # and then made that resulting file 700 permissions, which is obviously a mistake $etc_issue = main::reader($issue,'strip',0) if -r $issue; @@ -29909,9 +30873,17 @@ sub get_linux_distro { # Wait to handle since crunchbang file is one of the few in the world that # uses this method @distro_files = main::globber('/etc/*[-_]{[rR]elease,[vV]ersion,issue}*'); - push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf'; + push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf'; # legacy @osr = main::reader($os_release) if -r $os_release; - if ($etc_issue){ + if (-f '/etc/bodhi/info'){ + $lsb_release = '/etc/bodhi/info'; + $distro_file = $lsb_release; + $b_skip_issue = 1; + push(@distro_files, $lsb_release); + } + $b_issue = 1 if -f $issue; + $b_lsb = 1 if -f $lsb_release; + if (!$b_skip_issue && $etc_issue){ $lc_issue = lc($etc_issue); if ($lc_issue =~ /(antergos|grml|linux lite|openmediavault)/){ $distro_id = $1; @@ -29993,7 +30965,8 @@ sub get_linux_distro { # be preferred, but this is a good backup. elsif ($distro_file && $b_lsb && ($distro_file =~ /\/etc\/($lsb_good_s)$/ || $distro_file eq $lsb_release)){ - $distro = get_lsb_release(); + print "df: $distro_file lf: $lsb_release\n"; + $distro = get_lsb_release($lsb_release); } elsif ($distro_file && $distro_file eq $os_release){ $distro = get_os_release($b_osr_pretty); @@ -30171,10 +31144,10 @@ sub system_base { $base_distro_arch .= '|talkingarch|theshell|ubos|velt|xero'; my $base_file_debian_version = 'sidux'; # detect debian steamos before arch steamos - my $base_osr_debian_version = '\belive|lmde|neptune|parrot|pureos|rescatux|'; - $base_osr_debian_version .= 'septor|sparky|steamos|tails'; + my $base_osr_debian_version = '\belive|lmde|neptune|nitrux|parrot|pureos|'; + $base_osr_debian_version .= 'rescatux|septor|sparky|steamos|tails'; # osr has base ids - my $base_default = 'antix-version|mx-version'; + my $base_default = 'antix-version|bodhi|mx-version'; # base only found in issue my $base_issue = 'bunsen'; # synthesize, no direct data available @@ -30270,11 +31243,21 @@ sub system_base { eval $end if $b_log; } +# Note: corner case when parsing the bodhi distro file +# args: 0: file name sub get_lsb_release { eval $start if $b_log; my ($lsb_file) = @_; $lsb_file ||= '/etc/lsb-release'; my ($distro_lsb,$id,$release,$codename,$description) = ('','','','',''); + my ($dist_id,$dist_release,$dist_code,$dist_desc) = ('DISTRIB_ID', + 'DISTRIB_RELEASE','DISTRIB_CODENAME','DISTRIB_DESCRIPTION'); + if ($lsb_file eq '/etc/bodhi/info'){ + $id = 'Bodhi Linux'; + # note: No ID field, hard code + ($dist_id,$dist_release,$dist_code,$dist_desc) = ('ID','RELEASE', + 'CODENAME','DESCRIPTION'); + } my @content = main::reader($lsb_file); main::log_data('dump','@content',\@content) if $b_log; @content = map {s/,|\*|\\||\"|[:\47]|^\s+|\s+$|n\/a//ig; $_} @content if @content; @@ -30282,7 +31265,7 @@ sub get_lsb_release { next if /^\s*$/; my @working = split(/\s*=\s*/, $_); next if !$working[0]; - if ($working[0] eq 'DISTRIB_ID' && $working[1]){ + if ($working[0] eq $dist_id && $working[1]){ if ($working[1] =~ /^Manjaro/i){ $id = 'Manjaro Linux'; } @@ -30294,15 +31277,15 @@ sub get_lsb_release { $id = $working[1]; } } - elsif ($working[0] eq 'DISTRIB_RELEASE' && $working[1]){ + elsif ($working[0] eq $dist_release && $working[1]){ $release = $working[1]; } - elsif ($working[0] eq 'DISTRIB_CODENAME' && $working[1]){ + elsif ($working[0] eq $dist_code && $working[1]){ $codename = $working[1]; } # sometimes some distros cannot do their lsb-release files correctly, # so here is one last chance to get it right. - elsif ($working[0] eq 'DISTRIB_DESCRIPTION' && $working[1]){ + elsif ($working[0] eq $dist_desc && $working[1]){ $description = $working[1]; } } @@ -30627,7 +31610,9 @@ sub generate_data { } } -# return all device modules not including driver +# args: 0: driver; 1: modules, comma separated, return only modules +# which do not equal the driver string itself. Sometimes the module +# name is different from the driver name, even though it's the same thing. sub get_driver_modules { eval $start if $b_log; my ($driver,$modules) = @_; @@ -30643,9 +31628,7 @@ sub get_driver_modules { return $modules; } -# args: 0: driver; 1: modules, comma separated, return only modules -# which do not equal the driver string itself. Sometimes the module -# name is different from the driver name, even though it's the same thing. +# Return all detected gcc versions sub get_gcc_data { eval $start if $b_log; my ($gcc,@data,@temp); @@ -30985,9 +31968,9 @@ sub set_ip_addr { if ($fake{'ip-if'}){ # my $file = "$fake_data_dir/if/scope-ipaddr-1.txt"; # my $file = "$fake_data_dir/network/ip-addr-blue-advance.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-address-1.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-addr-2.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-addr-3.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-address-1.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-2.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-3.txt"; # @data = main::reader($file,'strip') or die $!; } my ($b_skip,$broadcast,$if,$if_id,$ip,@ips,$scope,$type,@temp,@temp2); @@ -31038,7 +32021,7 @@ sub set_ifconfig { # whitespace matters!! Don't use strip my @data = main::grabber($alerts{'ifconfig'}->{'path'} . " 2>/dev/null",'\n',''); if ($fake{'ip-if'}){ - # my $file = "$fake_data_dir/network/ppoe-ifconfig-all-1.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ifconfig-all-1.txt"; # my $file = "$fake_data_dir/network/vps-ifconfig-1.txt"; # @data = main::reader($file) or die $!; } @@ -31952,6 +32935,7 @@ sub gpu_ram_arm { } } +# args: 0: module to get version of sub get_module_version { eval $start if $b_log; my ($module) = @_; @@ -32974,7 +33958,7 @@ sub proc_data { eval $start if $b_log; my $file = $_[0]; if ($fake{'partitions'}){ - # $file = "$fake_data_dir/proc-partitions-1.txt"; + # $file = "$fake_data_dir/block-devices/proc-partitions/proc-partitions-1.txt"; } my @parts = main::reader($file,'strip'); # print Data::Dumper::Dumper \@parts; @@ -33772,14 +34756,14 @@ sub set_sysctl_data { } else { my $file; - # $file = "$fake_data_dir/sysctl/obsd_6.1_sysctl_soekris6501_root.txt"; - # $file = "$fake_data_dir/sysctl/obsd_6.1sysctl_lenovot500_user.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1_sysctl_soekris6501_root.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1sysctl_lenovot500_user.txt"; ## matches: compaq: openbsd-dmesg.boot-1.txt - # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-1.txt"; + # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-1.txt"; ## matches: toshiba: openbsd-5.6-dmesg.boot-1.txt - # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-2.txt"; - $file = "$fake_data_dir/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt"; - @temp = reader($file); + # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-2.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt"; + # @temp = reader($file); } foreach (@temp){ $_ =~ s/\s*=\s*|:\s+/:/; @@ -34356,13 +35340,13 @@ sub usb_grabber { else { my $file; if ($fake{'usbdevs'}){ - $file = "$fake_data_dir/lsusb/bsd-usbdevs-v-1.txt"; + $file = "$fake_data_dir/usb/usbdevs/bsd-usbdevs-v-1.txt"; } elsif ($fake{'usbconfig'}){ - $file = "$fake_data_dir/lsusb/bsd-usbconfig-list-v-1.txt"; + $file = "$fake_data_dir/usb/usbconfig/bsd-usbconfig-list-v-1.txt"; } else { - $file = "$fake_data_dir/lsusb/mdmarmer-lsusb.txt"; + $file = "$fake_data_dir/usb/lsusb/mdmarmer-lsusb.txt"; } @data = main::reader($file,'strip'); } diff --git a/inxi.1 b/inxi.1 index e89b5d7..8739392 100644 --- a/inxi.1 +++ b/inxi.1 @@ -15,7 +15,7 @@ .\" with this program; if not, write to the Free Software Foundation, Inc., .\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. .\" -.TH INXI 1 "2023\-09\-17" "inxi" "inxi manual" +.TH INXI 1 "2023\-09\-25" "inxi" "inxi manual" .SH NAME inxi \- Command line system information script for console and IRC @@ -357,10 +357,11 @@ If protocol is not detected, shows: Adds \fBwith: Xwayland v:...\fR if xwayland server is installed, regardless of protocol. -Also shows screen resolution(s) (per monitor/X screen). Shows graphics API used, -like OpenGL. For X.org: OpenGL renderer, OpenGL core profile version/OpenGL -version; for VESA: data (for Xvesa); for Wayland: GBM/EGL data (not -implemented). +Also shows screen resolution(s) (per monitor/X screen). Shows graphics API +information (if available). EGL: EGL version, drivers, acdtive platforms; +OpenGL: renderer, OpenGL core profile version/OpenGL version (if core/compat +versions different, shows that as well); Vulkan: Vulkan version, drivers, +surfaces;VESA: data (for Xvesa). Compositor information will show if detected using \fB\-xx\fR option or always if detected and Wayland since the compositor is the server with Wayland. @@ -840,14 +841,36 @@ Note \- Maintainer may have disabled this function. If inxi \fB\-h\fR has no listing for \fB\-U\fR then it's disabled. -Auto\-update script. Note: if you installed as root, you must be root to -update, otherwise user is fine. Also installs / updates this man page to: +Auto\-update inxi or pinxi. Note: if you installed as root, you must be root to +update, otherwise user is fine. Also installs / updates current man page to: \fB/usr/local/share/man/man1\fR (if \fB/usr/local/share/man/\fR exists AND there is no inxi man page in \fB/usr/share/man/man1\fR, otherwise it goes to \fB/usr/share/man/man1\fR). This requires that you be root to write to that directory. See \fB\-\-man\fR or \fB\-\-no\-man\fR to force or disable man install. +\fB\-U\fR accepts the following options (inxi and pinxi): + +No arg \- Get from main git branch. + +3 \- Get the dev server (smxi.org) version. Be aware that pinxi when taken from +here can be very unstable during active development! The inxi version is the +stable master branch version. Also useful to update if you have SSL issues and +\fB\-\-no\-ssl\fR works. + +4 \- Get the dev server (smxi.org) FTP version (same as 3 version). Use if SSL +issues and \fB\-\-no\-ssl\fR doesn't work. For very old systems with SSL 1, you +will probably need to use this option, which bypasses HTTP downloading, and uses +straight FTP to get the file from smxi.org server. + +[http|https|ftp] \- Get a version of $self_name from your own server. Use the +full download path, e.g. + +\fB\inxi -U ^https://myserver.com/inxi\fR + +For failed downloads, use the debug option \fB\-\-dbg 1\fR in addition to get +more verbose failure reports. + .TP .B \-\-usb\fR .br @@ -1371,13 +1394,17 @@ HCI ID. \- Adds (if available and/or relevant) \fBvendor:\fR item, which shows specific vendor [product] information. -\- \fBX.org:\fR Adds direct rendering status. - \- \fBX.org:\fR Adds (for single GPU, nvidia driver) screen number that GPU is running on. \- Adds device temperature for each discrete device (Linux only). +\- For EGL, adds active/inactive platform report. + +\- For OpenGL (\fBX.org\fR only) adds direct render status, GLX version. + +\- For Vulkan, adds device count. + .TP .B \-x \-i\fR \- Adds IP v6 additional scope data, like Global, Site, Temporary for @@ -1653,11 +1680,15 @@ grid of monitors that the \fBXorg\fR \fBScreen\fR is composed of. real monitor size, not the Xorg full Screen diagonal size, which can be quite different. -\- For free drivers, adds OpenGL compatibility version number if available. For -nonfree drivers, the core version and compatibility versions are usually the -same. Example: +\- For EGL, shows platform by specific platforms, with driver and egl version if +different from the main one. -\fBv: 3.3 Mesa 11.2.0 compat\-v: 3.0\fR +\- For OpenGL, adds ES version (\fBes\-v\fR) if available. If the Display line +did not find an X11 display ID, the ID (e.g. \fB:0.0\fR) will show here instead. + +\- For OpenGL, Vulkan, adds \fBdevice-\ID\fR, if available. + +\- For Vulkan, adds per Device ID report (type, driver, device\-ID). .TP .B \-xx \-I\fR @@ -1847,6 +1878,12 @@ right. \- \fBWayland:\fR Adds to Monitors \fBscale:\fR (if detected). +\- For EGL, shows hardware based driver(s) (\fBhw:\fR), with the related +hardware, like AMD or Intel. + +\- For Vulkan, adds layer count, per device driver hardware vendor (not +displayed if device name is present with \fB\-a\fR). + .TP .B \-xxx \-I\fR \- For \fBUptime:\fR adds \fBwakeups:\fR to show how many times the machine @@ -2218,36 +2255,50 @@ shown). \- Adds to Monitors \fBbuilt:\fR, \fBgamma:\fR, \fBratio:\fR (if found). +\- Adds to OpenGL device memory and unified status, if present. + +\- Adds to Vulkan full device report, with full device names, ids, drivers, +driver versions, surfaces. + X.org sample (with both \fBxdpyinfo\fR and \fBxrandr\fR data available): .nf \fBinxi \-aGz Graphics: - Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] vendor: XFX Pine - driver: radeon v: kernel alternate: amdgpu arch: TeraScale\-2 - code: Evergreen process: TSMC 32\-40nm built: 2009\-15 pcie: gen: 1 - speed: 2.5 GT/s lanes: 16 link\-max: gen: 2 speed: 5 GT/s ports: - active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 bus\-ID: 0a:00.0 - chip\-ID: 1002:68f9 class\-ID: 0300 - Display: x11 server: X.Org v: 1.21.1.3 with: Xwayland v: 22.1.0 - compositor: xfwm v: 4.16.1 driver: X: loaded: modesetting dri: r600 + Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] + vendor: XFX Pine driver: radeon v: kernel alternate: amdgpu + arch: TeraScale\-2 code: Evergreen process: TSMC 32\-40nm + built: 2009\-15 pcie: gen: 1 speed: 2.5 GT/s lanes: 16 link\-max: + gen: 2 speed: 5 GT/s ports: active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 + bus\-ID: 0a:00.0 chip\-ID: 1002:68f9 class\-ID: 0300 temp: 58.0 C + Display: x11 server: X.Org v: 1.21.1.7 with: Xwayland v: 22.1.9 + compositor: xfwm v: 4.18.0 driver: X: loaded: modesetting dri: r600 gpu: radeon display\-ID: :0.0 screens: 1 - Screen\-1: 0 s-res: 2560x1024 s-dpi: 96 s\-size: 677x270mm (26.65x10.63") - s\-diag: 729mm (28.7") + Screen\-1: 0 s\-res: 2560x1024 s\-dpi: 96 + s\-size: 677x270mm (26.65x10.63") s\-diag: 729mm (28.7") Monitor\-1: DVI\-I\-1 pos: primary,left model: Samsung SyncMaster - serial: built: 2004 res: 1280x1024 hz: 60 dpi: 96 gamma: 1.2 - size: 338x270mm (13.31x10.63") diag: 433mm (17") ratio: 5:4 modes: - max: 1280x1024 min: 720x400 - Monitor\-2: VGA\-1 pos: right model: Dell 1908FP serial: - built: 2008 res: 1280x1024 hz: 60 dpi: 86 gamma: 1.4 - size: 376x301mm (14.8x11.85") diag: 482mm (19") ratio: 5:4 modes: - max: 1280x1024 min: 720x400 - API: OpenGL renderer: AMD CEDAR (DRM 2.50.0 / 5.16.0-11.1\-liquorix-amd64 LLVM - 12.0.1) v: 3.3 Mesa 21.2.6 compat\-v: 3.1 direct-render: Yes - ....\fR + serial: H9NX842662 built: 2004 res: 1280x1024 hz: 60 dpi: 96 + gamma: 1.2 size: 338x270mm (13.31x10.63") diag: 433mm (17") + ratio: 5:4 modes: max: 1280x1024 min: 720x400 + Monitor\-2: VGA\-1 pos: right model: Dell 1908FP + serial: G434H87HRA2D built: 2008 res: 1280x1024 hz: 60 dpi: 86 + gamma: 1.4 size: 376x301mm (14.8x11.85") diag: 482mm (19") + ratio: 5:4 modes: max: 1280x1024 min: 720x400 + API: EGL v: 1.5 hw: drv: amd r600 platforms: device: 0 drv: r600 + device: 1 drv: swrast gbm: egl: 1.4 drv: kms_swrast surfaceless: + drv: r600 x11: drv: r600 inactive: wayland + API: OpenGL v: 4.5 vendor: x.org mesa v: 22.3.6 glx\-v: 1.4 + es\-v: 3.1 direct\-render: yes renderer: AMD CEDAR (DRM 2.50.0 / + 6.4.3\-1\-liquorix\-amd64 LLVM 15.0.6) device\-ID: 1002:68f9 + memory: 1000 MiB unified: no + API: Vulkan v: 1.3.250 layers: 3 device: 0 type: cpu + name: llvmpipe (LLVM 15.0.6 256 bits) driver: mesa llvmpipe + v: 22.3.6 (LLVM 15.0.6) device\-ID: 10005:0000 surfaces: xcb,xlib\fR .fi + Wayland sample, with Sway/swaymsg: .nf -\fBinxi \-aGz +\fB +inxi \-aGz Graphics: Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] vendor: XFX Pine driver: radeon v: kernel alternate: amdgpu arch: TeraScale 2 @@ -2255,7 +2306,7 @@ Graphics: gen: 2 speed: 5 GT/s ports: active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 bus\-ID: 0a:00.0 chip\-ID: 1002:68f9 class\-ID: 0300 Display: wayland server: Xwayland v: 21.1.4 compositor: sway v: 1.6.1 - driver: gpu: radeon d\-rect: 2560x1024 + driver: dri: r600 gpu: radeon d\-rect: 2560x1024 Monitor-1: DVI\-I\-1 pos: right model: SyncMaster serial: built: 2004 res: 1280x1024 hz: 60 dpi: 96 gamma: 1.2 size: 340x270mm (13.4x10.6") diag: 434mm (17.1") ratio: 5:4 modes: @@ -2264,8 +2315,12 @@ Graphics: res: 1280x1024 hz: 60 gamma: 1.4 dpi: 86 gamma: 1.4 size: 380x300mm (15.0x11.8") diag: 484mm (19.1") ratio: 5:4 modes: max: 1280x1024 min: 720x400 - API: GBM/EGL - Message: Wayland GBM/EGL data currently not available. + API: OpenGL v: 4.6 compat\-v: 4.5 vendor: x.org mesa v: 22.3.6 + glx\-v: 1.4 direct\-render: yes renderer: AMD CEDAR (DRM 2.50.0 / + 6.4.3\-1\-liquorix\-amd64 LLVM 15.0.6) device\-ID: 1002:68f9 + API: EGL v: 1.5 hw: drv: amd r600 platforms: device: 0 + drv: r600 device: 1 drv: swrast surfaceless: drv: r600 wayland: + drv: r600 inactive: gbm,x11 .fi .TP diff --git a/inxi.changelog b/inxi.changelog index 525fa0f..8f480c2 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,24 +1,209 @@ ================================================================================ -Version: 3.3.29 -Patch: 01 -Date: 2023-09-17 +Version: 3.3.30 +Patch: 00 +Date: 2023-09-25 -------------------------------------------------------------------------------- RELEASE NOTES: -------------------------------------------------------------------------------- -Packagers: Please update your build tools to build from: +PACKAGERS! inxi repos are moved to https://codeberg.org/smxi/inxi -https://codeberg.org/smxi/inxi +The repos will mirror to github for a short amount of time, until after 3.3.30 +is released, then I am probably going to do some big changes in the structure of +the inxi repo. Make sure to update your packaging tools and scripts for this +change. -repos. Codeberg will mirror to github until after 3.3.30 is released, after that -there will be more fundamental repo changes, but nothing that should impact inxi -packagers. But no attempt will be made to mirror those changes to github when -they are made because it takes too much work. +-------------------------------------------------------------------------------- -This is a transitional patch version, the only change is altering the self -updater URLs to codeberg.org from github.com. Mainly so that the master branch -will give the correct URLs until 3.3.30 is released, which will be in a few -weeks. +Finally, a huge upgrade for Wayland future proofing, and other futures that are +maybe coming, by adding EGL API, and Vulkan for good measure. This should handle +wayland finally, that's been a stub forever, but finally realized eglinfo was a +thing, and that vulkan as well could be a contender to replace OpenGL, at least +that's what Mesa says on their site, and they should know. + +This handles one of the longest standing weak points of inxi graphics, being +completely X11-centric, even though wayland support exists fairly extensively, +but this glxinfo dependent feature was a niggling annoyance, now it's fairly +ambivalent about which api tool you throw at it, the hardest is to give the +right message for no data, or incomplete data. Note that eglinfo supplies at +least software rendering out of X11 or Wayland, so we can now get some API data +in console, including if supported, OpenGL data. Not all of it, but some of it. + +Also since now all the docs are split and granular, with the Graphics API +upgrades, added data sample files from glxinfo, eglinfo, vulkaninfo, and vainfo +for good measure, just to have some of the latter. This is one of the first time +all the data used to develope a feature, docs for that feature, and the feature +itself, are being shared and released at the same time. + +-------------------------------------------------------------------------------- +SPECIAL THANKS: + +1a. GRAPHICS: API: Arch user Chrome30 on github for requesting vulkan data, and +providing the initial datasamples that made it possible to think about this new +API feature. + +1b. CheckRecommends: Display packages: mrmazda, a frequent helper, checked and +updated OpenSUSE and Fedora vulkan/egl/glx API tool package names. Those have +been a bit fluid and many of the names I had were not right. + +-------------------------------------------------------------------------------- +KNOWN ISSUES: + +1a. GRAPHICS: nothing is perfect, for sudo/root the detections fail for OpenGL +API messages, but fallbacks will make it a bit nicer than it was, with some +data, instead of none as before. + +1b. GRAPHICS: API: I'm assuming that the greatest EGL version number found is +the actual version, and lower versions are what that platform supports. This is +an assumption, not a known fact, but finding this stuff clearly documented tends +towards near impossibility, or takes forever to determine, so that's the +assumption that is being used. Correct via issue and clear explanation with +links to resources if this is incorrect. + +-------------------------------------------------------------------------------- +BUGS: + +1. Nothing to speak of. + +-------------------------------------------------------------------------------- +FIXES: + +1. PARTITIONS: had wekafs as a zfs type fs, it's not, it's more like NAS, cloud. +Added to distributed list, and removed from zfs|btrfs|hammer list. I know, I +know, will it ever matter? Probably not. But just in case, wouldn't want your +local machine to report with petabytes of storage now would we! + +2. CheckRecommends: corrected some Fedora, SUSE package names. + +-------------------------------------------------------------------------------- +ENHANCEMENTS: + +1a. SYSTEM: DistroData: added Bodhi id method, /etc/bodhi/info file which is +similar to /etc/lsb_release, updated system base detection as well. System base +comes from /etc/os-release. + +1b. SYSTEM: DistroData: Added Nitrux system base (debian). Why they try hide +this is beyond me. Maybe because they are not using a real PM, and don't include +apt, who knows. + +2a. GRAPHICS: new nvidia gpu ids. + +2b. Graphics: EGL API data: +* Shows eglinfo missing if appropriate, no data messages if appropriate. +* -G shows EGL version(s), drivers, active platforms. +* -Gx adds active/inactive platforms as sub items of platforms. +* -Gxx shows platforms by platform, with egl version, driver. EGL version only +shows if there were more than 1 detected, otherwise it shows with EGL v: +* -Gxxx shows hw based on driver, if found, like vulkan. + +To avoid excess verbosity, does not show renderer OpenGL name per platform +because it would be way too long and repetetive. And besides, that would show +in OpenGL anyway, more or less, unless there are two different GPUs, which is a +case that is not fully handled. + +2c. GRAPHICS: OpenGL data: +* If glxinfo not present, or with null output due to root/no display, and if +eglinfo available, and has OpenGL items, will populate most of OpenGL API with +data, except for Direct Rendering and GLX version. Shows appropriate messages +indicating it's EGL sourced for console, root, no data, or glxinfo missing. +* -Gx adds GLX version, if detected. +* -Gxx add: ES version, if detected; device-ID, if available. Also adds +display-ID, if Display-ID was not found in the Display line (which probably +means that xdpyinfo or xrandr were not installed). Does not always show since it +already appeared in Display line if it was discovered. +* -Ga adds device memory, and unified memory status (yes/no). + +2d. GRAPHICS: Vulkan API data: +* Shows appropriate messages if vulkaninfo present, but no data found. +* -G shows Vulkan version, drivers, and surfaces. +* -Gx device counts. +* -Gxx adds device by id, type, driver report. +* -Gxxx adds layer count; adds device hardware vendor, based on mesa driver. Not +for nvidia driver, since that is self evident. Goes away with -Ga if device name +exists. +* -Ga adds full device report, including per device names, ids, drivers, driver +versions, surfaces. + +3. UPDATE: Because the smxi.org server no longer accepts TSL 1.1 based HTTP +requests, added for extreme legacy systems a new update option, -U 4, which +uses direct FTP download from smxi.org ftp server. If system set to default to +perl downloader HTTP::Tiny it switches to using a non perl downloader +automatically, like wget or curl. + +4. CPU: Microarch: got early zen5 possible IDs. Both Intel/AMD may have rough +ID working well before they ship in public. CPU stuff has slowed down a lot, +the 4,3n nodes are not easy, obviously. + +5. DRIVES: Many more drive vendors and drive IDs. + +6. RAM: More RAM vendors. Note that it's not unusual for a Drive vendor to also +make RAM, and vice versa. + +-------------------------------------------------------------------------------- +CHANGES: + +1a. GRAPHICS: For API, show OpenGL mesa-v: x.x.x separate from main API v: +string. Also only shows the actual API version with v: now, like v: 4.5. Also +shows vendor: nvidia v: 340.23 for nvidia, without mesa. Falls back for +unhandled cases or syntaxes to the whole version string for v:. + +1b. GRAPHICS: For OpenGL, shows compat-v: always if present, that was a mistake +not to show it unless -Gx, since otherwise you'd think you are running a +different version. Not a common situation, but on legacy hardware, can happen. + +-------------------------------------------------------------------------------- +DOCUMENTATION: + +1a. DOCS: docs/inxi-cpu.txt - reorganized into more coherent sections, like with +like, etc. Added better top Sections navigation since there is so much data. + +1b. DOCS: docs/inxi-resources.txt - moved last code tricks to +docs/tips-tricks.txt. + +1c. DOCS: new docs/ files inxi-battery.txt, inxi-debuggers.txt, +inxi-devices.txt, inxi-kernel.txt, inxi-machine.txt, inxi-network.txt, +inxi-raid-logical.txt, inxi-start-client.txt, inxi-tty.txt, inxi-weather. + +These new files cleaned out docs/inxi-data.txt and docs/inxi-resources.txt, +which are now merely placeholder files, and have no data in them beyond pointers +to the actual data files. + +1d. DOCS: docs/inxi-custom-recommends.txt updated for SUSE/Fedora packag name +fixes and new eglinfo and vulkaninfo items. + +2a. DATA: moved more data from non public data to shared. Refactored directories +to be better organized, and to follow the overall inxi data structures better. + +2b. DATA: added many more eglinfo, glxinfo, vulkaninfo to data/graphics. Also +added some clinfo, vainfo just in case decide to support those APIs. + +3a. MAN/OPTIONS: updated for new graphics API features, new verbsity features, +etc. + +3b. MAN/OPTIONS: added -U arguments for man, for some reason I'd left those out. +Also removed options references to -U 1, 2, because those should never be used, +if those versions of inxi even exist, they are ancient. Added -U 4 option, and +explanation of when/why to use it. + +-------------------------------------------------------------------------------- +CODE: + +1a. FAKE DATA: updated paths for fake data to reflect data reorganization. + +1b. FAKE DATA: Added --fake egl,glx,vulkan for GRAPHICS API. + +2. GRAPHICS: Fully refactored opengl_output, moved to gl_data/opengl_output. +Added egl_data, egl_output, and vulkan_data, vulkan_output, and some other +tools. + +3. UPDATE: if downloader is set to 'perl', aka, Tiny::HTTP, and -U 4 is used, +which is a direct FTP download of the inxi/pinxi files, tiny is disabled, and +the next available downloader (wget/curl/fetch) is used instead. + +4. DEBUGGER: added clinfo, eglinfo, es2_info, vainfo, vdpauinfo, vulkaninfo. + +-------------------------------------------------------------------------------- +-- Harald Hope - Mon, 25 Sep 2023 15:03:45 -0700 ================================================================================ Version: 3.3.29