This post is a small
follow-up on
yesterday's post about the Linux graphics stack. I'm still keeping to
high level stuff and won't dig too deep, but
a
few questions arose (others reached me by e-mail), so, here we go.
Gallium3D is a framework, initially developed by Tungsten Graphics, which
were bought by VMware. The idea behind Gallium3D is, that many functions can be
shared between drivers for different
GPUs and that the effort to support
a new platform/system is for classic drivers pretty high. With Gallium3D
you just need a state tracker and a target. The state tracker is code, that
gives the pipeline of Gallium3D drivers access to a platform/system, like
OpenGL or X on various operating systems. A target is the required as glue
between a state tracker and the actual driver. For example: there is a state
tracker for video playback acceleration (the recently added
g3dvl). The
state tracker itself offers the interface and common functions (with some help
from the auxilliary stuff) between the Gallium3D pipeline and the userland
libraries like
libvdpau1. Targets like
vdpau-[DRIVER] glue
the driver and the state tracker together.
The winsys part of Gallium3D is a similar concept but it abstracts the
windowing system on the target platform away (e.g. Wayland, X or
GDI).
I didn't write about the proprietary drivers yesterday, as I don't consider
them a real part of the Linux graphics stack, more like parasites, and didn't
want to encourage anyone to use them (yes, I know, there are some cases in
which you might be better off with them, but generally I'd avoid them). Anyway,
I got some questions about those (some by e-mail, the other I'm aware off, can
be found behind the link at the beginning of this entry). So, where do the
proprietary drivers come in? They are basically the entire stack in a closed
form, plugging into the public interfaces of the Kernel (whether that's legal
is
disputed), some other parts like X (by building a
DDX) and building their own
libGL.
Especially the last part can be a cause for a lot of pain, when you don't
use the proprietary driver packages offered by the distribution (e.g. Debian's
fglrx packages divert the
libGL and restore the default one
on unistallation, with the vendor build scripts and tools this is not really
guaranteed, which might leave you with a broken OpenGL setup).
Another question was, why Mesa was lacking support for a recent OpenGL
version (i.e. 4.x). In my opinion there are a few reasons, though I don't
really feal like the best person to answer this. The first are design issues by
some internal representations (e.g. missing integer support in the intermediate
representations). The second is the available number of developers being able
to implement new OpenGL functions. Apart from a not all too clear specification
the Mesa code base is huge (even if you ignore most of the drivers), which makes
it difficult for new developers to start coding away. Then you need an
understanding of how modern GPUs operate to find good solutions for the problems
faced. If you want to get an idea for this, take a look at
Zack Rusin's or
Alex
Deucher's blog. Then, there is a sad split of developers, on the one hand
we've got the Gallium3D-using developers on the other we've got the ones
staying with the classic driver model. This means, that you have to implement e.g.
GLSL extensions for
TGSI and Mesa's
IR respectivly. There
might be other reasons, I'm totally missing, but this should give you some
insight into why it takes so long, to get current OpenGL versions supported.
I hope this clears some of the remaining questions, if not, feel free to
write me an
e-mail, but please remember, that this is not an
in-depth analysis.