[Mesa-dev] GSoC : Thoughts about an OpenGL 4.1 state tracker

Denis Steckelmacher steckdenis at yahoo.fr
Sat Mar 12 06:39:52 PST 2011


Hello,

I'm a Belgian young student and I follow the Mesa's development for nearly two 
years now. I'm just 18 yars old and it's the first year I'm elligible to the 
Google Summer of Code.

I originally planned to work on KDE, but I find Mesa more interesting. The 
project on which I would work is a pure OpenGL 4.1 Core state tracker for 
Gallium 3D. I know that it isn't the easiest task to do during a summer, but I 
already started thinking about it and I have plenty of free time from now to 
months after the summer (I will begin IT studies, but I do programming for 
nearly eight years now (yes, the half of my life), so I hope it will not be 
too difficult and time-consuming). I've read parts of the Open GL 4.1 Core 
specification, the OpenGL 4.1 Core summary card, and many examples.

Code-wise, I have already dived in the Gallium3D codebase and I understand it. 
My nearly two years following of the Mesa's development taught me how a 
graphics card works. I especially followed the development of the r300g driver 
(I use an ATI Radeon X1270 graphics card) and the llvmpipe driver.

I'll keep it short about me, but feel free to ask me more questions. The 
purpose of this mail is to ask some questions and to share some ideas about 
this OpenGL 4.1 state tracker. Keep in mind that I'm young and not a 
professional in the computer graphics world (and also that my mother language 
is French, so sorry for my bad English, and the lack of precision in what I 
say).

Here are now some thoughts about this state tracker.

Replacing Mesa ?
================

I have read the Google Summer of Code Ideas page on freedesktop.org, and there 
is an "OpenGL 3.1 state tracker" idea on it. The summary if this idea says 
that the student should start by copying Mesa and the Mesa state tracker and 
then remove the unneeded stuff. I don't know wich way could be the easiest, 
but I think that starting this state tracker "from scratch" could be more 
elegant.

My idea is to create a new directory under src/gallium/state_trackers, and to 
put in it most of the state tracker. There are two alternatives : having just 
one gl4 state tracker, or having gl4, gles2 and glcommon subdirectories (like 
does Nouveau for their pipe drivers). glcommon will contain code shared 
between OpenGL and OpenGL ES 2, and the two other directories will contain 
code specific to either OpenGL 4 or OpenGL ES 2 (it seems that OpenGL ES 2 is 
nearly a subset of OpenGL 4 Core, so it will not be too difficult to have two 
state trackers in one).

With these state trackers, implementing the public API of OpenGL, Mesa will 
become useless (it will be kept for OpenGL 2.1 compatibility, or even for 
OpenGL 3+ compatibility profile when it will be ready). It's possible to put 
the rest of the libGL code into src/gallium/targets. This piece of code will 
load the proper pipe_driver and state tracker, using either GLX or EGL, if 
possible.

Advantages of starting from scratch
===================================

Starting from scratch requires more work but is also more future-proof. We can 
for instance build the state-tracker in a way compatible with OpenGL ES and 
OpenCL, to ease the implementation of GL_ARB_ES2_compatibility and sharing of 
objects between OpenGL and OpenCL. A clean code-base is also easier to extend 
when future versions of OpenGL will be available.

It's also convenient to be able to cleanup Mesa, in a heavier and quickier way 
than copying it and removing stuff. I will say later what I want to drop.

Last, big parts of Mesa can be copied, for example the GLSL compiler. The best 
of Mesa can be kept.

What to implement
=================

Here are what I would try to implement in this state tracker, in order of 
importance.

* The OpenGL 3+ core API, starting at OpenGL 3.0, with the infrastructure done 
to be able to easily add features up to OpenGL 4.1 and future versions. For 
this, the state tracker must be clean and not too big. Implementing a feature 
in Gallium and the pipe drivers is already complex enough.
* The EGL and GLX context-creation APIs. I'll start with EGL, which is used on 
Wayland and cleaner than GLX.
* If it is easy to add just what is needed to have the OpenGL ES 2 API 
available, and if I've the time, I will also try to do that.
* An implementation of some GL3 or GL4 features in llvmpipe is possible too. I 
have no graphics card capable of OpenGL 4 (only a RS690M, using the r300g 
driver), so it seems that I will not be able to test this state-tracker on 
real hardware (I've a GeForce 210, 3.3-capable, but I don't know if Nouveau is 
ready to support OpenGL 3).
* It could be useful to be able to use the OpenVG state tracker in my EGL 
implementation.
* Maybe Clover can be used to add OpenCL support to this state tracker.

What not to implement
=====================

In short : all the old stuff.

* OpenGL 1.x, OpenGL 2.x and the Compatibility profile.
* Support for DRM drivers.
* The indirect mode of GLX, wich isn't used anymore by the majority of 
applications.

The questions
=============

The first one is : are you interested by this ? Do you think it is possible to 
start this state tracker and to have it in a "testable" shape in three months 
(by "testable" I mean that we can run some example programs that use only a 
subset of the OpenGL Core profile, for example KWin, compatible with OpenGL ES 
2, OpenGL 3 Core and which can use EGL).

I've also a question regarding the GLSL compiler and TGSI : I will not 
implement an ir_to_mesa converter, but instead an ir_to_tgsi if needed. I 
don't know what is going on in the work of replacing TGSI with GLSL IR or even 
with LLVM IR. Fortunately, i think that converting the GLSL compiler's output 
to what can be used in the pipe driver will not be the more difficult part of 
the state tracker.

Lastly, I have still to completely understand mapi and all the code handling 
the creation of a context given an API and extensions. Maybe this code is only 
needed for indirect GLX.

Thanks for reading. I understand that this task is very big, but I hope that I 
will be able to make interesting things during this summer and that it will 
help Mesa to catch up on OpenGL. I will now continue to read the Gallium 
interfaces code and the OpenGL spec. I'm open to any question or remark.

Best regards,
Denis Steckelmacher.


More information about the mesa-dev mailing list