Nouveau's OpenGL Performance Approaches The NVIDIA Driver

As I
began to share over the weekend, the community-created Nouveau driver that's
open-source and is written by clean-room reverse-engineering the NVIDIA binary
display driver, has reached a serious milestone. For low-end NVIDIA GPUs, the
Nouveau driver based upon the Mesa Gallium3D architecture is now as fast, or even
faster, than NVIDIA's official proprietary driver.

Crossing this milestone happens with the Linux
2.6.39 kernel, which has not even had its first release candidate yet with
the Linux
2.6.38 kernel being released just one week ago. The early change that so greatly
affects the Nouveau OpenGL performance is the merging of KMS/DRI2 page-flipping
for the Nouveau DRM (Direct Rendering Manager) driver within the Git tree that
will form the Linux 2.6.39 release. In last
week's pull, DRI2/KMS page-flipping was enabled for the Nouveau DRM along
with z-compression and various other changes that have built-up since the 2.6.38
kernel merge window was open back in January.

It was in the Linux 2.6.38 kernel where the Radeon page-flipping
was introduced for ATI/AMD hardware, and that resulted in dramatic
performance improvements for the open-source driver too. Page-flipping is
a major win as it allows for faster performance by simply changing a pointer between
the screen's front and back-buffers rather than copying the contents to/from the
front/back-buffers. This page-flipping not only allows for faster performance,
but it also ensures tear-free screen updating since nothing has to be copied to
the front-buffer. The benefits are the same for the Nouveau driver, but with this
open-source driver already performing quite good in relation to the proprietary
NVIDIA driver, it happens to be that for some GPUs this is enough to push
it to running at the same speed as the proprietary NVIDIA driver.

For these initial Nouveau tests using the latest Mesa 7.11-devel
Gallium 0.4 Git code as of 2011-03-18 and also the Git code of the xf86-video-nouveau
DDX and Linux kernel (from the linus-2.6.git tree) from the same date, an Intel
Sandy Bridge system was used. It was the Intel Core i5 2500K CPU, Sapphire Pure
Black P67 Hydra motherboard, 2GB of DDR3 system memory, and 250GB Seagate SATA
HDD. The NVIDIA graphics cards tested in this article include the GeForce 8500GT
512MB, GeForce 9500GT 1024MB, GeForce 9800GT 512MB, and GeForce GT 220 1024MB.
Why no other NVIDIA graphics cards for this testing? It is explained at the end
of the article.

The binary driver used in testing was the NVIDIA 270.30 Beta.
Besides the updated graphics stack and kernel, this was an Ubuntu 10.10 x86_64
installation with GNOME 2.32 and Compiz, X.Org Server 1.9.0, GCC 4.4.5, and an
EXT4 file-system.

Worth noting with the Nouveau driver that, unlike the Radeon driver,
there is no SwapbufferWait xorg.conf option with the xf86-video-nouveau DDX. There
is a page-flipping xorg.conf option for the Nouveau driver, but with the 2.6.39
kernel and latest DDX, page-flipping is enabled by default.