This page describes the features and status of Mesa's support for the OpenGL Shading Language.
Last updated on 28 March 2007.
Contents
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:
After building Mesa, the glslcompiler can be built by manually running:
cd src/mesa/drivers/glslcompiler make
Here's an example of using the compiler to compile a vertex shader and emit GL_ARB_vertex_program-style instructions:
bin/glslcompiler --debug --numbers --fs progs/glsl/CH06-brick.frag.txt
results in:
# Fragment Program/Shader 0: RCP TEMP[4].x, UNIFORM[2].xxxx; 1: RCP TEMP[4].y, UNIFORM[2].yyyy; 2: MUL TEMP[3].xy, VARYING[0], TEMP[4]; 3: MOV TEMP[1], TEMP[3]; 4: MUL TEMP[0].w, TEMP[1].yyyy, CONST[4].xxxx; 5: FRC TEMP[1].z, TEMP[0].wwww; 6: SGT.C TEMP[0].w, TEMP[1].zzzz, CONST[4].xxxx; 7: IF (NE.wwww); # (if false, goto 9); 8: ADD TEMP[1].x, TEMP[1].xxxx, CONST[4].xxxx; 9: ENDIF; 10: FRC TEMP[1].xy, TEMP[1]; 11: SGT TEMP[2].xy, UNIFORM[3], TEMP[1]; 12: MUL TEMP[1].z, TEMP[2].xxxx, TEMP[2].yyyy; 13: LRP TEMP[0], TEMP[1].zzzz, UNIFORM[0], UNIFORM[1]; 14: MUL TEMP[0].xyz, TEMP[0], VARYING[1].xxxx; 15: MOV OUTPUT[0].xyz, TEMP[0]; 16: MOV OUTPUT[0].w, CONST[4].yyyy; 17: 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 new Glean test has been create to exercise the GLSL compiler.
The glsl1 test runs over 150 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.