This page describes the features and status of Mesa's support for the OpenGL Shading Language.
Last updated on 15 December 2008.
Contents
GLSL version 1.20 is supported in Mesa 7.3. Among the features/differences of GLSL 1.20 are:
mat2x3, mat2x4
, etc. types and functions
transpose(), outerProduct(), matrixCompMult()
functions
(but untested)
invariant
qualifier
array.length()
method
float[5] a;
array syntax
centroid
qualifier
The following features of the shading language are not yet supported in Mesa:
All other major features of the shading language should function.
These issues will be addressed/resolved in the future.
void main() { vec4 a1, a2, b1, b2; gl_Position = expression using a1, a2. gl_Color = expression using b1, b2; }Can be rewritten as follows to use half as many registers:
void main() { { vec4 a1, a2; gl_Position = expression using a1, a2. } { vec4 b1, b2; gl_Color = expression using b1, b2; } }Alternately, rather than using several float variables, use a vec4 instead. Use swizzling and writemasks to access the components of the vec4 as floats.
float x = 1.0 / sqrt(y);Write this:
float x = inversesqrt(y);
A unique stand-alone GLSL compiler driver has been added to Mesa.
The stand-alone compiler (like a conventional command-line compiler) is a tool that accepts Shading Language programs and emits low-level GPU programs.
This tool is useful for:
To build the glslcompiler program (this will be improved someday):
cd src/mesa make libmesa.a cd drivers/glslcompiler make
Here's an example of using the compiler to compile a vertex shader and emit GL_ARB_vertex_program-style instructions:
glslcompiler --arb --linenumbers --vs vertshader.txt
The output may look similar to this:
!!ARBvp1.0 0: MOV result.texcoord[0], vertex.texcoord[0]; 1: DP4 temp0.x, state.matrix.mvp.row[0], vertex.position; 2: DP4 temp0.y, state.matrix.mvp.row[1], vertex.position; 3: DP4 temp0.z, state.matrix.mvp.row[2], vertex.position; 4: DP4 temp0.w, state.matrix.mvp.row[3], vertex.position; 5: MOV result.position, temp0; 6: END
Note that some shading language constructs (such as uniform and varying variables) aren't expressible in ARB or NV-style programs. Therefore, the resulting output is not always legal by definition of those program languages.
Also note that this compiler driver is still under development. Over time, the correctness of the GPU programs, with respect to the ARB and NV languagues, should improve.
The source code for Mesa's shading language compiler is in the
src/mesa/shader/slang/
directory.
The compiler follows a fairly standard design and basically works as follows:
The final vertex and fragment programs may be interpreted in software (see prog_execute.c) or translated into a specific hardware architecture (see drivers/dri/i915/i915_fragprog.c for example).
Internally, there are several options that control the compiler's code generation and instruction selection. These options are seen in the gl_shader_state struct and may be set by the device driver to indicate its preferences:
struct gl_shader_state { ... /** Driver-selectable options: */ GLboolean EmitHighLevelInstructions; GLboolean EmitCondCodes; GLboolean EmitComments; };
A Glean test has been create to exercise the GLSL compiler.
The glsl1 test runs over 170 sub-tests to check that the language features and built-in functions work properly. This test should be run frequently while working on the compiler to catch regressions.
The test coverage is reasonably broad and complete but additional tests should be added.