Home | History | Annotate | Download | only in docs
      1 <HTML>
      2 
      3 <TITLE>Shading Language Support</TITLE>
      4 
      5 <link rel="stylesheet" type="text/css" href="mesa.css"></head>
      6 
      7 <BODY>
      8 
      9 <H1>Shading Language Support</H1>
     10 
     11 <p>
     12 This page describes the features and status of Mesa's support for the
     13 <a href="http://opengl.org/documentation/glsl/" target="_parent">
     14 OpenGL Shading Language</a>.
     15 </p>
     16 
     17 <p>
     18 Contents
     19 </p>
     20 <ul>
     21 <li><a href="#envvars">Environment variables</a>
     22 <li><a href="#120">GLSL 1.20 support</a>
     23 <li><a href="#unsup">Unsupported Features</a>
     24 <li><a href="#notes">Implementation Notes</a>
     25 <li><a href="#hints">Programming Hints</a>
     26 <li><a href="#standalone">Stand-alone GLSL Compiler</a>
     27 <li><a href="#implementation">Compiler Implementation</a>
     28 <li><a href="#validation">Compiler Validation</a>
     29 </ul>
     30 
     31 
     32 
     33 <a name="envvars">
     34 <h2>Environment Variables</h2>
     35 
     36 <p>
     37 The <b>MESA_GLSL</b> environment variable can be set to a comma-separated
     38 list of keywords to control some aspects of the GLSL compiler and shader
     39 execution.  These are generally used for debugging.
     40 </p>
     41 <ul>
     42 <li><b>dump</b> - print GLSL shader code to stdout at link time
     43 <li><b>log</b> - log all GLSL shaders to files.
     44     The filenames will be "shader_X.vert" or "shader_X.frag" where X
     45     the shader ID.
     46 <li><b>nopt</b> - disable compiler optimizations
     47 <li><b>opt</b> - force compiler optimizations
     48 <li><b>uniform</b> - print message to stdout when glUniform is called
     49 <li><b>nopvert</b> - force vertex shaders to be a simple shader that just transforms
     50     the vertex position with ftransform() and passes through the color and
     51     texcoord[0] attributes.
     52 <li><b>nopfrag</b> - force fragment shader to be a simple shader that passes
     53     through the color attribute.
     54 <li><b>useprog</b> - log glUseProgram calls to stderr
     55 </ul>
     56 <p>
     57 Example:  export MESA_GLSL=dump,nopt
     58 </p>
     59 
     60 
     61 <a name="120">
     62 <h2>GLSL Version</h2>
     63 
     64 <p>
     65 The GLSL compiler currently supports version 1.20 of the shading language.
     66 </p>
     67 
     68 <p>
     69 Several GLSL extensions are also supported:
     70 </p>
     71 <ul>
     72 <li>GL_ARB_draw_buffers
     73 <li>GL_ARB_texture_rectangle
     74 <li>GL_ARB_fragment_coord_conventions
     75 <li>GL_EXT_texture_array
     76 </ul>
     77 
     78 
     79 <a name="unsup">
     80 <h2>Unsupported Features</h2>
     81 
     82 <p>XXX update this section</p>
     83 
     84 <p>
     85 The following features of the shading language are not yet fully supported
     86 in Mesa:
     87 </p>
     88 
     89 <ul>
     90 <li>Linking of multiple shaders does not always work.  Currently, linking
     91     is implemented through shader concatenation and re-compiling.  This
     92     doesn't always work because of some #pragma and preprocessor issues.
     93 <li>gl_ClipVertex
     94 <li>The gl_Color and gl_SecondaryColor varying vars are interpolated
     95     without perspective correction
     96 </ul>
     97 
     98 <p>
     99 All other major features of the shading language should function.
    100 </p>
    101 
    102 
    103 <a name="notes">
    104 <h2>Implementation Notes</h2>
    105 
    106 <ul>
    107 <li>Shading language programs are compiled into low-level programs
    108     very similar to those of GL_ARB_vertex/fragment_program.
    109 <li>All vector types (vec2, vec3, vec4, bvec2, etc) currently occupy full
    110     float[4] registers.
    111 <li>Float constants and variables are packed so that up to four floats
    112     can occupy one program parameter/register.
    113 <li>All function calls are inlined.
    114 <li>Shaders which use too many registers will not compile.
    115 <li>The quality of generated code is pretty good, register usage is fair.
    116 <li>Shader error detection and reporting of errors (InfoLog) is not
    117     very good yet.
    118 <li>The ftransform() function doesn't necessarily match the results of
    119     fixed-function transformation.
    120 </ul>
    121 
    122 <p>
    123 These issues will be addressed/resolved in the future.
    124 </p>
    125 
    126 
    127 <a name="hints">
    128 <h2>Programming Hints</h2>
    129 
    130 <ul>
    131 <li>Use the built-in library functions whenever possible.
    132     For example, instead of writing this:
    133 <pre>
    134         float x = 1.0 / sqrt(y);
    135 </pre>
    136     Write this:
    137 <pre>
    138         float x = inversesqrt(y);
    139 </pre>
    140 </li>
    141 </ul>
    142 
    143 
    144 <a name="standalone">
    145 <h2>Stand-alone GLSL Compiler</h2>
    146 
    147 <p>
    148 The stand-alone GLSL compiler program can be used to compile GLSL shaders
    149 into low-level GPU code.
    150 </p>
    151 
    152 <p>
    153 This tool is useful for:
    154 <p>
    155 <ul>
    156 <li>Inspecting GPU code to gain insight into compilation
    157 <li>Generating initial GPU code for subsequent hand-tuning
    158 <li>Debugging the GLSL compiler itself
    159 </ul>
    160 
    161 <p>
    162 After building Mesa, the compiler can be found at src/glsl/glsl_compiler
    163 </p>
    164 
    165 <p>
    166 Here's an example of using the compiler to compile a vertex shader and
    167 emit GL_ARB_vertex_program-style instructions:
    168 </p>
    169 <pre>
    170     src/glsl/glslcompiler --dump-ast myshader.vert
    171 </pre>
    172 
    173 Options include
    174 <ul>
    175 <li><b>--dump-ast</b> - dump GPU code
    176 <li><b>--dump-hir</b> - dump high-level IR code
    177 <li><b>--dump-lir</b> - dump low-level IR code
    178 <li><b>--link</b> - ???
    179 </ul>
    180 
    181 
    182 
    183 
    184 <a name="implementation">
    185 <h2>Compiler Implementation</h2>
    186 
    187 <p>
    188 The source code for Mesa's shading language compiler is in the
    189 <code>src/glsl/</code> directory.
    190 </p>
    191 
    192 <p>
    193 XXX provide some info about the compiler....
    194 </p>
    195 
    196 <p>
    197 The final vertex and fragment programs may be interpreted in software
    198 (see prog_execute.c) or translated into a specific hardware architecture
    199 (see drivers/dri/i915/i915_fragprog.c for example).
    200 </p>
    201 
    202 <h3>Code Generation Options</h3>
    203 
    204 <p>
    205 Internally, there are several options that control the compiler's code
    206 generation and instruction selection.
    207 These options are seen in the gl_shader_state struct and may be set
    208 by the device driver to indicate its preferences:
    209 
    210 <pre>
    211 struct gl_shader_state
    212 {
    213    ...
    214    /** Driver-selectable options: */
    215    GLboolean EmitHighLevelInstructions;
    216    GLboolean EmitCondCodes;
    217    GLboolean EmitComments;
    218 };
    219 </pre>
    220 
    221 <ul>
    222 <li>EmitHighLevelInstructions
    223 <br>
    224 This option controls instruction selection for loops and conditionals.
    225 If the option is set high-level IF/ELSE/ENDIF, LOOP/ENDLOOP, CONT/BRK
    226 instructions will be emitted.
    227 Otherwise, those constructs will be implemented with BRA instructions.
    228 </li>
    229 
    230 <li>EmitCondCodes
    231 <br>
    232 If set, condition codes (ala GL_NV_fragment_program) will be used for
    233 branching and looping.
    234 Otherwise, ordinary registers will be used (the IF instruction will
    235 examine the first operand's X component and do the if-part if non-zero).
    236 This option is only relevant if EmitHighLevelInstructions is set.
    237 </li>
    238 
    239 <li>EmitComments
    240 <br>
    241 If set, instructions will be annoted with comments to help with debugging.
    242 Extra NOP instructions will also be inserted.
    243 </br>
    244 
    245 </ul>
    246 
    247 
    248 <a name="validation">
    249 <h2>Compiler Validation</h2>
    250 
    251 <p>
    252 Developers working on the GLSL compiler should test frequently to avoid
    253 regressions.
    254 </p>
    255 
    256 <p>
    257 The <a href="http://people.freedesktop.org/~nh/piglit/">Piglit</a> project
    258 has many GLSL tests and the
    259 <a href="http://glean.sf.net" target="_parent">Glean</a> glsl1 test 
    260 tests GLSL features.
    261 </p>
    262 
    263 <p>
    264 The Mesa demos repository also has some good GLSL tests.
    265 </p>
    266 
    267 </BODY>
    268 </HTML>
    269