Software

From NvWiki
Jump to navigation Jump to search

Nvidia has produced many pieces of software for users of their graphics cards. The main piece of software required is their drivers: they are required to make the GPU function at all, beyond the very basic common level of 2D-only acceleration and software-rendered 3D (VGA, VESA, or Windows Advanced Rasterisation Platform - WARP in Windows 7 and later) level of compatibility assured for all forms of graphical hardware; any Nvidia-specific features require their drivers to be installed on the system. The first ever variant of the Nvidia driver set was the series of VxDs running under Windows 3.x that allowed the NV0 to be simulated. There have historically been several sets of drivers for Nvidia hardware: initially, the first was Nvidia's drivers, based on their Resource Manager, which started development in 1994, and the very early versions of the NT miniport driver which programmed the hardware directly rather than through the RM, as a stopgap measure until the real Resource Manager was ported over to NT, starting with the NV1, in roughly 1996. There was also a semi-official, very basic nv driver set for Linux, which was not judged sufficient for use of the card under Linux, was updated infrequently with few features and Nvidia required to be partially obfuscated (and was generally hard to deal with as a company)[1] : several driver projects started to provide a more complete emulation, with nouveau, under the purview of the wider freedesktop project, being the most popular and long-lasting, although Utah GLX (which successfully achieved 3D acceleration on the Riva 128 at least) and RivaTV, aimed at using the TV-out functionality and Mediaport of these cards, also existed; nv was also ported to BeOS and several other operating systems to allow Nvidia GPUs to be used on their operating systems. Later on, most of these projects experienced sharp declines in development activity, or were discontinued entirely as Nvidia ported their full Resource Manager drivers to Linux and eventually partially open-sourced them, although parts of it were moved to the firmware running on modern nVidia GPUs' on-die Falcon and RISC-V cores prior to this.

Nvidia has also provided both industry-standard APIs (such as DirectX, OpenGL and Vulkan) several custom APIs for their products for both graphics and non-graphics related applications, such as Cg (C for graphics) starting on the NV20, and for GPGPU applications, CUDA (Compute Unified Device Architecture) starting on the G80. However, these are largely implemented as Resource Manager clients or otherwise as parts of their drivers: for example, the game physics API PhysX, the Nintendo Switch graphics API nvn and its Switch 2 successor nvn2, the extremely confusingly named "NVIDIA Riva" AI speech generation API, NeMo for generative AI, RAPIDS for data science, CUDA-X for general AI libraries, and many more are all implemented in a similar fashion.

Presumably, the NV2 did not use any form of drivers, or used a light vendor-supplied library (similar to the "OS" library for the Nintendo 64, per Goddard) and was intended to be programmed directly by the game developer while running on Saturn V08, as was the style for consoles at that time.

Design

While Nvidia has changed their drivers' design over time, at least for early models there are two pretty basic setups for the "full fat" Nvidia Resource Manager-based drivers, one which was used for NV1 through NV3 and a new design which was used starting with NV4 (although there are obviously variations of both).

In all cases, the Resource Manager implements the actual interaction with the hardware. The RM initialises, controls and shuts down (if required) the graphics hardware; multiple types of APIs are provided in order to interact with the RM. The first model is the OS-provided IOCTL interface can be used (this model is used byt). A second model is calling into APIs exposed by the Resource Manager through the NVAPI interface (basically a function, a la Quake-based game engine, that takes a single parameter, which is a very large C struct with many function pointers for different functions), typically implemented via the mechanism of a stub DLL that forwards each function to the Resource Manager. The implementation varies by driver version and intended operating system. For instance, in the case of NV3 drivers for Windows 9x, the 32-bit API NV3API.DLL thunks into a 16-bit dll NV3SYS.DLL by passing a large array of function pointers (which also exports, via traditional DLL exporting, the same API but for 16-bit apps) which then calls back into the 32-bit Resource Manager VxD to perform API calls. The interface to the GPU is implemented via a pseudo-C++ class system classes are indicated by object IDs, with a large array of class structures providing "methods"; methods are assigned an ID, corresponding to the offset within a DMA channel that you have to write to execute the method on hardware). There is no requirement for an offset to have a unique ID. Some classes are implemented in hardware using the grHWMthd function: if a class is implemented in hardware, it is simply stubbed out in software, raising an interrupt (even though the GPU doesn't need it).

NV1 to NV3

From NV1 to NV3 the Resource Manager is unique for each graphics card - it is a different branch in Nvidia's source control system. This is not shared for all parts of the drivers; the GDI drivers definitely are not set up like this, leading to NV3 resource managers with GDI drivers that support NV4 (starting around February 1998, several months before the release of the Riva TNT). It is unclear if this fact was realised at the time; it seems that it may have been realised by the era of the NV15 architecture.

NV4

Supported platforms

Note: These are platforms that were supported for any length of time, not platforms that are currently supported, or which GPUs they can be used with.

Supported operating systems
Operating system Driver supported
Windows for Workgroups 3.11 Full drivers[2]

Windows 95 Full drivers
Windows 98/98SE Full drivers
Windows ME Full drivers
Windows NT 3.51 Miniport driver only
Windows NT 4.0 Miniport driver, later full Resource Manager-based driver[3]

Windows 2000 Full drivers[4]

Windows XP Full drivers[5]

Windows Vista Full drivers
Windows 7 Full drivers
Windows 8 Full drivers
Windows 8.1 Full drivers
Windows 10 Full drivers
Windows 11 Full drivers
Xbox (original) Modified full drivers ("minix")
macOS Full drivers
Android Full drivers, also nv
Linux Initially nv or open-source project only, later full drivers.
BeOS, Haiku, EOS, AsusWRT (linux-based) These OSes support the nv driver only
OS/2 Full drivers
PlayStation 3 (CellOS) Custom
Horizon OS (Switch) Full drivers (with custom API)
Horizon OS (Switch 2) Full drivers (with custom API)

Known driver versions

Each component of Nvidia's drivers has an official description (it used to be used in their control panel extension to list each driver file); for example "Resource Manager" or "OpenGL ICD". Initially, these were simply described as being for "Nvidia" (e.g. "NVidia Resource Manager, Version 2.00 Beta"), later on the file descrip[tions were changed to be named after the specific GPU supported, e.g. "RIVA 128 Direct Draw/Direct 3D Driver, Version x.xx" or "Riva TNT Display Driver, Version x.xx", however later when Nvidia refactored their GPU drivers to support multiple models of graphics hardware, they changed the description to simply read "NVIDIA Compatible". This is still the case as of April 2025.

There were certainly many other versions, if you have any other version, please contact me: you can check by checking the file properties of any file in the driver set.

NV1

Known driver versions
Date of driver files Version Known platforms
25 October 1995 1.20 MS-DOS, Windows 95
2 February 1996 2.00 Beta Windows 95
11 February 1996 FCS 2.00 MS-DOS (CEK 1.22); Windows 95
23 September 1996; some files rebuilt 19 March 1997 2.30 Windows 95

NV2 / NV3 QTM

There are no known drivers for NV2 or NV3 (QTM). Traditional drivers (although software certainly existed) for the former are not likely as it was intended to be used as part of a game, but driver development may have started for the latter.

NV3

Note: Certain OEM-specific drivers may be missing; they are usually almost identical to reference driver versions, but may have certain minor feature differences. Few of these have notable changes (e.g. Diamond adding their InControl Tools, or the STB TwinView two/four head cards with custom "mp" functions to switch between different chips on the board - it is not clear if STB or Nvidia made these modifications). Additionally, the driver versions included in Windows 98 beta releases are not listed (they take the version of the Windows SDK they were compiled with, for instance 4.10.1635).

Early drivers for Windows 9x, the drivers included with Windows 98 pre-release builds and almost all NT 4.0 and 2000 drivers for NV3-based architectures have COFF or VxD symbols (depending on platform) for the resource manager and display driver, although not for the Direct3D or OpenGL drivers. Nvidia seems to have had issues turning off symbol generation, as at some point they wrote a header file that redefined every function name as __nv_rmsym_\<number\> as some strange way of attempting to obfuscate their function names.

Known driver versions
Date of driver files Version Known platforms Notes
17 July 1997 Unnumbered pre-release Windows NT 4.0 Accidentally released by STB Systems. Has NV1 support in display driver (even though NT was never officially supported on NV1), and only supports revision A of NV3.
15 August 1997 0.75 Windows NT 4.0 Possible launch drivers
27 August 1997 0.75 Windows NT 3.51 No resource manager
1 September 1997 0.77 Windows 9x Possible launch drivers
23 September 1997 (STB Systems) 1.16 Windows 9x D3D drivers compiled with debug messages left on. PDB file names refer to STB products proving STB Systems had driver source code access (they were the first to license the Riva 128) and most likely from Nvidia's unstable branch. STB was later bought by 3dfx in 1998, so they may have been able to obtain access to Nvidia's driver sources?
29 September 1997 1.04 Windows NT 4.0
2 October 1997 1.05 Windows 3.1
22 October 1997 1.06 Windows 9x
2 November 1997 1.07c Windows NT 4.0
14 November 1997 1.21 Windows 9x OpenGL Alpha 1 release (nv3quake.zip). Also the Alpha 2 release with an updated OpenGL ICD from 2 December 1997
10 December 1997 1.11 Windows 9x Yes, later than 1.21. The 1.21 was from a development branch for OpenGL support.
31 January 1998 1.28 Windows 9x OpenGL Beta 1 release.
1 February 1998 1.29 Windows NT 4.0 First driver with NV4-related functions in display driver (very basic support, simply initialisation and shutdown, to start with)
26 February 1998 1.36 Windows 9x
9 April 1998 1.44 Windows 9x
28 April 1998 1.50 Windows 9x
29 April 1998 1.50e Windows NT 4.0
5 May 1998 1.50k Windows NT 4.0
4 August 1998 1.62 Windows NT 4.0
19 August 1998 1.72ms Windows 9x
26 August 1998 1.74 Windows NT 4.0
27 August 1998 1.27 Windows 3.1 Final Win3.1 drivers; probably different branch; some files call themselves "RIVA TNT Resource Manager, Version 0.11"
28 August 1998 1.75 Windows 9x nVIDIA SDK 0.81
14 September 1998 2.77 Windows 9x, Windows NT 4.0 NT: Display driver output name changed from nv_disp to nv3_disp (probably due to NV4 driver development)
2 October 1998 2.80 Windows 9x, Windows NT 4.0 nVIDIA SDK 0.83
22 October 1998 2.83 Windows 9x, Windows NT 4.0
9 November 1998 3.03 Windows 9x
10 December 1998 1.30, 2.79 (Diamond branch) Windows 9x Most likely a branch maintained by Diamond Multimedia for their "Viper" cards, released 21 January 1999
7 January 1999 3.12 Windows 9x, Windows NT 4.0
1 February 1999 3.22 Windows 9x
1 February 1999 3.23 Windows NT 4.0
9 February 1999 3.25 Windows 9x
18 February 1999 3.27 Windows NT 4.0
3 March 1999 Unknown version OS/2 (Warp 3 Fixpak35+ & 4 Fixpak5+) Very sloppily done. Batch file (well, Rexx script) setup. Unclear what GPU is even supported: it was posted on Nvidia's RIVA 128 download pages, but the readme file calls it "GRADD Driver for Nvidia NV4" (not even using a product name), despite being last modified on 25 February 1999.
21 March 1999 3.37 Windows 9x, NT 4.0, 2000 (beta) Final driver for Windows 9x, only Win2000 driver with OpenGL support. Even though the driver was compiled against Windows 2000 build 1996, it works fine on the final Windows 2000, including Service Pack 4
11 May 1999 3.41b Windows NT 4.0 Final NT 4.0 driver
28 October 1999 3.43 Windows 2000 2D-only driver bundled with Windows 2000. Still has OpenGL hooks; untested
31 July 2001 3.43 Windows XP 2D-only driver bundled with Windows XP. Still has OpenGL hooks; tested, does not work on default, crashes late in OpenGL initialisation process (may be patchable)

NV4 and later shared drivers

Notes

^ These issues in the relationship eventually led to the infamous "Fuck you, Nvidia!" comment and middle finger by Linus Torvalds at a 2012 event.
^ They are officially marked as being for 3.11, but unless they depend on the 32-bit File Access feature backported from Windows 95, or any other feature that was exclusively added in WfW 3.11, there should be no reason why they cannot work on any other version of Windows 3.1, such as the original 1992 release, standalone Windows 3.11, or Windows for Workgroups 3.1: however, the drivers have not been tested with these older versions, so the compatibility, or lack thereof, is unknown.
^ Initially 2D only, then OpenGL only: no D3D.
^ Initially OpenGL only, later Direct3D support was added. Beta only for NV3.
^ 2D only officially for NV3, although hooks to load the OpenGL drivers still exist; they do not load using the Windows 2000 drivers, but they can likely be patched to work.