Home

Advertisement

Customize
Recently, Phoronix posted an article (http://www.phoronix.com/scan.php?page=news_item&px=NzU5NA) claiming that the development of both the RadeonHD and Nouveau drivers is essentially dead-in-the-water.  I can't speak for RadeonHD at all as I don't follow it, but their claims about Nouveau are, quite bluntly, wrong.

So, this has prompted me to get out of vim and into firefox to post my very first blog article on just what has been going on in Nouveau since Fedora 11's release.

Kernel Modesetting (KMS)
In Fedora 11, KMS was provided as an experimental option that owners of GeForce 8 and higher hardware could switch on an try.  This has changed in Fedora 12.  One of the first new features pushed into Nouveau was a port of the userspace RandR 1.2 (yes, despite what the above-mentioned article claims, we have supported this for quite a long time now, on all chipsets) for *all* the earlier chipsets to the DRM in order to provide KMS support.

As a result of this, and additional improvements to the pre-existing G80 KMS support (see below), KMS is now the default in Fedora 12.

G80 Modesetting
Previously, the modesetting code for GeForce 8 and higher chipsets did essentially the exact same thing as the NVIDIA-supported xf86-video-nv driver.  While this is sufficient for a large number of configurations, quite a lot of work had to be done to reverse-engineer and implement support for a number of features we were aiming for in F12.

VBIOS output configuration scripts
In a vaguely similar fashion to ATOMBIOS on ATI GPUs, the video BIOS on NVIDIA chipsets provide a number of tables and "scripts" that are extremely useful to the driver when initialising the display.  Since Nouveau gained RandR 1.2 support for GeForce 7 and earlier chipsets, we've been using quite a lot of this information to program the outputs on the graphics card, resulting in far, far more stable modesetting capabilities.  Beginning with GeForce 8, a great deal of the functionality we depend on for the early chipsets moved, thus we were stuck with the semi-capable hardcoded initialisation from xf86-video-nv.

A while back, I stuck my head into various VBIOS images and traces of the NVIDIA binary driver and started slowly connecting the dots between various tables and eventually discovered where to find, and how to use the new tables present on G80.  As a result of this, we are no longer dependant on the VBIOS POST routine assisting with the output configuration (also very important for suspend/resume!), and are able to configure a lot of output combinations that previously would've caused the GPU's display engine to hang in disgust.

Display Push Buffer
The usual method for output configuration is to bash on a whole bunch of card registers, and that's (almost) precisely what we were doing in F11.  GeForce 8's display architecture is a little different however, and bears a lot more resemblance to how you would usually program the graphics (2D/3D) engine of a GPU.

In F11, we submitted commands to the display engine with a hackish method we inherited from nv.  Unfortunately, while this method was enough to be able to program a mode, it bypasses some of the hardware that's required to implement things such as tiled scanout.

F12 now submits commands to the display engine the same way the NVIDIA binary driver does; by filling a DMA buffer with commands and telling the GPU to fetch them itself, rather than having the CPU poke registers directly.

Tiled scanout
The 3D engine on GeForce 8 chipsets refuses to render to a linear framebuffer.  This can be a *huge* performance hit in a number of scenarios, as we'd have to stall the entire graphics pipeline and render in software.  In F11, we didn't know how to make the display engine scan out from a non-linear framebuffer and had some rather elaborate workarounds that kept a shadow tiled version of the front-buffer and periodically blitted (with the 2D engine) it to the scanout buffer.

In Fedora 12 this has changed, the method to program the display engine for tiled scanout was reverse-engineered and implemented in the driver.  Allowing us to remove the ugly workarounds from the driver, and gain back some GPU power that was used for the additional copies between the shadow and scanout buffers.

Suspend/Resume
Yes, that's right, Nouveau finally supports suspend/resume.  In theory the support is there for all chipsets.  In the very least, every chipset I own (at least one from each family, and 5 G80-class cards)  can suspend/resume reliably except for a TNT2 that has other issues..  This support is only available when kernel modesetting is switched on, so that's even more reason to use it!

Other Stuff 
The above is the major user-visible improvements between Fedora 11 and Fedora 12, but there's more work going on.  On the 3D front Christoph Bumiller has done a lot of excellent work on the G80 3D driver, it's becoming more capable every week.  Francisco Jerez did a massive, much needed cleanup of the NV04-G70 modesetting code, and implemented initial support for TV-out on those chipsets.  There's work going on to implement DisplayPort support, ongoing work on 3D supoort, and likely more things that escape my mind right now.

In conclusion, Nouveau development is progressing quite nicely, and is far from dead!


 
 
 
 

Advertisement

Customize