The Mesa 3D Graphics Library

Shading Language Support

This page describes the features and status of Mesa's support for the OpenGL Shading Language.

Contents

Environment Variables

The MESA_GLSL environment variable can be set to a comma-separated list of keywords to control some aspects of the GLSL compiler and shader execution. These are generally used for debugging.

Example: export MESA_GLSL=dump,nopt

Shaders can be dumped and replaced on runtime for debugging purposes. Mesa needs to be configured with '--with-sha1' to enable this functionality. This feature is not currently supported by SCons build. This is controlled via following environment variables:

Note, path set must exist before running for dumping or replacing to work. When both are set, these paths should be different so the dumped shaders do not clobber the replacement shaders.

GLSL Version

The GLSL compiler currently supports version 3.30 of the shading language.

Several GLSL extensions are also supported:

Unsupported Features

XXX update this section

The following features of the shading language are not yet fully supported in Mesa:

All other major features of the shading language should function.

Implementation Notes

These issues will be addressed/resolved in the future.

Programming Hints

Stand-alone GLSL Compiler

The stand-alone GLSL compiler program can be used to compile GLSL shaders into low-level GPU code.

This tool is useful for:

After building Mesa, the compiler can be found at src/glsl/glsl_compiler

Here's an example of using the compiler to compile a vertex shader and emit GL_ARB_vertex_program-style instructions:

    src/glsl/glsl_compiler --dump-ast myshader.vert
Options include

Compiler Implementation

The source code for Mesa's shading language compiler is in the src/glsl/ directory.

XXX provide some info about the compiler....

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).

Code Generation Options

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;
};
EmitHighLevelInstructions
This option controls instruction selection for loops and conditionals. If the option is set high-level IF/ELSE/ENDIF, LOOP/ENDLOOP, CONT/BRK instructions will be emitted. Otherwise, those constructs will be implemented with BRA instructions.
EmitCondCodes
If set, condition codes (ala GL_NV_fragment_program) will be used for branching and looping. Otherwise, ordinary registers will be used (the IF instruction will examine the first operand's X component and do the if-part if non-zero). This option is only relevant if EmitHighLevelInstructions is set.
EmitComments
If set, instructions will be annotated with comments to help with debugging. Extra NOP instructions will also be inserted.

Compiler Validation

Developers working on the GLSL compiler should test frequently to avoid regressions.

The Piglit project has many GLSL tests.

The Mesa demos repository also has some good GLSL tests.