• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    ARB_fragment_program
4
5Name Strings
6
7    GL_ARB_fragment_program
8
9Contributors
10
11    Bob Beretta
12    Pat Brown
13    Matt Craighead
14    Cass Everitt
15    Evan Hart
16    Jon Leech
17    Bill Licea-Kane
18    Bimal Poddar
19    Jeremy Sandmel
20    Jon Paul Schelter
21    Avinash Seetharamaiah
22    Nick Triantos
23
24    and contributors to the ARB_vertex_program working group,
25    the product of which provided the basis for this spec
26
27Contact
28
29    Benj Lipchak, AMD (benj.lipchak 'at' amd.com)
30
31Notice
32
33    Copyright (c) 2002-2013 The Khronos Group Inc. Copyright terms at
34        http://www.khronos.org/registry/speccopyright.html
35
36Specification Update Policy
37
38    Khronos-approved extension specifications are updated in response to
39    issues and bugs prioritized by the Khronos OpenGL Working Group. For
40    extensions which have been promoted to a core Specification, fixes will
41    first appear in the latest version of that core Specification, and will
42    eventually be backported to the extension document. This policy is
43    described in more detail at
44        https://www.khronos.org/registry/OpenGL/docs/update_policy.php
45
46IP Status
47
48    Microsoft claims to own intellectual property related to this
49    extension.
50
51Status
52
53    Complete.  Approved by ARB on September 18, 2002
54
55Version
56
57    Last Modified Date: October 8, 2013
58    Revision: 28
59
60Number
61
62    ARB Extension #27
63
64Dependencies
65
66    The extension is written against the OpenGL 1.3 Specification.
67
68    OpenGL 1.3 is required.
69
70    EXT_texture_lod_bias or OpenGL 1.4 is required.
71
72    OpenGL 1.4 affects the definition of this extension.
73
74    ARB_vertex_blend and EXT_vertex_weighting affect the definition of
75    this extension.
76
77    ARB_matrix_palette affects the definition of this extension.
78
79    ARB_transpose_matrix affects the definition of this extension.
80
81    EXT_fog_coord affects the definition of this extension.
82
83    EXT_texture_rectangle affects the definition of this extension.
84
85    ARB_shadow interacts with this extension.
86
87    ARB_vertex_program interacts with this extension.
88
89    ATI_fragment_shader interacts with this extension.
90
91    NV_fragment_program interacts with this extension.
92
93
94Overview
95
96    Unextended OpenGL mandates a certain set of configurable per-
97    fragment computations defining texture application, texture
98    environment, color sum, and fog operations.  Several extensions have
99    added further per-fragment computations to OpenGL.  For example,
100    extensions have defined new texture environment capabilities
101    (ARB_texture_env_add, ARB_texture_env_combine, ARB_texture_env_dot3,
102    ARB_texture_env_crossbar), per-fragment depth comparisons
103    (ARB_depth_texture, ARB_shadow, ARB_shadow_ambient,
104    EXT_shadow_funcs), per-fragment lighting (EXT_fragment_lighting,
105    EXT_light_texture), and environment mapped bump mapping
106    (ATI_envmap_bumpmap).
107
108    Each such extension adds a small set of relatively inflexible per-
109    fragment computations.
110
111    This inflexibility is in contrast to the typical flexibility
112    provided by the underlying programmable floating point engines
113    (whether micro-coded fragment engines, DSPs, or CPUs) that are
114    traditionally used to implement OpenGL's texturing computations.
115    The purpose of this extension is to expose to the OpenGL application
116    writer a significant degree of per-fragment programmability for
117    computing fragment parameters.
118
119    For the purposes of discussing this extension, a fragment program is
120    a sequence of floating-point 4-component vector operations that
121    determines how a set of program parameters (not specific to an
122    individual fragment) and an input set of per-fragment parameters are
123    transformed to a set of per-fragment result parameters.
124
125    The per-fragment computations for standard OpenGL given a particular
126    set of texture and fog application modes (along with any state for
127    extensions defining per-fragment computations) is, in essence, a
128    fragment program.  However, the sequence of operations is defined
129    implicitly by the current OpenGL state settings rather than defined
130    explicitly as a sequence of instructions.
131
132    This extension provides an explicit mechanism for defining fragment
133    program instruction sequences for application-defined fragment
134    programs.  In order to define such fragment programs, this extension
135    defines a fragment programming model including a floating-point
136    4-component vector instruction set and a relatively large set of
137    floating-point 4-component registers.
138
139    The extension's fragment programming model is designed for efficient
140    hardware implementation and to support a wide variety of fragment
141    programs.  By design, the entire set of existing fragment programs
142    defined by existing OpenGL per-fragment computation extensions can
143    be implemented using the extension's fragment programming model.
144
145Issues
146
147    This extension is closely related to ARB_vertex_program, and is in
148    sync with revision 36 of that spec.  ARB_fragment_program will
149    continue to track changes made to ARB_vertex_program.
150
151    (1) Should we provide precision queries?
152
153      RESOLVED: We've decided not to include precision queries.
154      Implementations are expected to meet or exceed the precision
155      guidelines set forth in the core GL spec, section 2.1.1, p. 6,
156      as ammended by this extension.
157
158      To summarize section 2.1.1, the maximum representable magnitude of
159      colors must be at least 2^10, while the maximum representable
160      magnitude of other floating-point values must be at least 2^32.
161      The individual results of floating-point operations must be
162      accurate to about 1 part in 10^5.
163
164      Here are the reasons why precision queries were not included:
165        1. It is unclear what the queries should be:
166           a) min, max, [0,1) granularity
167           b) min +, max +, min -, max -, [0,1) granularity
168           c) IEEE mantissa bits, IEEE exponent bits
169        2. Due to instruction emulation, there is no way to query the
170           actual precision that can be expected.  Should the query
171           return the best-case or worst-case precision?
172        3. Implementations may support multiple precisions, on a per-
173           instruction basis or across the board.  How would this be
174           exposed?
175        4. Current implementations are able to meet the minimum
176           requirements specified in the core GL, thanks to its
177           sufficiently loose wording "... so that the individual
178           results of floating-point operations are accurate to ABOUT
179           1 part in 10^5."  (Emphasis added.)
180        5. A conformance test can act as watchdog to ensure
181           implementations are not cutting corners on precision.
182        6. Adding precision queries would require a new entrypoint.
183
184      See issue 22 regarding reduced-precision modes.
185
186    (2) Should the LOD biased texture sample be optional?
187
188      RESOLVED: TXB support is mandatory.  This exposes useful
189      functionality which enables blurring and sharpening effects.  It
190      will be more useful to entirely override derivatives (scale
191      factor) rather than just biasing the level-of-detail.  This would
192      be a future extension to fragment programs.
193
194      It should be noted here that the bias introduced per-fragment by
195      TXB is added to any per-object or per-stage LOD bias.  If per-
196      fragment LOD bias is not necessary, using the per-object and/or
197      per-stage LOD biases may perform better.
198
199    (3) Should we include the ability to bind to the color matrix?  How
200    about others?  Program matrices?
201
202      RESOLVED: We will not specifically add anything that depends on
203      the ARB_imaging subset.  So we have not included matrix bindings
204      to the color matrix (or parameter bindings to the color biases,
205      etc.).  However, we have included matrix binding support and
206      support for all of the matrices present in ARB_vertex_program.
207
208    (4) Should we include the ability to bind to just a texcoord
209    attribute's S,T components?  (Or just S, or S,T,P for that matter?)
210
211      RESOLVED: No.  Issue #15 below obviates this issue by making the
212      texture coordinate usage within a program explicit, thereby making
213      optimizations to reduce the number of interpolated texture
214      coordinates something an implementation can do at compile time
215      instead of having to do it during every texture target change.
216
217    (5) What other instructions should be added?  Should any be removed?
218
219      RESOLVED: The differences between the ARB_vertex_program
220      instruction set and the ARB_fragment_program instruction set are
221      minimal.  ARB_fragment_program removes the LOG and EXP rough
222      approximation instructions and the ARL address register load
223      instruction.  ARB_fragment_program adds the SIN/COS/SCS
224      trigonometric instructions, the LRP linear interpolation
225      instruction, the CMP compare instruction, and the TEX/TXP/TXB/KIL
226      texture instructions.
227
228    (6) Should depth output be a program option or a mandatory feature?
229
230      RESOLVED: Depth output capability should be mandatory.
231
232    (6a) How should per-vertex geometric depth clipping be handled when
233      replacing depth in a fragment program?
234
235      RESOLVED: Per-vertex geometric depth clipping should be performed
236      by the GL as usual, so no spec change is required.  The ideal
237      behavior would be to disable near and far clipping planes when
238      replacing depth, but not all implementations can natively support
239      disabling individual clip planes.
240
241    (6b) How should depth output from the fragment program be further
242    processed before being handed to the per-fragment operations?
243
244      RESOLVED: Depth gets clamped by GL to [0,1].  App has access to
245      depth range as a bindable parameter if it wants to either scale
246      and bias its depth to fall within the depth range, or to kill
247      fragments outside the depth range.
248
249    (7) If a fragment program does not write a color value, what should
250    be the final color of the fragment?
251
252      RESOLVED: The final fragment color is undefined.  Note that it may
253      be perfectly reasonable to have a program that computes depth
254      values but not colors.  Fragment colors are often irrelevant if
255      color writes are disabled (via ColorMask).
256
257    (7a) If a fragment program does not write a depth value, what should
258    be the final depth value of the fragment?
259
260      RESOLVED: "Depth fly-over" (using the conventional depth produced
261      by rasterization) should happen whenever a depth-replacing program
262      is not in use.  A depth-replacing program is defined as a program
263      that writes to result.depth in at least one instruction.  The
264      presence of a depth declaration alone DOES NOT designate a depth-
265      replacing program.  The intention is that a future extension
266      introducing conditional execution will still consider a program to
267      be depth-replacing even if the instruction(s) writing to
268      result.depth do(es) not execute.
269
270      Other considered definitions of depth-replacing program:
271        1. The presence of a depth declaration -OR- the use of
272           result.depth as an instruction destination anywhere in the
273           program designates a depth-replacing program.
274        2. Every program is a depth-replacing program, but the GL
275           initializes the depth output to be the depth produced by
276           rasterization.  The app may then overwrite the depth output.
277        3. Every program is a depth-replacing program, and the app is
278           solely responsible for copying the depth input to depth
279           output if desired.
280
281    (8) Should relative addressing, like that defined in
282    ARB_vertex_program, be supported in this spec?
283
284      RESOLVED: No, relative addressing won't be included in this spec.
285
286    (9) Should full-featured operand component swizzling, like that
287    defined in ARB_vertex_program, be supported in this spec?
288
289      RESOLVED: Yes, full swizzling is mandatory.
290
291    (10) Should texture instructions contain specific limitations on
292    operations that can be performed?  For example, should write masks
293    or operand component swizzling be disallowed?
294
295      RESOLVED: Texture instructions are specified to be very similar to
296      ALU instructions.  They have been given 3-letter names, they allow
297      writemasking and saturation (which would be useful for floating-
298      point texture formats), source swizzles and negates, and the
299      ability to use parameters as sources.
300
301    (11) Should we standardize options for stencil or aux data buffer
302    outputs?
303
304      RESOLVED: Stencil and aux data buffers will be saved for a
305      possible future extension to fragment programs.
306
307    (12) Should depth output be pulled from the 3rd or 4th component?
308
309      RESOLVED: 3rd component, as the 3rd component is also used for
310      depth input from the "fragment.position" attribute.
311
312    (13) Which stages are subsumed by fragment programs?
313
314      RESOLVED: Texturing, color sum, and fog.
315
316    (14) What should the minimum resource limits be?
317
318      RESOLVED: 10 attributes, 24 parameters, 4 texture indirections,
319      48 ALU instructions, 24 texture instructions, and 16 temporaries.
320
321    (15) OpenGL provides a hierarchy of texture enables (cube map, 3D,
322    2D, 1D).  Should the texture sampling instructions here override
323    that hierarchy and select specific texture targets?
324
325      RESOLVED: Yes.  This removes a potential pitfall for developers:
326      leaving the hierarchy of enables in an undesired state.  It makes
327      programs more readable as the intent of the sample is more
328      obvious.  Finally, it allows compilers to be more aggressive as
329      to which texcoord components are "don't cares" without having to
330      recompile programs when fixed-function texenables change.  One
331      drawback is that programs cannot be reused for both 2D and 3D
332      texturing, for example, by simply changing the texture enables.
333
334      Texture sampling can be specified by instructions like
335
336        TEX myTexel, fragment.texcoord[1], texture[2], 3D;
337
338      which would indicate to use texture coordinate set number 1 to
339      sample from the texture object bound to the TEXTURE_3D target on
340      texture image unit 2.
341
342      Each texture unit can have only one "active" target.  Programs are
343      not allowed to reference different texture targets in the same
344      texture image unit.  In the example above, any other texture
345      instructions using texture image unit 2 must specify the 3D
346      texture target.
347
348      Note that every texture image unit always has a texture bound to
349      every texture target, whether it is a named texture object or a
350      default texture.  However, the texture may not be complete as
351      defined in section 3.8.9 of the core GL spec.  See issue 23.
352
353    (16) Should aux texture units be additional units on top of existing
354    full-featured texture units, or should this spec fully deprecate
355    "legacy" texture units and only expose texture coordinate sets and
356    texture image units?
357
358      Background: Some implementations are able to expose more
359      "texture image units" (texture maps and associated parameters)
360      than "texture coordinate sets" (current texcoords, texgen, and
361      texture matrices).  A conventional GL "texture unit" encompasses
362      both a texture image unit and a texture coordinate set as well as
363      texture environment state.
364
365      RESOLVED: Yes, deprecate "legacy" texture units.  This is a more
366      flexible model.
367
368    (17) Should fragment programs affect all fragments, or just those
369    produced by the rasterization of points, lines, and triangles?
370
371      RESOLVED: Every fragment generated by the GL is subject to
372      fragment program mode.  This includes point, line, and polygon
373      primitives as well as pixel rectangles and bitmaps.
374
375    (18) Should per-fragment position and fogcoord be bindable as
376    fragment attributes?
377
378      RESOLVED: Yes, interpolated fogcoord will make per-fragment
379      fog application possible, in addition to full fog stage
380      subsummation.  Interpolated window position, especially depth,
381      enables interesting depth-replacing algorithms.
382
383    (19) What characters should be used to identify individual
384    components in swizzle selectors and write masks?
385
386      RESOLVED: ARB_vertex_program provides "xyzw".  This extension
387      supports "xyzw" and also provides "rgba" for better readability
388      when dealing with RGBA color values.  Adding support for special
389      identifiers for dealing with texture coordinates was considered
390      and rejected.  "strq" could be used to identify texture coordinate
391      components, but the "r" would conflict with the "r" from "rgba".
392      "stpq" would be another possibility, but could be a source of
393      confusion.
394
395    (20) Should implementations be required to support all programs that
396    fit within the exported limits on the number of resources (e.g.,
397    instructions, temporaries) that can be present in a program, even if
398    it means falling back to software?  Should implementations be
399    required to reject programs that could never be accelerated?
400
401      RESOLVED: No and no.  An implementation is allowed to fail
402      ProgramStringARB due to the program exceeding native resources.
403      Note that this failure must be invariant with respect to all other
404      OpenGL state.  In other words, a program cannot succeed to load
405      with default state, but then fail to load when certain GL state
406      is altered.  However, an implementation is not required to fail
407      when a program would exceed native resources, and is in fact
408      encouraged to fallback to a software path.  See issue 21 for a way
409      of determining if this has happened.
410
411      This notable departure from ARB_vertex_program was made as an
412      accommodation to vendors who could not justify implementing a
413      software fallback path which would be relatively slow even
414      compared to an ARB_vertex_program software fallback path.
415
416      Two issues with this decision:
417        1.  The API limits become hints, and one can no longer tell by
418            visual inspection whether or not a program will load on
419            every implementation.
420        2.  Program loading will now depend on the optimizer, which may
421            vary from release to release of an implementation.  A
422            program that succeeded to load when an ISV first wrote it
423            may fail to load in a future driver version, and vice versa.
424
425    (21) How can applications determine if their programs are too large
426    to run on the native (likely hardware) implementation, and therefore may
427    run with reduced performance?
428
429      RESOLVED: The following code snippet uses a native resource
430      query to guarantee a program is loaded natively (or not at all):
431
432      GLboolean ProgramStringIsNative(GLenum target, GLenum format,
433                                     GLsizei len, const void *string)
434      {
435          GLint errorPos, isNative;
436          glProgramStringARB(target, format, len, string);
437          glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
438          glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB,
439              GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &isNative);
440          if ((errorPos == -1) && (isNative == 1))
441              return GL_TRUE;
442          else
443              return GL_FALSE;
444      }
445
446      Note that a program that successfully loads, and falls under the
447      native limits, is still not guaranteed to execute in hardware.
448      Lack of other resources (e.g., texture memory) or the use of other
449      OpenGL features not natively supported by the implementation
450      (e.g., textures with borders) may also prevent the program from
451      executing in hardware.
452
453    (22) Should we provide applications with a method to control the
454    level of precision used to carry out fragment program computations?
455
456      RESOLVED:  Yes.  The GL implementation ultimately has control over
457      the level of precision used for fragment program computations.
458      However, the "ARB_precision_hint_fastest" and
459      "ARB_precision_hint_nicest" program options allow applications to
460      guide the GL implementation in its precision selection.  The
461      "fastest" option encourages the GL to minimize execution time,
462      with possibly reduced precision.  The "nicest" option encourages
463      the GL to maximize precision, with possibly increased execution
464      time.
465
466      If the precision hint is not "fastest", GL implementations should
467      perform low-precision operations only if they could not
468      appreciably affect the final results of the program.  Regardless
469      of the precision hint, GL implementations are discouraged from
470      reducing the precision of computations so aggressively that final
471      rendering results could be seriously compromised due to overflow
472      of intermediate values or insufficient number of mantissa bits.
473
474      Some implementations may provide only a single level of precision,
475      in which case these hints may have no effect.  However, all
476      implementations will accept these options, even if they are
477      silently ignored.
478
479      More explicit control of precision, such as provided in "C" with
480      data types such as "short", "int", "float", "double", may also be
481      a desirable feature, but this level of detail is left to a
482      separate extension.
483
484    (23) What is the result of a sample from an incomplete texture?
485    The definition of texture completeness can be found in section 3.8.9
486    of the core GL spec.
487
488      RESOLVED: The result of a sample from an incomplete texture is the
489      constant vector (0,0,0,1).  The benefit of defining the result to
490      be a constant is that broken apps are guaranteed to generate
491      unexpected (black) results from their bad samples.  If we were to
492      leave the result undefined, some implementations may generate
493      expected results some of the time, for example when magfiltering,
494      giving app developers a false sense of correctness in their apps.
495
496    (24) What is a texture indirection, and how is it counted?
497
498       RESOLVED: On some implementations, fragment programs that have
499       complex texture dependency chains may not be supported, even if
500       the instruction counts fit within the exported limits.  A texture
501       dependency occurs when a texture instruction depends on the
502       result of a previous instruction (ALU or texture) for use as its
503       texture coordinate.
504
505       A texture indirection can be considered a node in the texture
506       dependency chain.  Each node contains a set of texture
507       instructions which execute in parallel, followed by a sequence of
508       ALU instructions.  A dependent texture instruction is one that
509       uses a temporary as an input coordinate rather than an attribute
510       or a parameter.  A program with no dependent texture instructions
511       (or no texture instructions at all) will have a single node in
512       its texture dependency chain, and thus a single indirection.
513
514       API-level texture indirections are counted by keeping track of
515       which temporaries are read and written within the current node in
516       the texture dependency chain.  When a texture instruction is
517       encountered, an indirection may be added and a new node started
518       if either of the following two conditions is true:
519
520         1. the source coordinate of the texture instruction is a
521            temporary that has already been written in the current node,
522            either by a previous texture instruction or ALU instruction;
523
524         2. the result of the texture instruction is a temporary that
525            has already been read or written in the current node by an
526            ALU instruction.
527
528       The texture instruction provoking a new indirection and all
529       subsequent instructions are added to the new node.  This process
530       is repeated until the end of the program is encountered.  Below
531       is some pseudo-code to describe this:
532
533         indirections = 1;
534         tempsOutput = 0;
535         aluTemps = 0;
536         while (i = getInst())
537         {
538           if (i.type == TEX)
539           {
540             if (((i.input.type == TEMP) &&
541                   (tempsOutput & (1 << i.input.index))) ||
542                 ((i.op != KILL) && (i.output.type == TEMP) &&
543                   (aluTemps & (1 << i.output.index))))
544             {
545               indirections++;
546               tempsOutput = 0;
547               aluTemps = 0;
548             }
549           } else {
550             if (i.input1.type == TEMP)
551               aluTemps |= (1 << i.input1.index);
552             if (i.input2 && i.input2.type == TEMP)
553               aluTemps |= (1 << i.input2.index);
554             if (i.input3 && i.input3.type == TEMP)
555               aluTemps |= (1 << i.input3.index);
556             if (i.output.type == TEMP)
557               aluTemps |= (1 << i.output.index);
558           }
559           if ((i.op != KILL) && (i.output.type == TEMP))
560             tempsOutput |= (1 << i.output.index);
561         }
562
563       For example, the following programs would have 1, 2, and 3
564       texture indirections, respectively:
565
566         !!ARBfp1.0
567         # No texture instructions, but always 1 indirection
568         MOV result.color, fragment.color;
569         END
570
571         !!ARBfp1.0
572         # A simple dependent texture instruction, 2 indirections
573         TEMP myColor;
574         MUL myColor, fragment.texcoord[0], fragment.texcoord[1];
575         TEX result.color, myColor, texture[0], 2D;
576         END
577
578         !!ARBfp1.0
579         # A more complex example with 3 indirections
580         TEMP myColor1, myColor2;
581         TEX myColor1, fragment.texcoord[0], texture[0], 2D;
582         MUL myColor1, myColor1, myColor1;
583         TEX myColor2, fragment.texcoord[1], texture[1], 2D;
584         # so far we still only have 1 indirection
585         TEX myColor2, myColor1, texture[2], 2D;      # This is #2
586         TEX result.color, myColor2, texture[3], 2D;  # And #3
587         END
588
589       Note that writemasks for the temporaries written and swizzles
590       for the temporaries read are not taken into consideration when
591       counting indirections.  This makes hand-counting of indirections
592       by a developer an easier task.
593
594       Native texture indirections may be counted differently by an
595       implementation to reflect its exact restrictions, to reflect the
596       true dependencies taking into account writemasks and swizzles,
597       and to reflect optimizations such as instruction reordering.
598
599       For implementations with no restrictions on the number of
600       indirections, the maximum indirection count will equal the
601       maximum texture instruction count.
602
603    (25) How can a program reduce SCS's scalar operand to the
604    fundamental period [-PI,PI]?
605
606       RESOLVED: Unlike the individual SIN and COS instructions, SCS
607       requires that its argument be reduced ahead of time to the
608       fundamental period.  The reason SCS doesn't perform this
609       operation automatically is that it may make unnecessary redundant
610       work for programs that already have their operand in the correct
611       range.  Other programs that do need to reduce their operand
612       simply need to add a block of code before the SCS instruction:
613
614         PARAM myParams = { 0.5, -3.14159, 6.28319, 0.15915 };
615         MAD myOperand.x, myOperand.x, myParams.w, myParams.x; # a = (a/(2*PI))+0.5
616         FRC myOperand.x, myOperand.x;                         # a = frac(a)
617         MAD myOperand.x, myOperand.x, myParams.z, myParams.y  # a = (a*2*PI)-PI
618         ...
619         SCS myResult, myOperand.x;
620
621    (26) Is depth output from a fragment program guaranteed to be
622    invariant with respect to depth produced via conventional
623    rasterization?
624
625      RESOLVED:  No.  The floating-point representation of depth values
626      output from a fragment program may lead to the output of depth
627      with less precision than the depth output by convention GL
628      rasterization.  For example, a floating-point representation with
629      16 bits of mantissa will certainly produce depth with lesser
630      precision than that of conventional rasterization used in
631      conjunction with a 24-bit depth buffer, where all values are
632      maintained as integers.  Be aware of this when mixing conventional
633      GL rendering with fragment program rendering.
634
635    (27) How can conventional GL fog application be achieved within a
636    fragment program?
637
638      RESOLVED: Program options have been introduced that allow a
639      program to request fog to be applied to the final clamped fragment
640      color before being passed along to the antialiasing application
641      stage.  This makes it easy for:
642        1. developers to request conventional fog behavior
643        2. implementations with dedicated fog hardware to use it
644        3. implementations without dedicated fog hardware, so they need
645           not track fog state after compilation, and constantly
646           recompile when fog state changes.
647
648      The three mandatory options are ARB_fog_exp, ARB_fog_exp2, and
649      ARB_fog_linear.  As these options are mutually exclusive by
650      nature, specifying more than one is not useful.  If more than one
651      is specified, the last one encountered in the <optionSequence>
652      will be the one to actually modify the execution environment.
653
654    (28) Why have all of the enums, entrypoints, GLX protocol, and spec
655    language shared with ARB_vertex_program been reproduced here?
656
657      RESOLVED: The two extensions are independent of one another, in
658      so far as an implementation need not support both of them in order
659      to support one of them.  Everything needed to implement or make
660      use of ARB_fragment_program is present in this spec without the
661      need to refer to the ARB_vertex_program spec.  When and if these
662      two extensions are incorporated into the core OpenGL, the
663      significant overlap of the two will be collapsed into a single
664      instance of the shared parts.
665
666    (29) How might an implementation implement the fog options?  To What
667    does the extra resource consumption described in 3.11.4.5.1
668    correspond?
669
670      RESOLVED: The following code snippets reflect possible
671      implementations of the fog options.  While an implementation may
672      use other instruction sequences to achieve the same result, or may
673      use external fog hardware if available, all implementations must
674      enforce the API-level resource consumption as described: 2 params,
675      1 temp, 1 attribute, and 3, 4, or 2 instructions.  "finalColor" in
676      the examples below is the color that would otherwise be
677      "result.color", with components clamped to the range [0,1].
678      "result.color.a" is assumed to have already been written, as fog
679      blending does not affect the alpha component.
680
681      EXP:
682        # Exponential fog
683        # f = exp(-d*z)
684        #
685        PARAM p = {DENSITY/LN(2), NOT USED, NOT USED, NOT USED};
686        PARAM fogColor = state.fog.color;
687        TEMP fogFactor;
688        ATTRIB fogCoord = fragment.fogcoord.x;
689        MUL fogFactor.x, p.x, fogCoord.x;
690        EX2_SAT fogFactor.x, -fogFactor.x;
691        LRP result.color.rgb, fogFactor.x, finalColor, fogColor;
692
693      EXP2:
694        #
695        # 2nd-order Exponential fog
696        # f = exp(-(d*z)^2)
697        #
698        PARAM p = {DENSITY/SQRT(LN(2)), NOT USED, NOT USED, NOT USED};
699        PARAM fogColor = state.fog.color;
700        TEMP fogFactor;
701        ATTRIB fogCoord = fragment.fogcoord.x;
702        MUL fogFactor.x, p.x, fogCoord.x;
703        MUL fogFactor.x, fogFactor.x, fogFactor.x;
704        EX2_SAT fogFactor.x, -fogFactor.x;
705        LRP result.color.rgb, fogFactor.x, finalColor, fogColor;
706
707      LINEAR:
708        #
709        # Linear fog
710        # f = (end-z)/(end-start)
711        #
712        PARAM p = {-1/(END-START), END/(END-START), NOT USED, NOT USED};
713        PARAM fogColor = state.fog.color;
714        TEMP fogFactor;
715        ATTRIB fogCoord = fragment.fogcoord.x;
716        MAD_SAT fogFactor.x, p.x, fogCoord.x, p.y;
717        LRP result.color.rgb, fogFactor.x, finalColor, fogColor;
718
719    (30) Why is the order of operands for the CMP instruction different
720    than the order used by another popular graphics API?
721
722      RESOLVED: No other graphics API was used as a basis for the
723      design of ARB_fragment_program except ARB_vertex_program, which
724      did not have a CMP instruction.  This independent evolution
725      naturally led to differences in minor details such as order of
726      operands.  This discrepancy is noted here to help developers
727      familiar with the other API to avoid this potential pitfall.
728
729    (31) Is depth offset applied to the window z value before it enters
730    the fragment program?
731
732      RESOLVED: As in the base OpenGL specification, the depth offset
733      generated by polygon offset is added during polygon rasterization.
734      The depth value provided to shaders in the fragment.position.z
735      attribute already includes polygon offset, if enabled.  If the
736      depth value is replaced by a fragment program, the polygon offset
737      value will NOT be recomputed and added back after fragment program
738      execution.
739
740      NOTE: This is probably not desirable for fragment programs that
741      modify depth values since the partials used to generate the offset
742      may not match the partials of the computed depth value.
743
744
745New Procedures and Functions
746
747    void ProgramStringARB(enum target, enum format, sizei len,
748                          const void *string);
749
750    void BindProgramARB(enum target, uint program);
751
752    void DeleteProgramsARB(sizei n, const uint *programs);
753
754    void GenProgramsARB(sizei n, uint *programs);
755
756    void ProgramEnvParameter4dARB(enum target, uint index,
757                                  double x, double y, double z, double w);
758    void ProgramEnvParameter4dvARB(enum target, uint index,
759                                   const double *params);
760    void ProgramEnvParameter4fARB(enum target, uint index,
761                                  float x, float y, float z, float w);
762    void ProgramEnvParameter4fvARB(enum target, uint index,
763                                   const float *params);
764
765    void ProgramLocalParameter4dARB(enum target, uint index,
766                                    double x, double y, double z, double w);
767    void ProgramLocalParameter4dvARB(enum target, uint index,
768                                     const double *params);
769    void ProgramLocalParameter4fARB(enum target, uint index,
770                                    float x, float y, float z, float w);
771    void ProgramLocalParameter4fvARB(enum target, uint index,
772                                     const float *params);
773
774    void GetProgramEnvParameterdvARB(enum target, uint index,
775                                     double *params);
776    void GetProgramEnvParameterfvARB(enum target, uint index,
777                                     float *params);
778
779    void GetProgramLocalParameterdvARB(enum target, uint index,
780                                       double *params);
781    void GetProgramLocalParameterfvARB(enum target, uint index,
782                                       float *params);
783
784    void GetProgramivARB(enum target, enum pname, int *params);
785
786    void GetProgramStringARB(enum target, enum pname, void *string);
787
788    boolean IsProgramARB(uint program);
789
790
791New Tokens
792
793    Accepted by the <cap> parameter of Disable, Enable, and IsEnabled,
794    by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
795    and GetDoublev, and by the <target> parameter of ProgramStringARB,
796    BindProgramARB, ProgramEnvParameter4[df][v]ARB,
797    ProgramLocalParameter4[df][v]ARB, GetProgramEnvParameter[df]vARB,
798    GetProgramLocalParameter[df]vARB, GetProgramivARB and
799    GetProgramStringARB.
800
801        FRAGMENT_PROGRAM_ARB                            0x8804
802
803    Accepted by the <format> parameter of ProgramStringARB:
804
805        PROGRAM_FORMAT_ASCII_ARB                        0x8875
806
807    Accepted by the <pname> parameter of GetProgramivARB:
808
809        PROGRAM_LENGTH_ARB                              0x8627
810        PROGRAM_FORMAT_ARB                              0x8876
811        PROGRAM_BINDING_ARB                             0x8677
812        PROGRAM_INSTRUCTIONS_ARB                        0x88A0
813        MAX_PROGRAM_INSTRUCTIONS_ARB                    0x88A1
814        PROGRAM_NATIVE_INSTRUCTIONS_ARB                 0x88A2
815        MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB             0x88A3
816        PROGRAM_TEMPORARIES_ARB                         0x88A4
817        MAX_PROGRAM_TEMPORARIES_ARB                     0x88A5
818        PROGRAM_NATIVE_TEMPORARIES_ARB                  0x88A6
819        MAX_PROGRAM_NATIVE_TEMPORARIES_ARB              0x88A7
820        PROGRAM_PARAMETERS_ARB                          0x88A8
821        MAX_PROGRAM_PARAMETERS_ARB                      0x88A9
822        PROGRAM_NATIVE_PARAMETERS_ARB                   0x88AA
823        MAX_PROGRAM_NATIVE_PARAMETERS_ARB               0x88AB
824        PROGRAM_ATTRIBS_ARB                             0x88AC
825        MAX_PROGRAM_ATTRIBS_ARB                         0x88AD
826        PROGRAM_NATIVE_ATTRIBS_ARB                      0x88AE
827        MAX_PROGRAM_NATIVE_ATTRIBS_ARB                  0x88AF
828        MAX_PROGRAM_LOCAL_PARAMETERS_ARB                0x88B4
829        MAX_PROGRAM_ENV_PARAMETERS_ARB                  0x88B5
830        PROGRAM_UNDER_NATIVE_LIMITS_ARB                 0x88B6
831
832        PROGRAM_ALU_INSTRUCTIONS_ARB                    0x8805
833        PROGRAM_TEX_INSTRUCTIONS_ARB                    0x8806
834        PROGRAM_TEX_INDIRECTIONS_ARB                    0x8807
835        PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB             0x8808
836        PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB             0x8809
837        PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB             0x880A
838        MAX_PROGRAM_ALU_INSTRUCTIONS_ARB                0x880B
839        MAX_PROGRAM_TEX_INSTRUCTIONS_ARB                0x880C
840        MAX_PROGRAM_TEX_INDIRECTIONS_ARB                0x880D
841        MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB         0x880E
842        MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB         0x880F
843        MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB         0x8810
844
845    Accepted by the <pname> parameter of GetProgramStringARB:
846
847        PROGRAM_STRING_ARB                              0x8628
848
849    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
850    GetFloatv, and GetDoublev:
851
852        PROGRAM_ERROR_POSITION_ARB                      0x864B
853        CURRENT_MATRIX_ARB                              0x8641
854        TRANSPOSE_CURRENT_MATRIX_ARB                    0x88B7
855        CURRENT_MATRIX_STACK_DEPTH_ARB                  0x8640
856        MAX_PROGRAM_MATRICES_ARB                        0x862F
857        MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB              0x862E
858
859        MAX_TEXTURE_COORDS_ARB                          0x8871
860        MAX_TEXTURE_IMAGE_UNITS_ARB                     0x8872
861
862    Accepted by the <name> parameter of GetString:
863
864        PROGRAM_ERROR_STRING_ARB                        0x8874
865
866    Accepted by the <mode> parameter of MatrixMode:
867
868        MATRIX0_ARB                                     0x88C0
869        MATRIX1_ARB                                     0x88C1
870        MATRIX2_ARB                                     0x88C2
871        MATRIX3_ARB                                     0x88C3
872        MATRIX4_ARB                                     0x88C4
873        MATRIX5_ARB                                     0x88C5
874        MATRIX6_ARB                                     0x88C6
875        MATRIX7_ARB                                     0x88C7
876        MATRIX8_ARB                                     0x88C8
877        MATRIX9_ARB                                     0x88C9
878        MATRIX10_ARB                                    0x88CA
879        MATRIX11_ARB                                    0x88CB
880        MATRIX12_ARB                                    0x88CC
881        MATRIX13_ARB                                    0x88CD
882        MATRIX14_ARB                                    0x88CE
883        MATRIX15_ARB                                    0x88CF
884        MATRIX16_ARB                                    0x88D0
885        MATRIX17_ARB                                    0x88D1
886        MATRIX18_ARB                                    0x88D2
887        MATRIX19_ARB                                    0x88D3
888        MATRIX20_ARB                                    0x88D4
889        MATRIX21_ARB                                    0x88D5
890        MATRIX22_ARB                                    0x88D6
891        MATRIX23_ARB                                    0x88D7
892        MATRIX24_ARB                                    0x88D8
893        MATRIX25_ARB                                    0x88D9
894        MATRIX26_ARB                                    0x88DA
895        MATRIX27_ARB                                    0x88DB
896        MATRIX28_ARB                                    0x88DC
897        MATRIX29_ARB                                    0x88DD
898        MATRIX30_ARB                                    0x88DE
899        MATRIX31_ARB                                    0x88DF
900
901
902Additions to Chapter 2 of the OpenGL 1.3 Specification (OpenGL
903Operation)
904
905    Modify Section 2.1.1, Floating-Point Computation (p. 6)
906
907    (modify first paragraph, p. 6) ... The maximum representable
908    magnitude of a floating-point number used to represent position,
909    normal, or texture coordinates must be at least 2^32; the maximum
910    representable magnitude for colors must be at least 2^10.  ...
911
912
913    Modify Section 2.7, Vertex Specification (p. 19)
914
915    (modify second paragraph, p. 20) Implementations support more than
916    one set of texture coordinates.  The commands
917
918      void MultiTexCoord{1234}{sifd}(enum texture, T coords);
919      void MultiTexCoord{1234}{sifd}v(enum texture, T coords);
920
921    take the coordinate set to be modified as the <texture> parameter.
922    <texture> is a symbolic constant of the form TEXTUREi, indicating
923    that texture coordinate set i is to be modified.  The constants obey
924    TEXTUREi = TEXTURE0 + i (i is in the range 0 to k-1, where k is the
925    implementation-dependent number of texture units defined by
926    MAX_TEXTURE_COORDS_ARB).
927
928
929    Modify Section 2.8, Vertex Arrays (p. 21)
930
931    (modify first paragraph, p. 21) ... The client may specify up to 5
932    plus the value of MAX_TEXTURE_COORDS_ARB arrays: one each to store
933    vertex coordinates...
934
935
936    (modify first paragraph, p. 23) The command
937
938      void ClientActiveTexture(enum texture);
939
940    is used to select the vertex array client state parameters to be
941    modified by the TexCoordPointer command and the array affected by
942    EnableClientState and DisableClientState with parameter
943    TEXTURE_COORD_ARRAY.  This command sets the client state variable
944    CLIENT_ACTIVE_TEXTURE.  Each texture coordinate set has a client
945    state vector which is selected when this command is invoked.  This
946    state vector includes the vertex array state.  This call also
947    selects the texture coordinate set state used for queries of client
948    state.
949
950
951    (modify first paragraph, p. 28) If the number of supported texture
952    coordinate sets (the value of MAX_TEXTURE_COORDS_ARB) is k, ...
953
954
955    Modify Section 2.10.2, Matrices (p. 31)
956
957    (modify first paragraph, p. 31) The projection matrix and model-view
958    matrix are set and modified with a variety of commands.  The
959    affected matrix is determined by the current matrix mode.  The
960    current matrix mode is set with
961
962      void MatrixMode(enum mode);
963
964    which takes one of the pre-defined constants TEXTURE, MODELVIEW,
965    COLOR, PROJECTION, or MATRIX<i>_ARB as the argument.  In the case of
966    MATRIX<i>_ARB, <i> is an integer between 0 and <n>-1 indicating one
967    of <n> program matrices where <n> is the value of the implementation
968    defined constant MAX_PROGRAM_MATRICES_ARB.  Such program matrices
969    are described in section 3.11.7.  TEXTURE is described later in
970    section 2.10.2, and COLOR is described in section 3.6.3.  If the
971    current matrix mode is MODELVIEW, then matrix operations apply to
972    the model-view matrix; if PROJECTION, then they apply to the
973    projection matrix.
974
975
976    (modify first paragraph, p. 34) For each texture coordinate set, a
977    4x4 matrix is applied to the corresponding texture coordinates...
978
979
980    (modify first and second paragraphs, p. 35) The command
981
982      void ActiveTexture(enum texture);
983
984    specifies the active texture unit selector, ACTIVE_TEXTURE.  Each
985    texture unit contains up to two distinct sub-units: a texture
986    coordinate processing unit (consisting of a texture matrix stack and
987    texture coordinate generation state) and a texture image unit
988    (consisting of all the texture state defined in Section 3.8).  In
989    implementations with a different number of supported texture
990    coordinate sets and texture image units, some texture units may
991    consist of only one of the two sub-units.
992
993    The active texture unit selector specifies the texture coordinate
994    set accessed by commands involving texture coordinate processing.
995    Such commands include those accessing the current matrix stack (if
996    MATRIX_MODE is TEXTURE), TexGen (section 2.10.4), Enable/Disable (if
997    any texture coordinate generation enum is selected), as well as
998    queries of the current texture coordinates and current raster
999    texture coordinates.  If the texture coordinate set number
1000    corresponding to the current value of ACTIVE_TEXTURE is greater than
1001    or equal to the implementation-dependent constant
1002    MAX_TEXTURE_COORDS_ARB, the error INVALID_OPERATION is generated by
1003    any such command.
1004
1005    The active texture unit selector also selects the texture image unit
1006    accessed by commands involving texture image processing (section
1007    3.8).  Such commands include all variants of TexEnv, TexParameter,
1008    and TexImage commands, BindTexture, Enable/Disable for any texture
1009    target (e.g., TEXTURE_2D), and queries of all such state.  If the
1010    texture image unit number corresponding to the current value of
1011    ACTIVE_TEXTURE is greater than or equal to the implementation-
1012    dependent constant MAX_TEXTURE_IMAGE_UNITS_ARB, the error
1013    INVALID_OPERATION is generated by any such command.
1014
1015    ActiveTexture generates the error INVALID_ENUM if an invalid
1016    <texture> is specified.  <texture> is a symbolic constant of the
1017    form TEXTUREi, indicating that texture unit i is to be modified.
1018    The constants obey TEXTUREi = TEXTURE0 + i (i is in the range 0 to
1019    k-1, where k is the larger of the MAX_TEXTURE_COORDS_ARB and
1020    MAX_TEXTURE_IMAGE_UNITS_ARB).  For compatibility with old OpenGL
1021    specifications, the implementation-dependent constant
1022    MAX_TEXTURE_UNITS specifies the number of conventional texture units
1023    supported by the implementation.  Its value must be no larger than
1024    the minimum of MAX_TEXTURE_COORDS_ARB and
1025    MAX_TEXTURE_IMAGE_UNITS_ARB.
1026
1027
1028    (modify last paragraph, p. 35) The state required to implement
1029    transformations consists of a <n>-value integer indicating the
1030    current matrix mode (where <n> is 4 + the number of supported
1031    texture and program matrices), a stack of at least two 4x4 matrices
1032    for each of COLOR, PROJECTION, and TEXTURE with associated stack
1033    pointers, <n> stacks (where <n> is at least 8) of at least one 4x4
1034    matrix for each MATRIX<i>_ARB with associated stack pointers, and a
1035    stack of at least 32 4x4 matrices with an associated stack pointer
1036    for MODELVIEW.  Initially, there is only one matrix on each stack,
1037    and all matrices are set to the identity.  The initial matrix mode
1038    is MODELVIEW.  The initial value of ACTIVE_TEXTURE is TEXTURE0.
1039
1040
1041Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)
1042
1043    Modify Chapter 3, Introduction (p. 58)
1044
1045    (modify first paragraph, p. 58) ... Figure 3.1 diagrams the
1046    rasterization process.  The color value assigned to a fragment is
1047    initially determined by the rasterization operations (sections 3.3
1048    through 3.7) and modified by either the execution of the texturing,
1049    color sum, and fog operations as defined in sections 3.8, 3.9, and
1050    3.10, or of a fragment program defined in section 3.11.  The final
1051    depth value is initially determined by the rasterization operations
1052    and may be modified or replaced by a fragment program.
1053
1054    (modify Figure 3.1)
1055
1056                 _ +---------------+   FRAGMENT_PROGRAM_ARB
1057                 /||    Point      |          enable
1058                /  | Rasterization |\           |
1059               /   +---------------+ \          V  o-------------+
1060       From   /    +---------------+  \                          |
1061    Primitive ---> |     Line      |---+++--->o    o             |
1062     Assembly \    | Rasterization |  / ||         |             |
1063               \   +---------------+ /  ||         |             |
1064                \  +---------------+/   ||   +-----+-----+  +----+-----+
1065                 \||    Polygon    |    ||   | Texturing |  | Fragment |
1066                 - | Rasterization |   / |   +-----+-----+  | Program  |
1067                   +---------------+  /  |         |        +----+-----+
1068                   +---------------+ /   |   +-----+-----+       |
1069                   |     Pixel     |/    |   | Color Sum |       |
1070    DrawPixels --> |   Rectangle   |    /    +-----+-----+       |
1071                   | Rasterization |   /           |             V
1072                   +---------------+  /      +-----+-----+
1073                   +---------------+ /       |    Fog    |---> Fragments
1074      Bitmap ----> |    Bitmap     |/        +-----------+
1075                   | Rasterization |
1076                   +---------------+
1077
1078
1079    Modify Section 3.3, Points (p. 63)
1080
1081    (modify first and second paragraphs, p. 64) All fragments produced
1082    in rasterizing a non-antialiased point are assigned the same
1083    associated data, which are those of the vertex corresponding to the
1084    point.  (delete reference to divide by q)
1085
1086    If antialiasing is enabled, then ...  The data associated with each
1087    fragment are otherwise the data associated with the point being
1088    rasterized.  (delete reference to divide by q)
1089
1090
1091    Modify Section 3.4.1, Basic Line Segment Rasterization (p. 66)
1092
1093    (modify first paragraph, p. 68) ... (Note that t=0 at p_a and t=1 at
1094    p_b).  The value of an associated datum f from the fragment center,
1095    whether it be R, G, B, or A (in RGBA mode) or a color index (in
1096    color index mode) or the s, t, r, or q texture coordinate or the
1097    clip w coordinate (the depth value, window z, must be found using
1098    equation 3.3, below), is found as
1099
1100      f = (1-t)*(f_a/w_a) + t*(f_b/w_b)                     (3.2)
1101          -----------------------------
1102            (1-t)*(1/w_a) + t*(1/w_b)
1103
1104    where f_a and f_b are the data associated with the starting and
1105    ending endpoints of the segment, respectively; w_a and w_b are the
1106    clip w coordinates of the starting and ending endpoints of the
1107    segments, respectively.  Note that linear interpolation would use
1108
1109      f = (1-t)*f_a + t*f_b.                                (3.3)
1110
1111    ... A GL implementation may choose to approximate equation 3.2 with
1112    3.3, but this will normally lead to inacceptable distortion effects
1113    when interpolating texture coordinates or clip w coordinates.
1114
1115
1116    Modify Section 3.5.1, Basic Polygon Rasterization (p. 73)
1117
1118    (modify third and fourth paragraphs, p. 74) Denote a datum at p_a,
1119    p_b, or p_c as f_a, f_b, or f_c, respectively.  Then the value f of
1120    a datum at a fragment produced by rasterizing a triangle is given by
1121
1122      f = a*(f_a/w_a) + b*(f_b/w_b) + c*(f_c/w_c)           (3.4)
1123          ---------------------------------------
1124             a*(1/w_a) + b*(1/w_b) + c*(1/w_c)
1125
1126    where w_a, w_b, and w_c are the clip w coordinates of p_a, p_b, and
1127    p_c, respectively.  a, b, and c are the barycentric coordinates of
1128    the fragment for which the data are produced.  a, b, and c must
1129    correspond precisely to the ... at the fragment's center.
1130
1131    Just as with line segment rasterization, equation 3.4 may be
1132    approximated by
1133
1134      f = a*f_a + b*f_b + c*f_c;
1135
1136    this may yield ... for texture coordinates or clip w coordinates.
1137
1138
1139    Modify Section 3.6.4, Rasterization of Pixel Rectangles (p. 91)
1140
1141    (modify third paragraph, p. 103) A fragment arising from a group ...
1142    the color and texture coordinates are given by those associated with
1143    the current raster position.  (delete reference to divide by q)
1144    Groups arising from DrawPixels...
1145
1146
1147    Modify Section 3.7, Bitmaps (p. 113)
1148
1149    (modify third paragraph, p. 114) Otherwise, a rectangular array ...
1150    The associated data for each fragment are those associated with the
1151    current raster position.  (delete reference to divide by q)  Once
1152    the fragments have been produced ...
1153
1154
1155    Modify Section 3.8, Texturing (p. 115)
1156
1157    (add new paragraphs before first paragraph, p. 115) Texture
1158    coordinate sets are mapped to RGBA colors for application to
1159    primitives in one of two modes.  The first mode, described in this
1160    and subsequent sections, is GL's conventional multitexture pipeline,
1161    describing texture environment and texture application.  The second
1162    mode, referred to as fragment program mode and described in section
1163    3.11, applies textures, color sum, and fog as specified in an
1164    application-supplied fragment program.
1165
1166    The fragment program mode is enabled and disabled using the generic
1167    Enable and Disable commands, respectively, with the symbolic
1168    constant FRAGMENT_PROGRAM_ARB.  The required state is one bit
1169    indicating whether the fragment program mode is enabled or disabled.
1170    In the initial state, the fragment program mode is disabled.  When
1171    fragment program mode is enabled, texturing, color sum, and fog
1172    application stages are ignored and a general purpose program is
1173    executed instead.
1174
1175    (modify first and second paragraph, p. 115) Conventional texturing
1176    is employed when fragment program mode is disabled.  Texturing maps
1177    ... color of an image at the location indicated by a fragment's
1178    texture coordinates to modify the fragment's primary RGBA color.
1179    Texturing does not affect the secondary color.
1180
1181    An implementation may support texturing using more than one image at
1182    a time.  In this case the fragment carries multiple sets of texture
1183    coordinates which are used to index ...
1184
1185    (add paragraph before 1st paragraph, p. 116) Except when in fragment
1186    program mode (section 3.11), the (s,t,r) texture coordinates used
1187    for texturing are the values s/q, t/q, and r/q, respectively, where
1188    s, t, r, and q are the texture coordinates associated with the
1189    fragment.  When in fragment program mode, the (s,t,r) texture
1190    coordinates are specified by the program.  If q is less than or
1191    equal to zero, the results of texturing are undefined.
1192
1193
1194    Modify Section 3.8.7, Texture Minification (p. 135)
1195
1196    (add new paragraph after first paragraph, p. 137) When fragment
1197    program mode is enabled, the derivatives of the coordinates may be
1198    ill-defined or non-existent.  As a result, the implementation is
1199    free to approximate these derivatives with such techniques as
1200    differencing.  The only requirement is that texture samples be
1201    equivalent across the two modes.  In other words, the texture sample
1202    chosen for a fragment of a primitive must be invariant between
1203    fragment program mode and conventional mode subject to the rules
1204    set forth in Appendix A, Invariance.
1205
1206
1207    Modify Section 3.8.13, Texture Application (p. 149)
1208
1209    (modify fourth paragraph, p. 152) Texturing is enabled and disabled
1210    individually for each texture unit.  If texturing is disabled for
1211    one of the units, then the fragment resulting from the previous unit
1212    is passed unaltered to the following unit.  Individual texture units
1213    beyond those specified by MAX_TEXTURE_UNITS may be incomplete and
1214    are always treated as disabled.
1215
1216
1217    Insert a new Section 3.11, (p. 154), between existing sections 3.10
1218    and 3.11.  Renumber 3.11, Antialiasing Application, to 3.12.
1219
1220    3.11  Fragment Programs
1221
1222    The conventional GL texturing model described in section 3.8 is a
1223    configurable but essentially hard-wired sequence of per-fragment
1224    computations based on a canonical set of per-fragment parameters
1225    and texturing-related state such as texture images, texture
1226    parameters, and texture environment parameters.  The general success
1227    and utility of the conventional GL texturing model reflects its
1228    basic correspondence to the typical texturing requirements of 3D
1229    applications.
1230
1231    However when the conventional GL texturing model is not sufficient,
1232    the fragment program mode provides a substantially more flexible
1233    model for generating fragment colors.  The fragment program mode
1234    permits applications to define their own fragment programs.
1235
1236    A fragment program is a character string that specifies a sequence
1237    of operations to perform.  Fragment program instructions are
1238    typically 4-component vector operations that operate on per-fragment
1239    attributes and program parameters.  Fragment programs execute on a
1240    per-fragment basis and operate on each fragment completely
1241    independently from any other fragments.  Fragment programs execute a
1242    finite fixed sequence of instructions with no branching or looping.
1243    Fragment programs execute without data hazards so results computed
1244    in one instruction can be used immediately afterwards.  The result
1245    of a fragment program is a set of fragment result registers that
1246    becomes the color used by antialiasing application and/or a depth
1247    value used in place of the interpolated depth value generated by
1248    conventional rasterization.
1249
1250    In fragment program mode, the color sum is subsumed by the fragment
1251    program.  An application desiring the primary and secondary colors
1252    to be summed must explicitly include this operation in its program.
1253
1254    Fragment programs are defined to operate only in RGBA mode.  The
1255    results of fragment program execution are undefined if the GL is in
1256    color index mode.
1257
1258
1259    3.11.1  Program Objects
1260
1261    The GL provides one or more program targets, each identifying a
1262    portion of the GL that can be controlled through application-
1263    specified programs.  The program target for fragment programs is
1264    FRAGMENT_PROGRAM_ARB.  Each program target has an associated program
1265    object, called the current program object.  Each program target also
1266    has a default program object, which is initially the current program
1267    object.
1268
1269    Each program object has an associated program string.  The command
1270
1271      ProgramStringARB(enum target, enum format, sizei len,
1272                       const void *string);
1273
1274    updates the program string for the current program object for
1275    <target>.  <format> describes the format of the program string,
1276    which must currently be PROGRAM_FORMAT_ASCII_ARB.  <string> is a
1277    pointer to the array of bytes representing the program string being
1278    loaded, which need not be null-terminated.  The length of the array
1279    is given by <len>.  If <string> is null-terminated, <len> should not
1280    include the terminator.
1281
1282    When a program string is loaded, it is interpreted according to
1283    syntactic and semantic rules corresponding to the program target
1284    specified by <target>.  If a program violates the syntactic or
1285    semantic restrictions of the program target, ProgramStringARB
1286    generates the error INVALID_OPERATION.  An implementation may also
1287    generate the error INVALID_OPERATION if the program would exceed
1288    the native resource limits defined in section 6.1.12.  A program
1289    which fails to load due to exceeding native resource limits must
1290    always fail, regardless of any other GL state.
1291
1292    Additionally, ProgramString will update the program error position
1293    (PROGRAM_ERROR_POSITION_ARB) and error string
1294    (PROGRAM_ERROR_STRING_ARB).  If a program fails to load, the value
1295    of the program error position is set to the ubyte offset into the
1296    specified program string indicating where the first program error
1297    was detected.  If the program fails to load because of a semantic
1298    restriction that is not detected until the program is fully
1299    scanned, the error position is set to the value of <len>.  If a
1300    program loads successfully, the error position is set to the value
1301    negative one.  The implementation-dependent program error string
1302    contains one or more error or warning messages.  If a program loads
1303    succesfully, the error string may either contain warning messages or
1304    be empty.
1305
1306    Each program object has an associated array of program local
1307    parameters.  The number and type of program local parameters is
1308    target- and implementation-dependent.  For fragment programs,
1309    program local parameters are four-component floating-point vectors.
1310    The number of vectors is given by the implementation-dependent
1311    constant MAX_PROGRAM_LOCAL_PARAMETERS_ARB, which must be at least
1312    24.  The commands
1313
1314      void ProgramLocalParameter4fARB(enum target, uint index,
1315                                      float x, float y, float z, float w);
1316      void ProgramLocalParameter4fvARB(enum target, uint index,
1317                                       const float *params);
1318      void ProgramLocalParameter4dARB(enum target, uint index,
1319                                      double x, double y, double z, double w);
1320      void ProgramLocalParameter4dvARB(enum target, uint index,
1321                                       const double *params);
1322
1323    update the values of the program local parameter numbered <index>
1324    belonging to the program object currently bound to <target>.  For
1325    ProgramLocalParameter4fARB and ProgramLocalParameter4dARB, the four
1326    components of the parameter are updated with the values of <x>, <y>,
1327    <z>, and <w>, respectively.  For ProgramLocalParameter4fvARB and
1328    ProgramLocalParameter4dvARB, the four components of the parameter
1329    are updated with the array of four values pointed to by <params>.
1330    The error INVALID_VALUE is generated if <index> is greater than or
1331    equal to the number of program local parameters supported by
1332    <target>.
1333
1334    Additionally, each program target has an associated array of program
1335    environment parameters.  Unlike program local parameters, program
1336    environment parameters are shared by all program objects of a given
1337    target.  The number and type of program environment parameters is
1338    target- and implementation-dependent.  For fragment programs,
1339    program environment parameters are four-component floating-point
1340    vectors.  The number of vectors is given by the implementation-
1341    dependent constant MAX_PROGRAM_ENV_PARAMETERS_ARB, which must be at
1342    least 24.  The commands
1343
1344      void ProgramEnvParameter4fARB(enum target, uint index,
1345                                    float x, float y, float z, float w);
1346      void ProgramEnvParameter4fvARB(enum target, uint index,
1347                                     const float *params);
1348      void ProgramEnvParameter4dARB(enum target, uint index,
1349                                    double x, double y, double z, double w);
1350      void ProgramEnvParameter4dvARB(enum target, uint index,
1351                                     const double *params);
1352
1353    update the values of the program environment parameter numbered
1354    <index> for the given program target <target>.  For
1355    ProgramEnvParameter4fARB and ProgramEnvParameter4dARB, the four
1356    components of the parameter are updated with the values of <x>, <y>,
1357    <z>, and <w>, respectively.  For ProgramEnvParameter4fvARB and
1358    ProgramEnvParameter4dvARB, the four components of the parameter are
1359    updated with the array of four values pointed to by <params>.  The
1360    error INVALID_VALUE is generated if <index> is greater than or equal
1361    to the number of program environment parameters supported by
1362    <target>.
1363
1364    Each program target has a default program object.  Additionally,
1365    named program objects can be created and operated upon.  The name
1366    space for program objects is the positive integers and is shared by
1367    programs of all targets.  The name zero is reserved by the GL.
1368
1369    A named program object is created by binding an unused program
1370    object name to a valid program target.  The binding is effected by
1371    calling
1372
1373      BindProgramARB(enum target, uint program);
1374
1375    with <target> set to the desired program target and <program> set to
1376    the unused program name.  The resulting program object has a program
1377    target given by <target> and is assigned target-specific default
1378    values (see section 3.11.8 for fragment programs).  BindProgramARB
1379    may also be used to bind an existing program object to a program
1380    target.  If <program> is zero, the default program object for
1381    <target> is bound.  If <program> is the name of an existing program
1382    object whose associated program target is <target>, the named
1383    program object is bound.  The error INVALID_OPERATION is generated
1384    if <program> names an existing program object whose associated
1385    program target is anything other than <target>.
1386
1387    Programs objects are deleted by calling
1388
1389      void DeleteProgramsARB(sizei n, const uint *programs);
1390
1391    <programs> contains <n> names of programs to be deleted.  After a
1392    program object is deleted, its name is again unused.  If a program
1393    object that is bound to any target is deleted, it is as though
1394    BindProgramARB is first executed with same target and a <program> of
1395    zero.  Unused names in <programs> are silently ignored, as is the
1396    value zero.
1397
1398    The command
1399
1400      void GenProgramsARB(sizei n, uint *programs);
1401
1402    returns <n> currently unused program names in <programs>.  These
1403    names are marked as used, for the purposes of GenProgramsARB only,
1404    but objects are created only when they are first bound using
1405    BindProgramARB.
1406
1407
1408    3.11.2  Fragment Program Grammar and Semantic Restrictions
1409
1410    Fragment program strings are specified as an array of ASCII
1411    characters containing the program text.  When a fragment program is
1412    loaded by a call to ProgramStringARB, the program string is parsed
1413    into a set of tokens possibly separated by whitespace.  Spaces,
1414    tabs, newlines, carriage returns, and comments are considered
1415    whitespace.  Comments begin with the character "#" and are
1416    terminated by a newline, a carriage return, or the end of the
1417    program array.
1418
1419    The Backus-Naur Form (BNF) grammar below specifies the syntactically
1420    valid sequences for fragment programs.  The set of valid tokens can
1421    be inferred from the grammar.  The token "" represents an empty
1422    string and is used to indicate optional rules.  A program is invalid
1423    if it contains any undefined tokens or characters.
1424
1425    A fragment program is required to begin with the header string
1426    "!!ARBfp1.0", without any preceding whitespace.  This string
1427    identifies the subsequent program text as a fragment program
1428    (version 1.0) that should be parsed according to the following
1429    grammar and semantic rules.  Program string parsing begins with the
1430    character immediately following the header string.
1431
1432    <program>              ::= <optionSequence> <statementSequence> "END"
1433
1434    <optionSequence>       ::= <optionSequence> <option>
1435                             | ""
1436
1437    <option>               ::= "OPTION" <identifier> ";"
1438
1439    <statementSequence>    ::= <statementSequence> <statement>
1440                             | ""
1441
1442    <statement>            ::= <instruction> ";"
1443                             | <namingStatement> ";"
1444
1445    <instruction>          ::= <ALUInstruction>
1446                             | <TexInstruction>
1447
1448    <ALUInstruction>       ::= <VECTORop_instruction>
1449                             | <SCALARop_instruction>
1450                             | <BINSCop_instruction>
1451                             | <BINop_instruction>
1452                             | <TRIop_instruction>
1453                             | <SWZ_instruction>
1454
1455    <TexInstruction>       ::= <SAMPLE_instruction>
1456                             | <KIL_instruction>
1457
1458    <VECTORop_instruction> ::= <VECTORop> <maskedDstReg> ","
1459                               <vectorSrcReg>
1460
1461    <VECTORop>             ::= "ABS" | "ABS_SAT"
1462                             | "FLR" | "FLR_SAT"
1463                             | "FRC" | "FRC_SAT"
1464                             | "LIT" | "LIT_SAT"
1465                             | "MOV" | "MOV_SAT"
1466
1467    <SCALARop_instruction> ::= <SCALARop> <maskedDstReg> ","
1468                               <scalarSrcReg>
1469
1470    <SCALARop>             ::= "COS" | "COS_SAT"
1471                             | "EX2" | "EX2_SAT"
1472                             | "LG2" | "LG2_SAT"
1473                             | "RCP" | "RCP_SAT"
1474                             | "RSQ" | "RSQ_SAT"
1475                             | "SIN" | "SIN_SAT"
1476                             | "SCS" | "SCS_SAT"
1477
1478    <BINSCop_instruction>  ::= <BINSCop> <maskedDstReg> ","
1479                               <scalarSrcReg> "," <scalarSrcReg>
1480
1481    <BINSCop>              ::= "POW" | "POW_SAT"
1482
1483    <BINop_instruction>    ::= <BINop> <maskedDstReg> ","
1484                               <vectorSrcReg> "," <vectorSrcReg>
1485
1486    <BINop>                ::= "ADD" | "ADD_SAT"
1487                             | "DP3" | "DP3_SAT"
1488                             | "DP4" | "DP4_SAT"
1489                             | "DPH" | "DPH_SAT"
1490                             | "DST" | "DST_SAT"
1491                             | "MAX" | "MAX_SAT"
1492                             | "MIN" | "MIN_SAT"
1493                             | "MUL" | "MUL_SAT"
1494                             | "SGE" | "SGE_SAT"
1495                             | "SLT" | "SLT_SAT"
1496                             | "SUB" | "SUB_SAT"
1497                             | "XPD" | "XPD_SAT"
1498
1499    <TRIop_instruction>    ::= <TRIop> <maskedDstReg> ","
1500                               <vectorSrcReg> "," <vectorSrcReg> ","
1501                               <vectorSrcReg>
1502
1503    <TRIop>                ::= "CMP" | "CMP_SAT"
1504                             | "LRP" | "LRP_SAT"
1505                             | "MAD" | "MAD_SAT"
1506
1507    <SWZ_instruction>      ::= <SWZop> <maskedDstReg> ","
1508                               <srcReg> "," <extendedSwizzle>
1509
1510    <SWZop>                ::= "SWZ" | "SWZ_SAT"
1511
1512    <SAMPLE_instruction>   ::= <SAMPLEop> <maskedDstReg> ","
1513                               <vectorSrcReg> "," <texImageUnit> ","
1514                               <texTarget>
1515
1516    <SAMPLEop>             ::= "TEX" | "TEX_SAT"
1517                             | "TXP" | "TXP_SAT"
1518                             | "TXB" | "TXB_SAT"
1519
1520    <KIL_instruction>      ::= "KIL" <vectorSrcReg>
1521
1522    <texImageUnit>         ::= "texture" <optTexImageUnitNum>
1523
1524    <texTarget>            ::= "1D"
1525                             | "2D"
1526                             | "3D"
1527                             | "CUBE"
1528                             | "RECT"
1529
1530    <optTexImageUnitNum>   ::= ""
1531                             | "[" <texImageUnitNum> "]"
1532
1533    <texImageUnitNum>      ::= <integer> from 0 to
1534                               MAX_TEXTURE_IMAGE_UNITS_ARB-1
1535
1536    <scalarSrcReg>         ::= <optionalSign> <srcReg> <scalarSuffix>
1537
1538    <vectorSrcReg>         ::= <optionalSign> <srcReg> <optionalSuffix>
1539
1540    <maskedDstReg>         ::= <dstReg> <optionalMask>
1541
1542    <extendedSwizzle>      ::= <xyzwExtendedSwizzle>
1543                             | <rgbaExtendedSwizzle>
1544
1545    <xyzwExtendedSwizzle>  ::= <xyzwExtSwizComp> "," <xyzwExtSwizComp> ","
1546                               <xyzwExtSwizComp> "," <xyzwExtSwizComp>
1547
1548    <rgbaExtendedSwizzle>  ::= <rgbaExtSwizComp> "," <rgbaExtSwizComp> ","
1549                               <rgbaExtSwizComp> "," <rgbaExtSwizComp>
1550
1551    <xyzwExtSwizComp>      ::= <optionalSign> <xyzwExtSwizSel>
1552
1553    <rgbaExtSwizComp>      ::= <optionalSign> <rgbaExtSwizSel>
1554
1555    <xyzwExtSwizSel>       ::= "0"
1556                             | "1"
1557                             | <xyzwComponent>
1558
1559    <rgbaExtSwizSel>       ::= "0"
1560                             | "1"
1561                             | <rgbaComponent>
1562
1563    <srcReg>               ::= <fragmentAttribReg>
1564                             | <temporaryReg>
1565                             | <progParamReg>
1566
1567    <dstReg>               ::= <temporaryReg>
1568                             | <fragmentResultReg>
1569
1570    <fragmentAttribReg>    ::= <establishedName>
1571                             | <fragAttribBinding>
1572
1573    <temporaryReg>         ::= <establishedName>
1574
1575    <progParamReg>         ::= <progParamSingle>
1576                             | <progParamArray> "[" <progParamArrayAbs> "]"
1577                             | <paramSingleItemUse>
1578
1579    <progParamSingle>      ::= <establishedName>
1580
1581    <progParamArray>       ::= <establishedName>
1582
1583    <progParamArrayAbs>    ::= <integer>
1584
1585    <fragmentResultReg>    ::= <establishedName>
1586                             | <resultBinding>
1587
1588    <scalarSuffix>         ::= "." <component>
1589
1590    <optionalSuffix>       ::= ""
1591                             | "." <component>
1592                             | "." <xyzwComponent> <xyzwComponent>
1593                                   <xyzwComponent> <xyzwComponent>
1594                             | "." <rgbaComponent> <rgbaComponent>
1595                                   <rgbaComponent> <rgbaComponent>
1596
1597    <component>            ::= <xyzwComponent>
1598                             | <rgbaComponent>
1599
1600    <xyzwComponent>        ::= "x" | "y" | "z" | "w"
1601
1602    <rgbaComponent>        ::= "r" | "g" | "b" | "a"
1603
1604    <optionalMask>         ::= ""
1605                             | <xyzwMask>
1606                             | <rgbaMask>
1607
1608    <xyzwMask>             ::= "." "x"
1609                             | "." "y"
1610                             | "." "xy"
1611                             | "." "z"
1612                             | "." "xz"
1613                             | "." "yz"
1614                             | "." "xyz"
1615                             | "." "w"
1616                             | "." "xw"
1617                             | "." "yw"
1618                             | "." "xyw"
1619                             | "." "zw"
1620                             | "." "xzw"
1621                             | "." "yzw"
1622                             | "." "xyzw"
1623
1624    <rgbaMask>             ::= "." "r"
1625                             | "." "g"
1626                             | "." "rg"
1627                             | "." "b"
1628                             | "." "rb"
1629                             | "." "gb"
1630                             | "." "rgb"
1631                             | "." "a"
1632                             | "." "ra"
1633                             | "." "ga"
1634                             | "." "rga"
1635                             | "." "ba"
1636                             | "." "rba"
1637                             | "." "gba"
1638                             | "." "rgba"
1639
1640    <namingStatement>      ::= <ATTRIB_statement>
1641                             | <PARAM_statement>
1642                             | <TEMP_statement>
1643                             | <OUTPUT_statement>
1644                             | <ALIAS_statement>
1645
1646    <ATTRIB_statement>     ::= "ATTRIB" <establishName> "="
1647                                 <fragAttribBinding>
1648
1649    <fragAttribBinding>    ::= "fragment" "." <fragAttribItem>
1650
1651    <fragAttribItem>       ::= "color" <optColorType>
1652                             | "texcoord" <optTexCoordNum>
1653                             | "fogcoord"
1654                             | "position"
1655
1656    <PARAM_statement>      ::= <PARAM_singleStmt>
1657                             | <PARAM_multipleStmt>
1658
1659    <PARAM_singleStmt>     ::= "PARAM" <establishName> <paramSingleInit>
1660
1661    <PARAM_multipleStmt>   ::= "PARAM" <establishName> "[" <optArraySize> "]"
1662                                   <paramMultipleInit>
1663
1664    <optArraySize>         ::= ""
1665                             | <integer> from 1 to MAX_PROGRAM_PARAMETERS_ARB
1666                                 (maximum number of allowed program
1667                                  parameter bindings)
1668
1669    <paramSingleInit>      ::= "=" <paramSingleItemDecl>
1670
1671    <paramMultipleInit>    ::= "=" "{" <paramMultInitList> "}"
1672
1673    <paramMultInitList>    ::= <paramMultipleItem>
1674                             | <paramMultipleItem> "," <paramMultInitList>
1675
1676    <paramSingleItemDecl>  ::= <stateSingleItem>
1677                             | <programSingleItem>
1678                             | <paramConstDecl>
1679
1680    <paramSingleItemUse>   ::= <stateSingleItem>
1681                             | <programSingleItem>
1682                             | <paramConstUse>
1683
1684    <paramMultipleItem>    ::= <stateMultipleItem>
1685                             | <programMultipleItem>
1686                             | <paramConstDecl>
1687
1688    <stateMultipleItem>    ::= <stateSingleItem>
1689                             | "state" "." <stateMatrixRows>
1690
1691    <stateSingleItem>      ::= "state" "." <stateMaterialItem>
1692                             | "state" "." <stateLightItem>
1693                             | "state" "." <stateLightModelItem>
1694                             | "state" "." <stateLightProdItem>
1695                             | "state" "." <stateTexEnvItem>
1696                             | "state" "." <stateFogItem>
1697                             | "state" "." <stateDepthItem>
1698                             | "state" "." <stateMatrixRow>
1699
1700    <stateMaterialItem>    ::= "material" <optFaceType> "." <stateMatProperty>
1701
1702    <stateMatProperty>     ::= "ambient"
1703                             | "diffuse"
1704                             | "specular"
1705                             | "emission"
1706                             | "shininess"
1707
1708    <stateLightItem>       ::= "light" "[" <stateLightNumber> "]" "."
1709                                 <stateLightProperty>
1710
1711    <stateLightProperty>   ::= "ambient"
1712                             | "diffuse"
1713                             | "specular"
1714                             | "position"
1715                             | "attenuation"
1716                             | "spot" "." <stateSpotProperty>
1717                             | "half"
1718
1719    <stateSpotProperty>    ::= "direction"
1720
1721    <stateLightModelItem>  ::= "lightmodel" <stateLModProperty>
1722
1723    <stateLModProperty>    ::= "." "ambient"
1724                             | <optFaceType> "." "scenecolor"
1725
1726    <stateLightProdItem>   ::= "lightprod" "[" <stateLightNumber> "]"
1727                                 <optFaceType> "." <stateLProdProperty>
1728
1729    <stateLProdProperty>   ::= "ambient"
1730                             | "diffuse"
1731                             | "specular"
1732
1733    <stateLightNumber>     ::= <integer> from 0 to MAX_LIGHTS-1
1734
1735    <stateTexEnvItem>      ::= "texenv" <optLegacyTexUnitNum> "."
1736                                 <stateTexEnvProperty>
1737
1738    <stateTexEnvProperty>  ::= "color"
1739
1740    <optLegacyTexUnitNum>  ::= ""
1741                             | "[" <legacyTexUnitNum> "]"
1742
1743    <legacyTexUnitNum>     ::= <integer> from 0 to MAX_TEXTURE_UNITS-1
1744
1745    <stateFogItem>         ::= "fog" "." <stateFogProperty>
1746
1747    <stateFogProperty>     ::= "color"
1748                             | "params"
1749
1750    <stateDepthItem>       ::= "depth" "." <stateDepthProperty>
1751
1752    <stateDepthProperty>   ::= "range"
1753
1754    <stateMatrixRow>       ::= <stateMatrixItem> "." "row" "["
1755                                  <stateMatrixRowNum> "]"
1756
1757    <stateMatrixRows>      ::= <stateMatrixItem> <optMatrixRows>
1758
1759    <optMatrixRows>        ::= ""
1760                             | "." "row" "[" <stateMatrixRowNum> ".."
1761                                  <stateMatrixRowNum> "]"
1762
1763    <stateMatrixItem>      ::= "matrix" "." <stateMatrixName>
1764                               <stateOptMatModifier>
1765
1766    <stateOptMatModifier>  ::= ""
1767                             | "." <stateMatModifier>
1768
1769    <stateMatModifier>     ::= "inverse"
1770                             | "transpose"
1771                             | "invtrans"
1772
1773    <stateMatrixRowNum>    ::= <integer> from 0 to 3
1774
1775    <stateMatrixName>      ::= "modelview" <stateOptModMatNum>
1776                             | "projection"
1777                             | "mvp"
1778                             | "texture" <optTexCoordNum>
1779                             | "palette" "[" <statePaletteMatNum> "]"
1780                             | "program" "[" <stateProgramMatNum> "]"
1781
1782    <stateOptModMatNum>    ::= ""
1783                             | "[" <stateModMatNum> "]"
1784
1785    <stateModMatNum>       ::= <integer> from 0 to MAX_VERTEX_UNITS_ARB-1
1786
1787    <optTexCoordNum>       ::= ""
1788                             | "[" <texCoordNum> "]"
1789
1790    <texCoordNum>          ::= <integer> from 0 to MAX_TEXTURE_COORDS_ARB-1
1791
1792    <statePaletteMatNum>   ::= <integer> from 0 to MAX_PALETTE_MATRICES_ARB-1
1793
1794    <stateProgramMatNum>   ::= <integer> from 0 to MAX_PROGRAM_MATRICES_ARB-1
1795
1796    <programSingleItem>    ::= <progEnvParam>
1797                             | <progLocalParam>
1798
1799    <programMultipleItem>  ::= <progEnvParams>
1800                             | <progLocalParams>
1801
1802    <progEnvParams>        ::= "program" "." "env"
1803                                 "[" <progEnvParamNums> "]"
1804
1805    <progEnvParamNums>     ::= <progEnvParamNum>
1806                             | <progEnvParamNum> ".." <progEnvParamNum>
1807
1808    <progEnvParam>         ::= "program" "." "env"
1809                                 "[" <progEnvParamNum> "]"
1810
1811    <progLocalParams>      ::= "program" "." "local"
1812                                 "[" <progLocalParamNums> "]"
1813
1814    <progLocalParamNums>   ::= <progLocalParamNum>
1815                             | <progLocalParamNum> ".." <progLocalParamNum>
1816
1817    <progLocalParam>       ::= "program" "." "local"
1818                                 "[" <progLocalParamNum> "]"
1819
1820    <progEnvParamNum>      ::= <integer> from 0 to
1821                               MAX_PROGRAM_ENV_PARAMETERS_ARB - 1
1822
1823    <progLocalParamNum>    ::= <integer> from 0 to
1824                               MAX_PROGRAM_LOCAL_PARAMETERS_ARB - 1
1825
1826    <paramConstDecl>       ::= <paramConstScalarDecl>
1827                             | <paramConstVector>
1828
1829    <paramConstUse>        ::= <paramConstScalarUse>
1830                             | <paramConstVector>
1831
1832    <paramConstScalarDecl> ::= <signedFloatConstant>
1833
1834    <paramConstScalarUse>  ::= <floatConstant>
1835
1836    <paramConstVector>     ::= "{" <signedFloatConstant> "}"
1837                             | "{" <signedFloatConstant> ","
1838                                   <signedFloatConstant> "}"
1839                             | "{" <signedFloatConstant> ","
1840                                   <signedFloatConstant> ","
1841                                   <signedFloatConstant> "}"
1842                             | "{" <signedFloatConstant> ","
1843                                   <signedFloatConstant> ","
1844                                   <signedFloatConstant> ","
1845                                   <signedFloatConstant> "}"
1846
1847    <signedFloatConstant>  ::= <optionalSign> <floatConstant>
1848
1849    <floatConstant>        ::= see text
1850
1851    <optionalSign>         ::= ""
1852                             | "-"
1853                             | "+"
1854
1855    <TEMP_statement>       ::= "TEMP" <varNameList>
1856
1857    <varNameList>          ::= <establishName>
1858                             | <establishName> "," <varNameList>
1859
1860    <OUTPUT_statement>     ::= "OUTPUT" <establishName> "="
1861                                 <resultBinding>
1862
1863    <resultBinding>        ::= "result" "." "color"
1864                             | "result" "." "depth"
1865
1866    <optFaceType>          ::= ""
1867                             | "." "front"
1868                             | "." "back"
1869
1870    <optColorType>         ::= ""
1871                             | "." "primary"
1872                             | "." "secondary"
1873
1874    <ALIAS_statement>      ::= "ALIAS" <establishName> "="
1875                                 <establishedName>
1876
1877    <establishName>        ::= <identifier>
1878
1879    <establishedName>      ::= <identifier>
1880
1881    <identifier>           ::= see text
1882
1883    The <integer> rule matches an integer constant.  The integer
1884    consists of a sequence of one or more digits ("0" through "9").
1885
1886    The <floatConstant> rule matches a floating-point constant
1887    consisting of an integer part, a decimal point, a fraction part, an
1888    "e" or "E", and an optionally signed integer exponent.  The integer
1889    and fraction parts both consist of a sequence of one or more digits
1890    ("0" through "9").  Either the integer part or the fraction parts
1891    (not both) may be missing; either the decimal point or the "e" (or
1892    "E") and the exponent (not both) may be missing.
1893
1894    The <identifier> rule matches a sequence of one or more letters ("A"
1895    through "Z", "a" through "z"), digits ("0" through "9), underscores
1896    ("_"), or dollar signs ("$"); the first character must not be a
1897    number.  Upper and lower case letters are considered different
1898    (names are case-sensitive).  The following strings are reserved
1899    keywords and may not be used as identifiers:
1900
1901        ABS, ABS_SAT, ADD, ADD_SAT, ALIAS, ATTRIB, CMP, CMP_SAT, COS,
1902        COS_SAT, DP3, DP3_SAT, DP4, DP4_SAT, DPH, DPH_SAT, DST, DST_SAT,
1903        END, EX2, EX2_SAT, FLR, FLR_SAT, FRC, FRC_SAT, KIL, LG2,
1904        LG2_SAT, LIT, LIT_SAT, LRP, LRP_SAT, MAD, MAD_SAT, MAX, MAX_SAT,
1905        MIN, MIN_SAT, MOV, MOV_SAT, MUL, MUL_SAT, OPTION, OUTPUT, PARAM,
1906        POW, POW_SAT, RCP, RCP_SAT, RSQ, RSQ_SAT, SIN, SIN_SAT, SCS,
1907        SCS_SAT, SGE, SGE_SAT, SLT, SLT_SAT, SUB, SUB_SAT, SWZ, SWZ_SAT,
1908        TEMP, TEX, TEX_SAT, TXB, TXB_SAT, TXP, TXP_SAT, XPD, XPD_SAT,
1909        fragment, program, result, state, and texture.
1910
1911    The error INVALID_OPERATION is generated if a fragment program fails
1912    to load because it is not syntactically correct or for one of the
1913    semantic restrictions described in the following sections.
1914
1915    A successfully loaded fragment program is parsed into a sequence of
1916    instructions.  Each instruction is identified by its tokenized name.
1917    The operation of these instructions when executed is defined in
1918    section 3.11.5.
1919
1920    A successfully loaded program string replaces the program string
1921    previously loaded into the specified program object.  If the
1922    OUT_OF_MEMORY error is generated by ProgramStringARB, no change is
1923    made to the previous contents of the current program object.
1924
1925
1926    3.11.3  Fragment Program Variables
1927
1928    Fragment programs may access a number of different variables during
1929    their execution.  The following sections define the variables that
1930    can be declared and used by a fragment program.
1931
1932    Explicit variable declarations allow a fragment program to establish
1933    a variable name that can be used to refer to a specified resource in
1934    subsequent instructions.  A fragment program will fail to load if it
1935    declares the same variable name more than once or if it refers to a
1936    variable name that has not been previously declared in the program
1937    string.
1938
1939    Implicit variable declarations allow a fragment program to use the
1940    name of certain available resources by name.
1941
1942
1943    3.11.3.1  Fragment Attributes
1944
1945    Fragment program attribute variables are a set of four-component
1946    floating-point vectors holding the attributes of the fragment being
1947    processed.  Fragment attribute variables are read-only during
1948    fragment program execution.
1949
1950    Fragment attribute variables can be declared explicitly using the
1951    <ATTRIB_statement> grammar rule, or implicitly using the
1952    <fragAttribBinding> grammar rule in an executable instruction.
1953
1954    Each fragment attribute variable is bound to a single item of
1955    fragment state according to the <fragAttrBinding> grammar rule.  The
1956    set of GL state that can be bound to a fragment attribute variable
1957    is given in Table X.1.  Fragment attribute variables are initialized
1958    at each fragment program invocation with the current values of the
1959    bound state.
1960
1961      Fragment Attribute Binding  Components  Underlying State
1962      --------------------------  ----------  ----------------------------
1963      fragment.color              (r,g,b,a)   primary color
1964      fragment.color.primary      (r,g,b,a)   primary color
1965      fragment.color.secondary    (r,g,b,a)   secondary color
1966      fragment.texcoord           (s,t,r,q)   texture coordinate, unit 0
1967      fragment.texcoord[n]        (s,t,r,q)   texture coordinate, unit n
1968      fragment.fogcoord           (f,0,0,1)   fog distance/coordinate
1969      fragment.position           (x,y,z,1/w) window position
1970
1971      Table X.1:  Fragment Attribute Bindings.  The "Components" column
1972      indicates the mapping of the state in the "Underlying State"
1973      column.  Bindings containing "[n]" require an integer value of <n>
1974      to select an individual item.
1975
1976    If a fragment attribute binding matches "fragment.color" or
1977    "fragment.color.primary", the "x", "y", "z", and "w" components of
1978    the fragment attribute variable are filled with the "r", "g", "b",
1979    and "a" components, respectively, of the fragment color.  Each
1980    fixed-point color component undergoes an implied conversion to
1981    floating point.  This conversion must leave the values 0 and 1
1982    invariant.
1983
1984    If a fragment attribute binding matches "fragment.color.secondary",
1985    the "x", "y", "z", and "w" components of the fragment attribute
1986    variable are filled with the "r", "g", "b", and "a" components,
1987    respectively, of the fragment secondary color.  Each fixed-point
1988    color component undergoes an implied conversion to floating point.
1989    This conversion must leave the values 0 and 1 invariant.
1990
1991    If a fragment attribute binding matches "fragment.texcoord" or
1992    "fragment.texcoord[n]", the "x", "y", "z", and "w" components of the
1993    fragment attribute variable are filled with the "s", "t", "r", and
1994    "q" components, respectively, of the fragment texture coordinates
1995    for texture unit <n>.  If "[n]" is omitted, texture unit zero is
1996    used.
1997
1998    If a fragment attribute binding matches "fragment.fogcoord", the "x"
1999    component of the fragment attribute variable is filled with either
2000    the fragment eye distance or the fog coordinate, depending on
2001    whether the fog source is set to FRAGMENT_DEPTH_EXT or
2002    FOG_COORDINATE_EXT, respectively.  The "y", "z", and "w" coordinates
2003    are filled with 0, 0, and 1, respectively.
2004
2005    If a fragment attribute binding matches "fragment.position", the "x"
2006    and "y" components of the fragment attribute variable are filled
2007    with the (x,y) window coordinates of the fragment center, relative
2008    to the lower left corner of the window.  The "z" component is filled
2009    with the fragment's z window coordinate.  This z window coordinate
2010    undergoes an implied conversion to floating point.  This conversion
2011    must leave the values 0 and 1 invariant.  The "w" component is
2012    filled with the reciprocal of the fragment's clip w coordinate.
2013
2014    On some implementations, the components of fragment.position may be
2015    generated by interpolating per-vertex position values.  This may
2016    produce x and y window coordinates that don't exactly match those of
2017    the fragment center and z window coordinates that do not exactly
2018    match those generated by fixed-function rasterization.  Therefore,
2019    there is no guaranteed invariance between the final z window
2020    coordinates of fragments processed by fragment programs that write
2021    depth values and fragments processed by any other means, even if the
2022    fragment programs in question simply copy the z value from the
2023    fragment.position binding.
2024
2025
2026    3.11.3.2  Fragment Program Parameters
2027
2028    Fragment program parameter variables are a set of four-component
2029    floating-point vectors used as constants during fragment program
2030    execution.  Fragment program parameters retain their values across
2031    fragment program invocations, although their values can change
2032    between invocations due to GL state changes.
2033
2034    Single program parameter variables and arrays of program parameter
2035    variables can be declared explicitly using the <PARAM_statement>
2036    grammar rule.  Single program parameter variables can also be
2037    declared implicitly using the <paramSingleItemUse> grammar rule in
2038    an executable instruction.
2039
2040    Each single program parameter variable is bound to a constant vector
2041    or to a GL state vector according to the <paramSingleInit> grammar
2042    rule.  Individual items of a program parameter array are bound to
2043    constant vectors or GL state vectors according to the
2044    <programMultipleInit> grammar rule.  The set of GL state that can be
2045    bound to program parameter variables are given in Tables X.2.1
2046    through X.2.4.
2047
2048
2049    Constant Bindings
2050
2051    A program parameter variable can be bound to a scalar or vector
2052    constant using the <paramConstDecl> grammar rule (explicit
2053    declarations) or the <paramConstUse> grammar rule (implicit
2054    declarations).
2055
2056    If a program parameter binding matches the <paramConstScalarDecl> or
2057    <paramConstScalarUse> grammar rules, the corresponding program
2058    parameter variable is bound to the vector (X,X,X,X), where X is the
2059    value of the specified constant.  Note that the
2060    <paramConstScalarUse> grammar rule, used only in implicit
2061    declarations, allows only non-negative constants.  This
2062    disambiguates cases like "-2", which could conceivably be taken to
2063    mean either the vector "(2,2,2,2)" with all components negated or
2064    "(-2,-2,-2,-2)" without negation.  Only the former interpretation is
2065    allowed by the grammar.
2066
2067    If a program parameter binding matches <paramConstVector>, the
2068    corresponding program parameter variable is bound to the vector
2069    (X,Y,Z,W), where X, Y, Z, and W are the values corresponding to the
2070    first, second, third, and fourth match of <signedFloatConstant>.  If
2071    fewer than four constants are specified, Y, Z, and W assume the
2072    values 0.0, 0.0, and 1.0, if their respective constants are not
2073    specified.
2074
2075    Program parameter variables initialized to constant values can never
2076    be modified.
2077
2078
2079    Program Environment/Local Parameter Bindings
2080
2081      Binding                        Components  Underlying State
2082      -----------------------------  ----------  ----------------------------
2083      program.env[a]                 (x,y,z,w)   program environment
2084                                                 parameter a
2085      program.local[a]               (x,y,z,w)   program local parameter a
2086      program.env[a..b]              (x,y,z,w)   program environment
2087                                                 parameters a through b
2088      program.local[a..b]            (x,y,z,w)   program local parameters
2089                                                 a through b
2090
2091      Table X.2.1:  Program Environment/Local Parameter Bindings.  <a>
2092      and <b> indicate parameter numbers, where <a> must be less than or
2093      equal to <b>.
2094
2095    If a program parameter binding matches "program.env[a]" or
2096    "program.local[a]", the four components of the program parameter
2097    variable are filled with the four components of program environment
2098    parameter <a> or program local parameter <a>, respectively.
2099
2100    Additionally, for program parameter array bindings,
2101    "program.env[a..b]" and "program.local[a..b]" are equivalent to
2102    specifying program environment parameters <a> through <b> in order
2103    or program local parameters <a> through <b> in order, respectively.
2104    In either case, a program will fail to load if <a> is greater than
2105    <b>.
2106
2107
2108    Material Property Bindings
2109
2110      Binding                        Components  Underlying State
2111      -----------------------------  ----------  ----------------------------
2112      state.material.ambient         (r,g,b,a)   front ambient material color
2113      state.material.diffuse         (r,g,b,a)   front diffuse material color
2114      state.material.specular        (r,g,b,a)   front specular material color
2115      state.material.emission        (r,g,b,a)   front emissive material color
2116      state.material.shininess       (s,0,0,1)   front material shininess
2117      state.material.front.ambient   (r,g,b,a)   front ambient material color
2118      state.material.front.diffuse   (r,g,b,a)   front diffuse material color
2119      state.material.front.specular  (r,g,b,a)   front specular material color
2120      state.material.front.emission  (r,g,b,a)   front emissive material color
2121      state.material.front.shininess (s,0,0,1)   front material shininess
2122      state.material.back.ambient    (r,g,b,a)   back ambient material color
2123      state.material.back.diffuse    (r,g,b,a)   back diffuse material color
2124      state.material.back.specular   (r,g,b,a)   back specular material color
2125      state.material.back.emission   (r,g,b,a)   back emissive material color
2126      state.material.back.shininess  (s,0,0,1)   back material shininess
2127
2128      Table X.2.2:  Material Property Bindings.  If a material face is
2129      not specified in the binding, the front property is used.
2130
2131    If a program parameter binding matches any of the material
2132    properties listed in Table X.2.2, the program parameter variable is
2133    filled according to the table.  For ambient, diffuse, specular, or
2134    emissive colors, the "x", "y", "z", and "w" components are filled
2135    with the "r", "g", "b", and "a" components, respectively, of the
2136    corresponding material color.  For material shininess, the "x"
2137    component is filled with the material's specular exponent, and the
2138    "y", "z", and "w" components are filled with 0, 0, and 1,
2139    respectively.  Bindings containing ".back" refer to the back
2140    material; all other bindings refer to the front material.
2141
2142    Material properties can be changed inside a Begin/End pair, either
2143    directly by calling Material, or indirectly through color material.
2144    However, such property changes are not guaranteed to update program
2145    parameter bindings until the following End command.  Program
2146    parameter variables bound to material properties changed inside a
2147    Begin/End pair are undefined until the following End command.
2148
2149
2150    Light Property Bindings
2151
2152      Binding                        Components  Underlying State
2153      -----------------------------  ----------  ----------------------------
2154      state.light[n].ambient         (r,g,b,a)   light n ambient color
2155      state.light[n].diffuse         (r,g,b,a)   light n diffuse color
2156      state.light[n].specular        (r,g,b,a)   light n specular color
2157      state.light[n].position        (x,y,z,w)   light n position
2158      state.light[n].attenuation     (a,b,c,e)   light n attenuation constants
2159                                                 and spot light exponent
2160      state.light[n].spot.direction  (x,y,z,c)   light n spot direction and
2161                                                 cutoff angle cosine
2162      state.light[n].half            (x,y,z,1)   light n infinite half-angle
2163      state.lightmodel.ambient       (r,g,b,a)   light model ambient color
2164      state.lightmodel.scenecolor    (r,g,b,a)   light model front scene color
2165      state.lightmodel      .        (r,g,b,a)   light model front scene color
2166               front.scenecolor
2167      state.lightmodel      .        (r,g,b,a)   light model back scene color
2168               back.scenecolor
2169      state.lightprod[n].ambient     (r,g,b,a)   light n / front material
2170                                                 ambient color product
2171      state.lightprod[n].diffuse     (r,g,b,a)   light n / front material
2172                                                 diffuse color product
2173      state.lightprod[n].specular    (r,g,b,a)   light n / front material
2174                                                 specular color product
2175      state.lightprod[n].            (r,g,b,a)   light n / front material
2176              front.ambient                      ambient color product
2177      state.lightprod[n].            (r,g,b,a)   light n / front material
2178              front.diffuse                      diffuse color product
2179      state.lightprod[n].            (r,g,b,a)   light n / front material
2180              front.specular                     specular color product
2181      state.lightprod[n].            (r,g,b,a)   light n / back material
2182              back.ambient                       ambient color product
2183      state.lightprod[n].            (r,g,b,a)   light n / back material
2184              back.diffuse                       diffuse color product
2185      state.lightprod[n].            (r,g,b,a)   light n / back material
2186              back.specular                      specular color product
2187
2188      Table X.2.3: Light Property Bindings.  <n> indicates a light
2189      number.
2190
2191    If a program parameter binding matches "state.light[n].ambient",
2192    "state.light[n].diffuse", or "state.light[n].specular", the "x",
2193    "y", "z", and "w" components of the program parameter variable are
2194    filled with the "r", "g", "b", and "a" components, respectively, of
2195    the corresponding light color.
2196
2197    If a program parameter binding matches "state.light[n].position",
2198    the "x", "y", "z", and "w" components of the program parameter
2199    variable are filled with the "x", "y", "z", and "w" components,
2200    respectively, of the light position.
2201
2202    If a program parameter binding matches "state.light[n].attenuation",
2203    the "x", "y", and "z" components of the program parameter variable
2204    are filled with the constant, linear, and quadratic attenuation
2205    parameters of the specified light, respectively (section 2.13.1).
2206    The "w" component of the program parameter variable is filled with
2207    the spot light exponent of the specified light.
2208
2209    If a program parameter binding matches
2210    "state.light[n].spot.direction", the "x", "y", and "z" components of
2211    the program parameter variable are filled with the "x", "y", and "z"
2212    components of the spot light direction of the specified light,
2213    respectively (section 2.13.1).  The "w" component of the program
2214    parameter variable is filled with the cosine of the spot light
2215    cutoff angle of the specified light.
2216
2217    If a program parameter binding matches "state.light[n].half", the
2218    "x", "y", and "z" components of the program parameter variable are
2219    filled with the x, y, and z components, respectively, of the
2220    normalized infinite half-angle vector
2221
2222      h_inf = || P + (0, 0, 1) ||.
2223
2224    The "w" component is filled with 1.  In the computation of h_inf, P
2225    consists of the x, y, and z coordinates of the normalized vector
2226    from the eye position P_e to the eye-space light position P_pli
2227    (section 2.13.1).  h_inf is defined to correspond to the normalized
2228    half-angle vector when using an infinite light (w coordinate of the
2229    position is zero) and an infinite viewer (v_bs is FALSE).  For local
2230    lights or a local viewer, h_inf is well-defined but does not match
2231    the normalized half-angle vector, which will vary depending on the
2232    vertex position.
2233
2234    If a program parameter binding matches "state.lightmodel.ambient",
2235    the "x", "y", "z", and "w" components of the program parameter
2236    variable are filled with the "r", "g", "b", and "a" components of
2237    the light model ambient color, respectively.
2238
2239    If a program parameter binding matches "state.lightmodel.scenecolor"
2240    or "state.lightmodel.front.scenecolor", the "x", "y", and "z"
2241    components of the program parameter variable are filled with the
2242    "r", "g", and "b" components respectively of the "front scene color"
2243
2244      c_scene = a_cs * a_cm + e_cm,
2245
2246    where a_cs is the light model ambient color, a_cm is the front
2247    ambient material color, and e_cm is the front emissive material
2248    color.  The "w" component of the program parameter variable is
2249    filled with the alpha component of the front diffuse material color.
2250    If a program parameter binding matches
2251    "state.lightmodel.back.scenecolor", a similar back scene color,
2252    computed using back-facing material properties, is used.  The front
2253    and back scene colors match the values that would be assigned to
2254    vertices using conventional lighting if all lights were disabled.
2255
2256    If a program parameter binding matches anything beginning with
2257    "state.lightprod[n]", the "x", "y", and "z" components of the
2258    program parameter variable are filled with the "r", "g", and "b"
2259    components, respectively, of the corresponding light product.  The
2260    three light product components are the products of the corresponding
2261    color components of the specified material property and the light
2262    color of the specified light (see Table X.2.3).  The "w" component
2263    of the program parameter variable is filled with the alpha component
2264    of the specified material property.
2265
2266    Light products depend on material properties, which can be changed
2267    inside a Begin/End pair.  Such property changes are not guaranteed
2268    to take effect until the following End command.  Program parameter
2269    variables bound to light products whose corresponding material
2270    property changes inside a Begin/End pair are undefined until the
2271    following End command.
2272
2273
2274    Texture Environment Property Bindings
2275
2276      Binding                    Components  Underlying State
2277      -------------------------  ----------  ----------------------------
2278      state.texenv[n].color      (r,g,b,a)   texture environment n color
2279
2280      Table X.2.4:  Texture Environment Property Bindings.  "[n]" is
2281      optional -- texture unit <n> is used if specified; texture unit 0
2282      is used otherwise.
2283
2284    If a program parameter binding matches "state.texenv[n].color", the
2285    "x", "y", "z", and "w" components of the program parameter variable
2286    are filled with the "r", "g", "b", and "a" components, respectively,
2287    of the corresponding texture environment color.  Note that only
2288    "legacy" texture units, as queried by MAX_TEXTURE_UNITS, include
2289    texture environment state.  Texture image units and texture
2290    coordinate sets do not have associated texture environment state.
2291
2292
2293    Fog Property Bindings
2294
2295      Binding                      Components  Underlying State
2296      ---------------------------  ----------  ----------------------------
2297      state.fog.color              (r,g,b,a)   RGB fog color (section 3.11)
2298      state.fog.params             (d,s,e,r)   fog density, linear start
2299                                               and end, and 1/(end-start)
2300                                               (section 3.11)
2301
2302      Table X.2.5:  Fog Property Bindings
2303
2304    If a program parameter binding matches "state.fog.color", the "x",
2305    "y", "z", and "w" components of the program parameter variable are
2306    filled with the "r", "g", "b", and "a" components, respectively, of
2307    the fog color (section 3.11).
2308
2309    If a program parameter binding matches "state.fog.params", the "x",
2310    "y", and "z" components of the program parameter variable are filled
2311    with the fog density, linear fog start, and linear fog end
2312    parameters (section 3.11), respectively.  The "w" component is
2313    filled with 1/(end-start), where end and start are the linear fog
2314    end and start parameters, respectively.
2315
2316
2317    Depth Property Bindings
2318
2319      Binding                      Components  Underlying State
2320      ---------------------------  ----------  ----------------------------
2321      state.depth.range            (n,f,d,1)   Depth range near, far, and
2322                                               (far-near) (section 2.10.1)
2323
2324      Table X.2.6:  Depth Property Bindings
2325
2326    If a program parameter binding matches "state.depth.range", the "x"
2327    and "y" components of the program parameter variable are filled with
2328    the mappings of near and far clipping planes to window coordinates,
2329    respectively.  The "z" component is filled with the difference of
2330    the mappings of near and far clipping planes, far minus near.  The
2331    "w" component is filled with 1.
2332
2333
2334    Matrix Property Bindings
2335
2336      Binding                               Underlying State
2337      ------------------------------------  ---------------------------
2338      * state.matrix.modelview[n]           modelview matrix n
2339        state.matrix.projection             projection matrix
2340        state.matrix.mvp                    modelview-projection matrix
2341      * state.matrix.texture[n]             texture matrix n
2342        state.matrix.palette[n]             modelview palette matrix n
2343        state.matrix.program[n]             program matrix n
2344
2345      Table X.2.7:  Base Matrix Property Bindings.  The "[n]" syntax
2346      indicates a specific matrix number.  For modelview and texture
2347      matrices, a matrix number is optional, and matrix zero will be
2348      used if the matrix number is omitted.  These base bindings may
2349      further be modified by a inverse/transpose selector and a row
2350      selector.
2351
2352    If the beginning of a program parameter binding matches any of the
2353    matrix binding names listed in Table X.2.7, the binding corresponds
2354    to a 4x4 matrix.  If the parameter binding is followed by
2355    ".inverse", ".transpose", or ".invtrans" (<stateMatModifier> grammar
2356    rule), the inverse, transpose, or transpose of the inverse,
2357    respectively, of the matrix specified in Table X.2.7 is selected.
2358    Otherwise, the matrix specified in Table X.2.7 is selected.  If the
2359    specified matrix is poorly-conditioned (singular or nearly so), its
2360    inverse matrix is undefined.  The binding name "state.matrix.mvp"
2361    refers to the product of modelview matrix zero and the projection
2362    matrix, defined as
2363
2364       MVP = P * M0,
2365
2366    where P is the projection matrix and M0 is modelview matrix zero.
2367
2368    If the selected matrix is followed by ".row[<a>]" (matching the
2369    <stateMatrixRow> grammar rule), the "x", "y", "z", and "w"
2370    components of the program parameter variable are filled with the
2371    four entries of row <a> of the selected matrix.  In the example,
2372
2373      PARAM m0 = state.matrix.modelview[1].row[0];
2374      PARAM m1 = state.matrix.projection.transpose.row[3];
2375
2376    the variable "m0" is set to the first row (row 0) of modelview
2377    matrix 1 and "m1" is set to the last row (row 3) of the transpose of
2378    the projection matrix.
2379
2380    For program parameter array bindings, multiple rows of the selected
2381    matrix can be bound via the <stateMatrixRows> grammar rule.  If the
2382    selected matrix binding is followed by ".row[<a>..<b>]", the result
2383    is equivalent to specifying matrix rows <a> through <b>, in order.
2384    A program will fail to load if <a> is greater than <b>.  If no row
2385    selection is specified (<optMatrixRows> matches ""), matrix rows 0
2386    through 3 are bound in order.  In the example,
2387
2388      PARAM m2[] = { state.matrix.program[0].row[1..2] };
2389      PARAM m3[] = { state.matrix.program[0].transpose };
2390
2391    the array "m2" has two entries, containing rows 1 and 2 of program
2392    matrix zero, and "m3" has four entries, containing all four rows of
2393    the transpose of program matrix zero.
2394
2395
2396    Program Parameter Arrays
2397
2398    A program parameter array variable can be declared explicitly by
2399    matching the <PARAM_multipleStmt> grammar rule.  Programs can
2400    optionally specify the number of individual program parameters in
2401    the array, using the <optArraySize> grammar rule.  Program parameter
2402    arrays may not be declared implicity.
2403
2404    Individual parameter variables in a program parameter array are
2405    bound to GL state vectors or constant vectors as specified by the
2406    grammar rule <paramMultInitList>.  Each individual parameter in the
2407    array is bound in turn as described above.
2408
2409    The total number of entries in the array is equal to the number of
2410    parameters bound in the initializer list.  A fragment program that
2411    specifies an array size (<optArraySize> matches <integer>) that does
2412    not match the number of parameter bindings in the initialization
2413    list will fail to load.
2414
2415    Program parameter array variables may only be accessed using
2416    absolute addressing by matching the <progParamArrayAbs> grammar
2417    rule.  Array accesses are checked against the limits of the array.
2418    If any fragment program instruction accesses a program parameter
2419    array with an out-of-range index (greater than or equal to the size
2420    of the array), the fragment program will fail to load.
2421
2422    Individual state vectors can have no more than one unique binding in
2423    any given program.  The GL will automatically combine multiple
2424    bindings of the same state vector into a single unique binding.
2425
2426
2427    3.11.3.3  Fragment Program Temporaries
2428
2429    Fragment program temporary variables are a set of four-component
2430    floating-point vectors used to hold temporary results during
2431    fragment program execution.  Temporaries do not persist between
2432    program invocations, and are undefined at the beginning of each
2433    fragment program invocation.
2434
2435    Fragment program temporary variables can be declared explicitly
2436    using the <TEMP_statement> grammar rule.  Each such statement can
2437    declare one or more temporaries.  Fragment program temporary
2438    variables can not be declared implicitly.
2439
2440
2441    3.11.3.4  Fragment Program Results
2442
2443    Fragment program result variables are a set of four component
2444    floating-point vectors used to hold the final results of a fragment
2445    program.  Fragment program result variables are write-only during
2446    fragment program execution.
2447
2448    Fragment program result variables can be declared explicitly using
2449    the <OUTPUT_statement> grammar rule, or implicitly using the
2450    <resultBinding> grammar rule in an executable instruction.  Each
2451    fragment program result variable is bound to a fragment attribute
2452    used in subsequent back-end processing.  The set of fragment program
2453    result variable bindings is given in Table X.3.
2454
2455      Binding                        Components  Description
2456      -----------------------------  ----------  ----------------------------
2457      result.color                   (r,g,b,a)   color
2458      result.depth                   (*,*,d,*)   depth coordinate
2459
2460      Table X.3:  Fragment Result Variable Bindings.  Components labeled
2461      "*" are unused.
2462
2463    If a result variable binding matches "result.color", updates to the
2464    "x", "y", "z", and "w" components of the result variable modify the
2465    "r", "g", "b", and "a" components, respectively, of the fragment's
2466    output color.  If "result.color" is not both bound by the fragment
2467    program and written by some instruction of the program, the output
2468    color of the fragment program is undefined.
2469
2470    If a result variable binding matches "result.depth", updates to the
2471    "z" component of the result variable modify the fragment's output
2472    depth value.  If "result.depth" is not both bound by the fragment
2473    program and written by some instruction of the program, the
2474    interpolated depth value produced by rasterization is used as if
2475    fragment program mode is not enabled.  Writes to any component of
2476    depth other than the "z" component have no effect.
2477
2478
2479    3.11.3.5  Fragment Program Aliases
2480
2481    Fragment programs can create aliases by matching the
2482    <ALIAS_statement> grammar rule.  Aliases allow programs to use
2483    multiple variable names to refer to a single underlying variable.
2484    For example, the statement
2485
2486      ALIAS var1 = var0
2487
2488    establishes a variable name named "var1".  Subsequent references to
2489    "var1" in the program text are treated as references to "var0".  The
2490    left hand side of an ALIAS statement must be a new variable name,
2491    and the right hand side must be an established variable name.
2492
2493    Aliases are not considered variable declarations, so do not count
2494    against the limits on the number of variable declarations allowed in
2495    the program text.
2496
2497
2498    3.11.3.6  Fragment Program Resource Limits
2499
2500    The fragment program execution environment provides implementation-
2501    dependent resource limits on the number of ALU instructions, texture
2502    instructions, total instructions (ALU or texture), temporary
2503    variable declarations, program parameter bindings, or texture
2504    indirections.  A program that exceeds any of these resource limits
2505    will fail to load.  The resource limits for fragment programs can be
2506    queried by calling GetProgramiv (section 6.1.12) with a target of
2507    FRAGMENT_PROGRAM_ARB.
2508
2509    The limit on fragment program ALU instructions can be queried with
2510    a <pname> of MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, and must be at least
2511    48.  Each ALU instruction in the program (matches of the
2512    <ALUInstruction> grammar rule) counts against this limit.
2513
2514    The limit on fragment program texture instructions can be queried
2515    with a <pname> of MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, and must be at
2516    least 24.  Each texture instruction in the program (matches of the
2517    <TexInstruction> grammar rule) counts against this limit.
2518
2519    The limit on fragment program total instructions can be queried with
2520    a <pname> of MAX_PROGRAM_INSTRUCTIONS_ARB, and must be at least 72.
2521    Each instruction in the program (matching the <instruction> grammar
2522    rule) counts against this limit.  Note that the limit on total
2523    instructions is not necessarily equal to the sum of the limits on
2524    ALU instructions and texture instructions.
2525
2526    The limit on fragment program texture indirections can be queried
2527    with a <pname> of MAX_PROGRAM_TEX_INDIRECTIONS_ARB, and must be at
2528    least 4.  Texture indirections are described in 3.11.6.  If an
2529    implementation has no limit on texture indirections, the limit will
2530    be equal to the limit on texture instructions.
2531
2532    The limit on fragment program temporary variable declarations can be
2533    queried with a <pname> of MAX_PROGRAM_TEMPORARIES_ARB, and must be at
2534    least 16.  Each temporary declared in the program, using the
2535    <TEMP_statement> grammar rule, counts against this limit.  Aliases
2536    of declared temporaries do not.
2537
2538    The limit on fragment program attribute bindings can be queried with
2539    a <pname> of MAX_PROGRAM_ATTRIBS_ARB and must be at least 10.  Each
2540    distinct vertex attribute bound explicitly or implicitly in the
2541    program counts against this limit; vertex attributes bound multiple
2542    times count only once.
2543
2544    The limit on fragment program parameter bindings can be queried with
2545    a <pname> of MAX_PROGRAM_PARAMETERS_ARB, and must be at least 24.
2546    Each distinct GL state vector bound explicitly or implicitly in the
2547    program counts against this limit; GL state vectors bound multiple
2548    times count only once.  Every other constant vector bound in the
2549    program is counted if and only if an identical constant vector has
2550    not already been counted.  Two constant vectors are considered
2551    identical if the four component values are numerically equivalent.
2552    Recall that scalar constants bound in a program are treated as
2553    vector constants with the scalar value replicated.
2554
2555    In addition to the limits described above, the GL provides a similar
2556    set of implementation-dependent native resource limits.  These
2557    limits, specified in Section 6.1.12, provide guidance as to whether
2558    the program is small enough to use a "native" mode where fragment
2559    programs may be executed with higher performance.  The native
2560    resource limits and usage counts are implementation-dependent and
2561    may not exactly correspond to limits and counts described above.
2562    A program's native resource consumption may be reduced by program
2563    optimizations performed by the GL.  Native resource consumption may
2564    be increased due to emulation of instructions or any other program
2565    features not natively supported by an implementation.  Notably, an
2566    additional texture indirection may be consumed due to an
2567    implementation's lack of native support for texture instructions
2568    with source coordinate swizzles or parameter source coordinates,
2569    which may require emulation by prepending ALU instructions.  An
2570    implementation may also fail to natively support all combinations of
2571    attributes described in Table X.1, even if the total number of
2572    bound attributes is fewer than the native attribute limit.  In this
2573    case the program is still considered to exceed the native resource
2574    limits, as queried by PROGRAM_UNDER_NATIVE_LIMITS_ARB (section
2575    6.1.12).
2576
2577    To assist in resource counting, the GL additionally provides
2578    GetProgram queries to determine the resource usage and native
2579    resource usage of the currently bound program, and to determine
2580    whether the bound program exceeds any native resource limit.
2581
2582    Programs that exceed any native resource limit may or may not load
2583    depending on the implementation.
2584
2585
2586    3.11.4  Fragment Program Execution Environment
2587
2588    If fragment program mode is enabled, the currently bound fragment
2589    program is executed when any fragment is produced by rasterization.
2590
2591    If fragment program mode is enabled and the currently bound program
2592    object does not contain a valid fragment program, the error
2593    INVALID_OPERATION will be generated by Begin, RasterPos, and any
2594    command that implicitly calls Begin (e.g., DrawArrays).
2595
2596    Fragment programs execute a sequence of instructions without
2597    branching.  Fragment programs begin by executing the first
2598    instruction in the program, and execute instructions in the order
2599    specified in the program until the last instruction is completed.
2600
2601    There are 33 fragment program instructions.  The instructions and
2602    their respective input and output parameters are summarized in
2603    Table X.5.
2604
2605      Instruction    Inputs  Output   Description
2606      -----------    ------  ------   --------------------------------
2607      ABS            v       v        absolute value
2608      ADD            v,v     v        add
2609      CMP            v,v,v   v        compare
2610      COS            s       ssss     cosine with reduction to [-PI,PI]
2611      DP3            v,v     ssss     3-component dot product
2612      DP4            v,v     ssss     4-component dot product
2613      DPH            v,v     ssss     homogeneous dot product
2614      DST            v,v     v        distance vector
2615      EX2            s       ssss     exponential base 2
2616      FLR            v       v        floor
2617      FRC            v       v        fraction
2618      KIL            v       v        kill fragment
2619      LG2            s       ssss     logarithm base 2
2620      LIT            v       v        compute light coefficients
2621      LRP            v,v,v   v        linear interpolation
2622      MAD            v,v,v   v        multiply and add
2623      MAX            v,v     v        maximum
2624      MIN            v,v     v        minimum
2625      MOV            v       v        move
2626      MUL            v,v     v        multiply
2627      POW            s,s     ssss     exponentiate
2628      RCP            s       ssss     reciprocal
2629      RSQ            s       ssss     reciprocal square root
2630      SCS            s       ss--     sine/cosine without reduction
2631      SGE            v,v     v        set on greater than or equal
2632      SIN            s       ssss     sine with reduction to [-PI,PI]
2633      SLT            v,v     v        set on less than
2634      SUB            v,v     v        subtract
2635      SWZ            v       v        extended swizzle
2636      TEX            v,u,t   v        texture sample
2637      TXB            v,u,t   v        texture sample with bias
2638      TXP            v,u,t   v        texture sample with projection
2639      XPD            v,v     v        cross product
2640
2641      Table X.5:  Summary of fragment program instructions.  "v"
2642      indicates a floating-point vector input or output, "s" indicates a
2643      floating-point scalar input, "ssss" indicates a scalar output
2644      replicated across a 4-component result vector, "ss--" indicates
2645      two scalar outputs in the first two components, "u" indicates a
2646      texture image unit identifier, and "t" indicates a texture target.
2647
2648
2649    3.11.4.1  Fragment Program Operands
2650
2651    Most fragment program instructions operate on floating-point vectors
2652    or scalars, as indicated by the grammar rules <vectorSrcReg> and
2653    <scalarSrcReg>, respectively.
2654
2655    Vector and scalar operands can be obtained from fragment attribute,
2656    program parameter, or temporary registers, as indicated by the
2657    <srcReg> rule.  For scalar operands, a single vector component is
2658    selected by the <scalarSuffix> rule, where the characters "x", "y",
2659    "z", and "w", or "r", "g", "b", and "a" select the first, second,
2660    third, and fourth components, respectively, of the vector.
2661
2662    Vector operands can be swizzled according to the <optionalSuffix>
2663    rule.  In its most general form, the <optionalSuffix> rule matches
2664    the pattern ".????" where each question mark is replaced with one of
2665    "x", "y", "z", "w", "r", "g", "b", or "a".  For such patterns, the
2666    first, second, third, and fourth components of the operand are taken
2667    from the vector components named by the first, second, third, and
2668    fourth character of the pattern, respectively.  For example, if the
2669    swizzle suffix is ".yzzx" or ".gbbr" and the specified source
2670    contains {2,8,9,0}, the swizzled operand used by the instruction is
2671    {8,9,9,2}.
2672
2673    If the <optionalSuffix> rule matches "", it is treated as though it
2674    were ".xyzw".  If the <optionalSuffix> rule matches (ignoring
2675    whitespace) ".x", ".y", ".z", or ".w", these are treated the same as
2676    ".xxxx", ".yyyy", ".zzzz", and ".wwww" respectively.  Likewise, if
2677    the <optionalSuffix> rule matches ".r", ".g", ".b", or ".a", these
2678    are treated the same as ".rrrr", ".gggg", ".bbbb", and ".aaaa"
2679    respectively.
2680
2681    Floating-point scalar or vector operands can optionally be negated
2682    according to the <optionalSign> rule in <scalarSrcReg> and
2683    <vectorSrcReg>.  If the <optionalSign> matches "-", each operand or
2684    operand component is negated.
2685
2686    The following pseudo-code spells out the operand generation process.
2687    In the example, "float" is a floating-point scalar type, while
2688    "floatVec" is a four-component vector.  "source" refers to the
2689    register used for the operand, matching the <srcReg> rule.  "negate"
2690    is TRUE if the <optionalSign> rule in <scalarSrcReg> or
2691    <vectorSrcReg> matches "-" and FALSE otherwise.  The ".c***",
2692    ".*c**", ".**c*", ".***c" modifiers refer to the x, y, z, and w
2693    components obtained by the swizzle operation; the ".c" modifier
2694    refers to the single component selected for a scalar load.
2695
2696      floatVec VectorLoad(floatVec source)
2697      {
2698          floatVec operand;
2699
2700          operand.x = source.c***;
2701          operand.y = source.*c**;
2702          operand.z = source.**c*;
2703          operand.w = source.***c;
2704          if (negate) {
2705             operand.x = -operand.x;
2706             operand.y = -operand.y;
2707             operand.z = -operand.z;
2708             operand.w = -operand.w;
2709          }
2710
2711          return operand;
2712      }
2713
2714      float ScalarLoad(floatVec source)
2715      {
2716          float operand;
2717
2718          operand = source.c;
2719          if (negate) {
2720            operand = -operand;
2721          }
2722
2723          return operand;
2724      }
2725
2726
2727    3.11.4.2  Fragment Program Parameter Arrays
2728
2729    A fragment program can load a single element of a program parameter
2730    array using only absolute addressing.  Program parameter arrays are
2731    accessed when the <progParamArrayAbs> rule is matched.  The offset
2732    of the selected entry in the array is given by the number matching
2733    <progParamRegNum>.  If the offset exceeds the size of the
2734    array, the results of the access are undefined, but may not lead to
2735    program or GL termination.
2736
2737
2738    3.11.4.3  Fragment Program Destination Register Update
2739
2740    Fragment program instructions write a 4-component result vector to a
2741    single temporary or fragment result register.  Writes to individual
2742    components of the destination register are controlled by individual
2743    component write masks specified as part of the instruction.
2744    Optional clamping of each component of the destination register to
2745    the range [0,1] is controlled by an opcode modifier.
2746
2747    The component write mask is specified by the <optionalMask> rule
2748    found in the <maskedDstReg> rule.  If the optional mask is "", all
2749    components are enabled.  Otherwise, the optional mask names the
2750    individual components to enable.  The characters "x", "y", "z", and
2751    "w", or "r", "g", "b", and "a" match the first, second, third, and
2752    fourth components, respectively.  For example, an optional mask of
2753    ".xzw" indicates that the x, z, and w components should be enabled
2754    for writing but the y component should not.  The grammar requires
2755    that the destination register mask components must be listed in
2756    "xyzw", or "rgba" order.  Component names from one set (xyzw or
2757    rgba) cannot be mixed with component names from another set.  For
2758    example, ".rgw" is not a valid writemask.
2759
2760    Each component of the destination register is updated with the
2761    result of the fragment program instruction if and only if the
2762    component is enabled for writes by the component write mask.
2763    Otherwise, the component of the destination register remains
2764    unchanged.
2765
2766    If the instruction opcode has the "_SAT" suffix, requesting
2767    saturated result vectors, each component of the result vector
2768    enabled in the writemask is clamped to the range [0,1] before being
2769    updated in the destination register.
2770
2771    The following pseudocode illustrates the process of writing a result
2772    vector to the destination register.  In the pseudocode, "instrmask"
2773    refers to the component write mask given by the <optionalMask> rule.
2774    "clamp" is TRUE if the instruction specifies that the result should
2775    be clamped.  "result" and "destination" refer to the result vector
2776    and the register selected by <dstReg>, respectively.
2777
2778      void UpdateDestination(floatVec destination, floatVec result)
2779      {
2780          floatVec merged;
2781
2782          // Clamp the result vector components to [0,1], if requested.
2783          if (instrClamp) {
2784              if (result.x < 0)      result.x = 0;
2785              else if (result.x > 1) result.x = 1;
2786              if (result.y < 0)      result.y = 0;
2787              else if (result.y > 1) result.y = 1;
2788              if (result.z < 0)      result.z = 0;
2789              else if (result.z > 1) result.z = 1;
2790              if (result.w < 0)      result.w = 0;
2791              else if (result.w > 1) result.w = 1;
2792          }
2793
2794          // Merge the converted result into the destination register,
2795          // under control of the compile-time write mask.
2796          merged = destination;
2797          if (instrMask.x) {
2798              merged.x = result.x;
2799          }
2800          if (instrMask.y) {
2801              merged.y = result.y;
2802          }
2803          if (instrMask.z) {
2804              merged.z = result.z;
2805          }
2806          if (instrMask.w) {
2807              merged.w = result.w;
2808          }
2809
2810          // Write out the new destination register.
2811          destination = merged;
2812      }
2813
2814
2815    3.11.4.4  Fragment Program Result Processing
2816
2817    As a fragment program executes, it will write to either one or two
2818    result registers that are mapped to the fragment's color and depth.
2819
2820    The fragment's color components are first clamped to the range [0,1]
2821    then converted to fixed point as in section 2.13.9.  If the fragment
2822    program does not write result.color, the color will be undefined in
2823    subsequent stages.
2824
2825    If the fragment program contains an instruction to write to
2826    result.depth, the fragment's depth is replaced by the value of the
2827    "z" component of result.depth.  This z value is first clamped to the
2828    range [0,1] then converted to fixed-point as if it were a window z
2829    value (section 2.10.1).  If the fragment program does not write
2830    result.depth, the fragment's original depth is unmodified.
2831
2832
2833    3.11.4.5  Fragment Program Options
2834
2835    The <optionSequence> grammar rule provides a mechanism for programs
2836    to indicate that one or more extended language features are used by
2837    the program.  All program options used by the program must be
2838    declared at the beginning of the program string.  Each program
2839    option specified in a program string will modify the syntactic or
2840    semantic rules used to interpet the program and the execution
2841    environment used to execute the program.  Program options not
2842    present in the program string are ignored, even if they are
2843    supported by the GL.
2844
2845    The <identifier> token in the <option> rule must match the name of a
2846    program option supported by the implementation.  To avoid option
2847    name conflicts, option identifiers are required to begin with a
2848    vendor prefix.  A program will fail to load if it specifies a
2849    program option not supported by the GL.
2850
2851    Fragment program options should confine their semantic changes to
2852    the domain of fragment programs.  Support for a fragment program
2853    option should not change the specification and behavior of fragment
2854    programs not requesting use of that option.
2855
2856
2857    3.11.4.5.1  Fog Application Fragment Program Options
2858
2859    If a fragment program specifies one of the options "ARB_fog_exp",
2860    "ARB_fog_exp2", or "ARB_fog_linear", the program will apply fog to
2861    the program's final clamped color using a fog mode of EXP, EXP2, or
2862    LINEAR, respectively, as described in section 3.10.
2863
2864    When a fog option is specified in a fragment program, semantic
2865    restrictions are added to indicate that a fragment program
2866    will fail to load if the number of temporaries it contains exceeds
2867    the implementation-dependent limit minus 1, if the number of
2868    attributes it contains exceeds the implementation-dependent limit
2869    minus 1, or if the number of parameters it contains exceeds the
2870    implementation-dependent limit minus 2.
2871
2872    Additionally, when the ARB_fog_exp option is specified in a fragment
2873    program, a semantic restriction is added to indicate that a fragment
2874    program will fail to load if the number of instructions or ALU
2875    instructions it contains exceeds the implementation-dependent limit
2876    minus 3.  When the ARB_fog_exp2 option is specified in a fragment
2877    program, a semantic restriction is added to indicate that a fragment
2878    program will fail to load if the number of instructions or ALU
2879    instructions it contains exceeds the implementation-dependent limit
2880    minus 4.  When the ARB_fog_linear option is specified in a fragment
2881    program, a semantic restriction is added to indicate that a fragment
2882    program will fail to load if the number of instructions or ALU
2883    instructions it contains exceeds the implementation-dependent limit
2884    minus 2.
2885
2886    Only one fog application option may be specified by any given
2887    fragment program.  A fragment program that specifies more than one
2888    of the program options "ARB_fog_exp", "ARB_fog_exp2", and
2889    "ARB_fog_linear", will fail to load.
2890
2891
2892    3.11.4.5.2  Precision Hint Options
2893
2894    Fragment program computations are carried out at an implementation-
2895    dependent precision.  However, some implementations may be able to
2896    perform fragment program computations at more than one precision,
2897    and may be able to trade off computation precision for performance.
2898
2899    If a fragment program specifies the "ARB_precision_hint_fastest"
2900    program option, implementations should select precision to minimize
2901    program execution time, with possibly reduced precision.  If a
2902    fragment program specifies the "ARB_precision_hint_nicest" program
2903    option, implementations should maximize the precision, with possibly
2904    increased execution time.
2905
2906    Only one precision control option may be specified by any given
2907    fragment program.  A fragment program that specifies both the
2908    "ARB_precision_hint_fastest" and "ARB_precision_hint_nicest" program
2909    options will fail to load.
2910
2911
2912    3.11.5  Fragment Program ALU Instruction Set
2913
2914    The following sections describe the set of supported fragment
2915    program instructions.  Each section contains pseudocode describing
2916    the instruction.  Instructions will have up to three operands,
2917    referred to as "op0", "op1", and "op2".  The operands are loaded
2918    using the mechanisms specified in section 3.11.4.1.  The variables
2919    "tmp", "tmp0", "tmp1", and "tmp2" describe scalars or vectors used
2920    to hold intermediate results in the instruction.  Instructions will
2921    generate a result vector called "result".  The result vector is then
2922    written to the destination register specified in the instruction as
2923    described in section 3.11.4.3.
2924
2925
2926    3.11.5.1  ABS:  Absolute Value
2927
2928    The ABS instruction performs a component-wise absolute value
2929    operation on the single operand to yield a result vector.
2930
2931      tmp = VectorLoad(op0);
2932      result.x = fabs(tmp.x);
2933      result.y = fabs(tmp.y);
2934      result.z = fabs(tmp.z);
2935      result.w = fabs(tmp.w);
2936
2937
2938    3.11.5.2  ADD:  Add
2939
2940    The ADD instruction performs a component-wise add of the two
2941    operands to yield a result vector.
2942
2943      tmp0 = VectorLoad(op0);
2944      tmp1 = VectorLoad(op1);
2945      result.x = tmp0.x + tmp1.x;
2946      result.y = tmp0.y + tmp1.y;
2947      result.z = tmp0.z + tmp1.z;
2948      result.w = tmp0.w + tmp1.w;
2949
2950    The following rules apply to addition:
2951
2952      1. <x> + <y> == <y> + <x>, for all <x> and <y>.
2953      2. <x> + 0.0 == <x>, for all <x>.
2954
2955
2956    3.11.5.3  CMP: Compare
2957
2958    The CMP instructions performs a component-wise comparison of the
2959    first operand against zero, and copies the values of the second or
2960    third operands based on the results of the compare.
2961
2962      tmp0 = VectorLoad(op0);
2963      tmp1 = VectorLoad(op1);
2964      tmp2 = VectorLoad(op2);
2965      result.x = (tmp0.x < 0.0) ? tmp1.x : tmp2.x;
2966      result.y = (tmp0.y < 0.0) ? tmp1.y : tmp2.y;
2967      result.z = (tmp0.z < 0.0) ? tmp1.z : tmp2.z;
2968      result.w = (tmp0.w < 0.0) ? tmp1.w : tmp2.w;
2969
2970
2971    3.11.5.4  COS:  Cosine
2972
2973    The COS instruction approximates the trigonometric cosine of the
2974    angle specified by the scalar operand and replicates it to all four
2975    components of the result vector.  The angle is specified in radians
2976    and does not have to be in the range [-PI,PI].
2977
2978      tmp = ScalarLoad(op0);
2979      result.x = ApproxCosine(tmp);
2980      result.y = ApproxCosine(tmp);
2981      result.z = ApproxCosine(tmp);
2982      result.w = ApproxCosine(tmp);
2983
2984
2985    3.11.5.5  DP3:  Three-Component Dot Product
2986
2987    The DP3 instruction computes a three-component dot product of the
2988    two operands (using the first three components) and replicates the
2989    dot product to all four components of the result vector.
2990
2991      tmp0 = VectorLoad(op0);
2992      tmp1 = VectorLoad(op1);
2993      dot = (tmp0.x * tmp1.x) + (tmp0.y * tmp1.y) + (tmp0.z * tmp1.z);
2994      result.x = dot;
2995      result.y = dot;
2996      result.z = dot;
2997      result.w = dot;
2998
2999
3000    3.11.5.6  DP4:  Four-Component Dot Product
3001
3002    The DP4 instruction computes a four-component dot product of the two
3003    operands and replicates the dot product to all four components of
3004    the result vector.
3005
3006      tmp0 = VectorLoad(op0);
3007      tmp1 = VectorLoad(op1):
3008      dot = (tmp0.x * tmp1.x) + (tmp0.y * tmp1.y) +
3009            (tmp0.z * tmp1.z) + (tmp0.w * tmp1.w);
3010      result.x = dot;
3011      result.y = dot;
3012      result.z = dot;
3013      result.w = dot;
3014
3015
3016    3.11.5.7  DPH:  Homogeneous Dot Product
3017
3018    The DPH instruction computes a three-component dot product of the
3019    two operands (using the x, y, and z components), adds the w
3020    component of the second operand, and replicates the sum to all four
3021    components of the result vector.  This is equivalent to a four-
3022    component dot product where the w component of the first operand is
3023    forced to 1.0.
3024
3025      tmp0 = VectorLoad(op0);
3026      tmp1 = VectorLoad(op1):
3027      dot = (tmp0.x * tmp1.x) + (tmp0.y * tmp1.y) +
3028            (tmp0.z * tmp1.z) + tmp1.w;
3029      result.x = dot;
3030      result.y = dot;
3031      result.z = dot;
3032      result.w = dot;
3033
3034
3035    3.11.5.8  DST:  Distance Vector
3036
3037    The DST instruction computes a distance vector from two specially-
3038    formatted operands.  The first operand should be of the form [NA,
3039    d^2, d^2, NA] and the second operand should be of the form [NA, 1/d,
3040    NA, 1/d], where NA values are not relevant to the calculation and d
3041    is a vector length.  If both vectors satisfy these conditions, the
3042    result vector will be of the form [1.0, d, d^2, 1/d].
3043
3044    The exact behavior is specified in the following pseudo-code:
3045
3046      tmp0 = VectorLoad(op0);
3047      tmp1 = VectorLoad(op1);
3048      result.x = 1.0;
3049      result.y = tmp0.y * tmp1.y;
3050      result.z = tmp0.z;
3051      result.w = tmp1.w;
3052
3053    Given an arbitrary vector, d^2 can be obtained using the DP3
3054    instruction (using the same vector for both operands) and 1/d can be
3055    obtained from d^2 using the RSQ instruction.
3056
3057    This distance vector is useful for per-fragment light attenuation
3058    calculations:  a DP3 operation using the distance vector and an
3059    attenuation constants vector as operands will yield the attenuation
3060    factor.
3061
3062
3063    3.11.5.9  EX2:  Exponential Base 2
3064
3065    The EX2 instruction approximates 2 raised to the power of the scalar
3066    operand and replicates the approximation to all four components of
3067    the result vector.
3068
3069      tmp = ScalarLoad(op0);
3070      result.x = Approx2ToX(tmp);
3071      result.y = Approx2ToX(tmp);
3072      result.z = Approx2ToX(tmp);
3073      result.w = Approx2ToX(tmp);
3074
3075
3076    3.11.5.10  FLR:  Floor
3077
3078    The FLR instruction performs a component-wise floor operation on the
3079    operand to generate a result vector.  The floor of a value is
3080    defined as the largest integer less than or equal to the value.  The
3081    floor of 2.3 is 2.0; the floor of -3.6 is -4.0.
3082
3083      tmp = VectorLoad(op0);
3084      result.x = floor(tmp.x);
3085      result.y = floor(tmp.y);
3086      result.z = floor(tmp.z);
3087      result.w = floor(tmp.w);
3088
3089
3090    3.11.5.11  FRC:  Fraction
3091
3092    The FRC instruction extracts the fractional portion of each
3093    component of the operand to generate a result vector.  The
3094    fractional portion of a component is defined as the result after
3095    subtracting off the floor of the component (see FLR), and is always
3096    in the range [0.0, 1.0).
3097
3098    For negative values, the fractional portion is NOT the number
3099    written to the right of the decimal point -- the fractional portion
3100    of -1.7 is not 0.7 -- it is 0.3.  0.3 is produced by subtracting the
3101    floor of -1.7 (-2.0) from -1.7.
3102
3103      tmp = VectorLoad(op0);
3104      result.x = fraction(tmp.x);
3105      result.y = fraction(tmp.y);
3106      result.z = fraction(tmp.z);
3107      result.w = fraction(tmp.w);
3108
3109
3110    3.11.5.12  LG2:  Logarithm Base 2
3111
3112    The LG2 instruction approximates the base 2 logarithm of the scalar
3113    operand and replicates it to all four components of the result
3114    vector.
3115
3116      tmp = ScalarLoad(op0);
3117      result.x = ApproxLog2(tmp);
3118      result.y = ApproxLog2(tmp);
3119      result.z = ApproxLog2(tmp);
3120      result.w = ApproxLog2(tmp);
3121
3122    If the scalar operand is zero or negative, the result is undefined.
3123
3124
3125    3.11.5.13  LIT:  Light Coefficients
3126
3127    The LIT instruction accelerates per-fragment lighting by computing
3128    lighting coefficients for ambient, diffuse, and specular light
3129    contributions.  The "x" component of the single operand is assumed
3130    to hold a diffuse dot product (n dot VP_pli, as in the vertex
3131    lighting equations in Section 2.13.1).  The "y" component of the
3132    operand is assumed to hold a specular dot product (n dot h_i).  The
3133    "w" component of the operand is assumed to hold the specular
3134    exponent of the material (s_rm), and is clamped to the range (-128,
3135    +128) exclusive.
3136
3137    The "x" component of the result vector receives the value that
3138    should be multiplied by the ambient light/material product (always
3139    1.0).  The "y" component of the result vector receives the value
3140    that should be multiplied by the diffuse light/material product
3141    (n dot VP_pli).  The "z" component of the result vector receives the
3142    value that should be multiplied by the specular light/material
3143    product (f_i * (n dot h_i) ^ s_rm).  The "w" component of the result
3144    is the constant 1.0.
3145
3146    Negative diffuse and specular dot products are clamped to 0.0, as is
3147    done in the standard per-vertex lighting operations.  In addition,
3148    if the diffuse dot product is zero or negative, the specular
3149    coefficient is forced to zero.
3150
3151      tmp = VectorLoad(op0);
3152      if (tmp.x < 0) tmp.x = 0;
3153      if (tmp.y < 0) tmp.y = 0;
3154      if (tmp.w < -(128.0-epsilon)) tmp.w = -(128.0-epsilon);
3155      else if (tmp.w > 128-epsilon) tmp.w = 128-epsilon;
3156      result.x = 1.0;
3157      result.y = tmp.x;
3158      result.z = (tmp.x > 0) ? RoughApproxPower(tmp.y, tmp.w) : 0.0;
3159      result.w = 1.0;
3160
3161    The exponentiation approximation function may be defined in terms of
3162    the base 2 exponentiation and logarithm approximation operations in
3163    the EX2 and LG2 instructions, where
3164
3165      ApproxPower(a,b) = ApproxExp2(b * ApproxLog2(a)).
3166
3167    In particular, the approximation may not be any more accurate than
3168    the underlying EX2 and LG2 operations.
3169
3170    Also, since 0^0 is defined to be 1, RoughApproxPower(0.0, 0.0) will
3171    produce 1.0.
3172
3173
3174    3.11.5.14  LRP: Linear Interpolation
3175
3176    The LRP instruction performs a component-wise linear interpolation
3177    between the second and third operands using the first operand as the
3178    blend factor.
3179
3180      tmp0 = VectorLoad(op0);
3181      tmp1 = VectorLoad(op1);
3182      tmp2 = VectorLoad(op2);
3183      result.x = tmp0.x * tmp1.x + (1 - tmp0.x) * tmp2.x;
3184      result.y = tmp0.y * tmp1.y + (1 - tmp0.y) * tmp2.y;
3185      result.z = tmp0.z * tmp1.z + (1 - tmp0.z) * tmp2.z;
3186      result.w = tmp0.w * tmp1.w + (1 - tmp0.w) * tmp2.w;
3187
3188
3189    3.11.5.15  MAD:  Multiply and Add
3190
3191    The MAD instruction performs a component-wise multiply of the first two
3192    operands, and then does a component-wise add of the product to the
3193    third operand to yield a result vector.
3194
3195      tmp0 = VectorLoad(op0);
3196      tmp1 = VectorLoad(op1);
3197      tmp2 = VectorLoad(op2);
3198      result.x = tmp0.x * tmp1.x + tmp2.x;
3199      result.y = tmp0.y * tmp1.y + tmp2.y;
3200      result.z = tmp0.z * tmp1.z + tmp2.z;
3201      result.w = tmp0.w * tmp1.w + tmp2.w;
3202
3203    The multiplication and addition operations in this instruction are
3204    subject to the same rules as described for the MUL and ADD
3205    instructions.
3206
3207
3208    3.11.5.16  MAX:  Maximum
3209
3210    The MAX instruction computes component-wise maximums of the values
3211    in the two operands to yield a result vector.
3212
3213      tmp0 = VectorLoad(op0);
3214      tmp1 = VectorLoad(op1);
3215      result.x = (tmp0.x > tmp1.x) ? tmp0.x : tmp1.x;
3216      result.y = (tmp0.y > tmp1.y) ? tmp0.y : tmp1.y;
3217      result.z = (tmp0.z > tmp1.z) ? tmp0.z : tmp1.z;
3218      result.w = (tmp0.w > tmp1.w) ? tmp0.w : tmp1.w;
3219
3220
3221    3.11.5.17  MIN:  Minimum
3222
3223    The MIN instruction computes component-wise minimums of the values
3224    in the two operands to yield a result vector.
3225
3226      tmp0 = VectorLoad(op0);
3227      tmp1 = VectorLoad(op1);
3228      result.x = (tmp0.x > tmp1.x) ? tmp1.x : tmp0.x;
3229      result.y = (tmp0.y > tmp1.y) ? tmp1.y : tmp0.y;
3230      result.z = (tmp0.z > tmp1.z) ? tmp1.z : tmp0.z;
3231      result.w = (tmp0.w > tmp1.w) ? tmp1.w : tmp0.w;
3232
3233
3234    3.11.5.18  MOV:  Move
3235
3236    The MOV instruction copies the value of the operand to yield a
3237    result vector.
3238
3239      result = VectorLoad(op0);
3240
3241
3242    3.11.5.19  MUL:  Multiply
3243
3244    The MUL instruction performs a component-wise multiply of the two
3245    operands to yield a result vector.
3246
3247      tmp0 = VectorLoad(op0);
3248      tmp1 = VectorLoad(op1);
3249      result.x = tmp0.x * tmp1.x;
3250      result.y = tmp0.y * tmp1.y;
3251      result.z = tmp0.z * tmp1.z;
3252      result.w = tmp0.w * tmp1.w;
3253
3254    The following rules apply to multiplication:
3255
3256      1. <x> * <y> == <y> * <x>, for all <x> and <y>.
3257      2. +/-0.0 * <x> = +/-0.0, at least for all <x> that correspond to
3258         representable numbers (IEEE "not a number" and "infinity"
3259         encodings may be exceptions).
3260      3. +1.0 * <x> = <x>, for all <x>.
3261
3262    Multiplication by zero and one should be invariant, as it may be
3263    used to evaluate conditional expressions without branching.
3264
3265
3266    3.11.5.20  POW:  Exponentiate
3267
3268    The POW instruction approximates the value of the first scalar
3269    operand raised to the power of the second scalar operand and
3270    replicates it to all four components of the result vector.
3271
3272      tmp0 = ScalarLoad(op0);
3273      tmp1 = ScalarLoad(op1);
3274      result.x = ApproxPower(tmp0, tmp1);
3275      result.y = ApproxPower(tmp0, tmp1);
3276      result.z = ApproxPower(tmp0, tmp1);
3277      result.w = ApproxPower(tmp0, tmp1);
3278
3279    The exponentiation approximation function may be implemented using
3280    the base 2 exponentiation and logarithm approximation operations in
3281    the EX2 and LG2 instructions.  In particular,
3282
3283      ApproxPower(a,b) = ApproxExp2(b * ApproxLog2(a)).
3284
3285    Note that a logarithm may be involved even for cases where the
3286    exponent is an integer.  This means that it may not be possible to
3287    exponentiate correctly with a negative base.  In constrast, it is
3288    possible in a "normal" mathematical formulation to raise negative
3289    numbers to integral powers (e.g., (-3)^2== 9, and (-0.5)^-2==4).
3290
3291
3292    3.11.5.21  RCP:  Reciprocal
3293
3294    The RCP instruction approximates the reciprocal of the scalar
3295    operand and replicates it to all four components of the result
3296    vector.
3297
3298      tmp = ScalarLoad(op0);
3299      result.x = ApproxReciprocal(tmp);
3300      result.y = ApproxReciprocal(tmp);
3301      result.z = ApproxReciprocal(tmp);
3302      result.w = ApproxReciprocal(tmp);
3303
3304    The following rule applies to reciprocation:
3305
3306      1. ApproxReciprocal(+1.0) = +1.0.
3307
3308
3309    3.11.5.22  RSQ:  Reciprocal Square Root
3310
3311    The RSQ instruction approximates the reciprocal of the square root
3312    of the absolute value of the scalar operand and replicates it to all
3313    four components of the result vector.
3314
3315      tmp = fabs(ScalarLoad(op0));
3316      result.x = ApproxRSQRT(tmp);
3317      result.y = ApproxRSQRT(tmp);
3318      result.z = ApproxRSQRT(tmp);
3319      result.w = ApproxRSQRT(tmp);
3320
3321
3322    3.11.5.23  SCS:  Sine/Cosine
3323
3324    The SCS instruction approximates the trigonometric sine and cosine
3325    of the angle specified by the scalar operand and places the cosine
3326    in the x component and the sine in the y component of the result
3327    vector.  The z and w components of the result vector are undefined.
3328    The angle is specified in radians and must be in the range [-PI,PI].
3329
3330      tmp = ScalarLoad(op0);
3331      result.x = ApproxCosine(tmp);
3332      result.y = ApproxSine(tmp);
3333
3334    If the scalar operand is not in the range [-PI,PI], the result
3335    vector is undefined.
3336
3337
3338    3.11.5.24  SGE:  Set On Greater or Equal Than
3339
3340    The SGE instruction performs a component-wise comparison of the two
3341    operands.  Each component of the result vector is 1.0 if the
3342    corresponding component of the first operands is greater than or
3343    equal that of the second, and 0.0 otherwise.
3344
3345      tmp0 = VectorLoad(op0);
3346      tmp1 = VectorLoad(op1);
3347      result.x = (tmp0.x >= tmp1.x) ? 1.0 : 0.0;
3348      result.y = (tmp0.y >= tmp1.y) ? 1.0 : 0.0;
3349      result.z = (tmp0.z >= tmp1.z) ? 1.0 : 0.0;
3350      result.w = (tmp0.w >= tmp1.w) ? 1.0 : 0.0;
3351
3352
3353    3.11.5.25  SIN:  Sine
3354
3355    The SIN instruction approximates the trigonometric sine of the angle
3356    specified by the scalar operand and replicates it to all four
3357    components of the result vector.  The angle is specified in radians
3358    and does not have to be in the range [-PI,PI].
3359
3360      tmp = ScalarLoad(op0);
3361      result.x = ApproxSine(tmp);
3362      result.y = ApproxSine(tmp);
3363      result.z = ApproxSine(tmp);
3364      result.w = ApproxSine(tmp);
3365
3366
3367    3.11.5.26  SLT:  Set On Less Than
3368
3369    The SLT instruction performs a component-wise comparison of the two
3370    operands.  Each component of the result vector is 1.0 if the
3371    corresponding component of the first operand is less than that of
3372    the second, and 0.0 otherwise.
3373
3374      tmp0 = VectorLoad(op0);
3375      tmp1 = VectorLoad(op1);
3376      result.x = (tmp0.x < tmp1.x) ? 1.0 : 0.0;
3377      result.y = (tmp0.y < tmp1.y) ? 1.0 : 0.0;
3378      result.z = (tmp0.z < tmp1.z) ? 1.0 : 0.0;
3379      result.w = (tmp0.w < tmp1.w) ? 1.0 : 0.0;
3380
3381
3382    3.11.5.27  SUB:  Subtract
3383
3384    The SUB instruction performs a component-wise subtraction of the
3385    second operand from the first to yield a result vector.
3386
3387      tmp0 = VectorLoad(op0);
3388      tmp1 = VectorLoad(op1);
3389      result.x = tmp0.x - tmp1.x;
3390      result.y = tmp0.y - tmp1.y;
3391      result.z = tmp0.z - tmp1.z;
3392      result.w = tmp0.w - tmp1.w;
3393
3394
3395    3.11.5.28  SWZ:  Extended Swizzle
3396
3397    The SWZ instruction loads the single vector operand, and performs a
3398    swizzle operation more powerful than that provided for loading
3399    normal vector operands to yield an instruction vector.
3400
3401    After the operand is loaded, the "x", "y", "z", and "w" components
3402    of the result vector are selected by the first, second, third, and
3403    fourth matches of the <xyzwExtSwizComp> or <rgbaExtSwizComp> pattern
3404    in the <extendedSwizzle> rule.
3405
3406    A result component can be selected from any of the four components
3407    of the operand or the constants 0.0 and 1.0.  The result component
3408    can also be optionally negated.  The following pseudocode describes
3409    the component selection method.  "operand" refers to the vector
3410    operand.  "select" is an enumerant where the values ZERO, ONE, X, Y,
3411    Z, and W correspond to the <xyzwExtSwizSel> rule matching "0", "1", "x",
3412    "y", "z", and "w", respectively, or the <rgbaExtSwizSel> rule
3413    matching "0", 1", "r", "g", "b", and "a", respectively.  "negate" is
3414    TRUE if and only if the <optionalSign> rule in <xyzwExtSwizComp>
3415    or <rgbaExtSwizComp> matches "-".
3416
3417      float ExtSwizComponent(floatVec operand, enum select, boolean negate)
3418      {
3419          float result;
3420          switch (select) {
3421            case ZERO:  result = 0.0; break;
3422            case ONE:   result = 1.0; break;
3423            case X:     result = operand.x; break;
3424            case Y:     result = operand.y; break;
3425            case Z:     result = operand.z; break;
3426            case W:     result = operand.w; break;
3427          }
3428          if (negate) {
3429            result = -result;
3430          }
3431          return result;
3432      }
3433
3434    The entire extended swizzle operation is then defined using the
3435    following pseudocode:
3436
3437      tmp = VectorLoad(op0);
3438      result.x = ExtSwizComponent(tmp, xSelect, xNegate);
3439      result.y = ExtSwizComponent(tmp, ySelect, yNegate);
3440      result.z = ExtSwizComponent(tmp, zSelect, zNegate);
3441      result.w = ExtSwizComponent(tmp, wSelect, wNegate);
3442
3443    "xSelect", "xNegate", "ySelect", "yNegate", "zSelect", "zNegate",
3444    "wSelect", and "wNegate" correspond to the "select" and "negate"
3445    values above for the four <xyzwExtSwizComp> or <rgbaExtSwizComp>
3446    matches.
3447
3448    Since this instruction allows for component selection and negation
3449    for each individual component, the grammar does not allow the use of
3450    the normal swizzle and negation operations allowed for vector
3451    operands in other instructions.
3452
3453
3454    3.11.5.29  XPD:  Cross Product
3455
3456    The XPD instruction computes the cross product using the first three
3457    components of its two vector operands to generate the x, y, and z
3458    components of the result vector.  The w component of the result
3459    vector is undefined.
3460
3461      tmp0 = VectorLoad(op0);
3462      tmp1 = VectorLoad(op1);
3463      result.x = tmp0.y * tmp1.z - tmp0.z * tmp1.y;
3464      result.y = tmp0.z * tmp1.x - tmp0.x * tmp1.z;
3465      result.z = tmp0.x * tmp1.y - tmp0.y * tmp1.x;
3466
3467
3468    3.11.6  Fragment Program Texture Instruction Set
3469
3470    The first three texture instructions described below specify the
3471    mapping of 4-tuple vectors to colors of an image.  The sampling of
3472    the texture works as described in section 3.8, except that texture
3473    environments and texture functions are not applicable, and the
3474    texture enables hierarchy is replaced by explicit references to
3475    the desired texture target (i.e., 1D, 2D, 3D, cube map, rectangle).
3476    These texture instructions specify how the 4-tuple is mapped into
3477    the coordinates used for sampling.  The following function is used
3478    to describe the texture sampling in the descriptions below:
3479
3480      vec4 TextureSample(float s, float t, float r, float lodBias,
3481                         int texImageUnit, enum texTarget);
3482
3483    Note that not all three texture coordinates, s, t, and r, are
3484    used by all texture targets.  In particular, 1D texture targets only
3485    use the s component, and 2D and rectangle (non-power-of-two) texture
3486    targets only use the s and t components.  The descriptions of the
3487    texture instructions below supply all three components, as would be
3488    the case with 3D or cube map targets.
3489
3490    If a fragment program samples from a texture target on a texture
3491    image unit where the bound texture object is not complete, as
3492    defined in section 3.8.9, the result will be the vector
3493    (R, G, B, A) = (0, 0, 0, 1).
3494
3495    A fragment program will fail to load if it attempts to sample from
3496    multiple texture targets on the same texture image unit.  For
3497    example, the following program would fail to load:
3498
3499      !!ARBfp1.0
3500      TEX result.color, fragment.texcoord[0], texture[0], 2D;
3501      TEX result.depth, fragment.texcoord[1], texture[0], 3D;
3502      END
3503
3504    The fourth texture instruction described below, KIL, does not sample
3505    from a texture, but rather prevents further processing of the
3506    current fragment if any component of its 4-tuple vector is less than
3507    zero.
3508
3509    A dependent texture instruction is one that samples using a texture
3510    coordinate residing in a temporary, rather than in an attribute or
3511    a parameter.  A program may have a chain of dependent texture
3512    instructions, where the result of the first texture instruction is
3513    used as the coordinate for a second texture instruction, which is in
3514    turn used as the coordinate for a third texture instruction, and so
3515    on.  Each node in this chain is termed an indirection, and can be
3516    thought of as a set of texture samples that execute in parallel
3517    followed by a sequence of ALU instructions.
3518
3519    Some implementations may have limitations on how long the dependency
3520    chain may be, and so indirections are counted as a resource just
3521    like instructions or temporaries are counted.  All programs have at
3522    least one indirection, or one node in this chain, even if the
3523    program performs no texture operation.  Each instruction encountered
3524    is included in this node until a texture instruction is encountered
3525
3526      - whose texture coordinate is a temporary that has been previously
3527        written in the current node; or
3528
3529      - whose result vector is a temporary that is also the operand or
3530        result vector of a previous ALU instruction in the current node.
3531
3532    A new node is then started, including the texture instruction and
3533    all subsequent instructions, and the process repeats for all
3534    instructions in the program.  Note that for simplicity in counting,
3535    result writemasks and operand suffixes are not taken into
3536    consideration when counting indirections.
3537
3538
3539    3.11.6.1  TEX: Map coordinate to color
3540
3541    The TEX instruction takes the first three components of
3542    its source vector, and maps them to s, t, and r.  These coordinates
3543    are used to sample from the specified texture target on the
3544    specified texture image unit in a manner consistent with its
3545    parameters.  The resulting sample is mapped to RGBA as described in
3546    table 3.21 and written to the result vector.
3547
3548      tmp = VectorLoad(op0);
3549      result = TextureSample(tmp.x, tmp.y, tmp.z, 0.0, op1, op2);
3550
3551
3552    3.11.6.2  TXP: Project coordinate and map to color
3553
3554    The TXP instruction divides the first three components of its source
3555    vector by the fourth component and maps the results to s, t, and r.
3556    These coordinates are used to sample from the specified texture
3557    target on the specified texture image unit in a manner consistent
3558    with its parameters.  The resulting sample is mapped to RGBA as
3559    described in table 3.21 and written to the result vector.  If the
3560    value of the fourth component of the source vector is less than or
3561    equal to zero, the result vector is undefined.
3562
3563      tmp = VectorLoad(op0);
3564      tmp.x = tmp.x / tmp.w;
3565      tmp.y = tmp.y / tmp.w;
3566      tmp.z = tmp.z / tmp.w;
3567      result = TextureSample(tmp.x, tmp.y, tmp.z, 0.0, op1, op2);
3568
3569
3570    3.11.6.3  TXB: Map coordinate to color while biasing its LOD
3571
3572    The TXB instruction takes the first three components of its source
3573    vector and maps them to s, t, and r.  These coordinates are used to
3574    sample from the specified texture target on the specified texture
3575    image unit in a manner consistent with its parameters.
3576    Additionally, the fourth component of the source vector is applied
3577    to equation 3.14 as fragment_bias below to further bias the level of
3578    detail.
3579
3580     lambda'(x,y) = log2[p(x,y)] +
3581                    clamp(texobj_bias + texunit_bias + fragment_bias)
3582
3583    The resulting sample is mapped to RGBA as described in table 3.21
3584    and written to the result vector.
3585
3586      tmp = VectorLoad(op0);
3587      result = TextureSample(tmp.x, tmp.y, tmp.z, tmp.w, op1, op2);
3588
3589
3590    3.11.6.4  KIL: Kill fragment
3591
3592    Rather than mapping a coordinate set to a color, this function
3593    prevents a fragment from receiving any future processing.  If any
3594    component of its source vector is negative, the processing of this
3595    fragment will be discontinued and no further outputs to this
3596    fragment will occur.  Subsequent stages of the GL pipeline will be
3597    skipped for this fragment.
3598
3599      tmp = VectorLoad(op0);
3600      if ((tmp.x < 0) || (tmp.y < 0) ||
3601          (tmp.z < 0) || (tmp.w < 0))
3602      {
3603          exit;
3604      }
3605
3606
3607    3.11.7  Program Matrices
3608
3609    In addition to GL's conventional matrices, several additional
3610    program matrices are available for use as program parameters.  These
3611    matrices have names of the form MATRIX<i>_ARB where <i> is between
3612    zero and <n>-1 where <n> is the value of the implementation-
3613    dependent constant MAX_PROGRAM_MATRICES_ARB.  The MATRIX<i>_ARB
3614    constants obey MATRIX<i>_ARB = MATRIX0_ARB + <i>.  The value of
3615    MAX_PROGRAM_MATRICES_ARB must be at least eight.  The maximum stack
3616    depth for program matrices is defined by the
3617    MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB and must be at least 1.
3618
3619
3620    3.11.8  Required Fragment Program State
3621
3622    The state required to support program objects of all targets
3623    consists of:
3624
3625      an integer for the program error position, initially -1;
3626
3627      an array of ubytes for the program error string, initially empty;
3628
3629      and the state that must be maintained to indicate which integers
3630      are currently in use as program object names.
3631
3632    The state required to support the fragment program target consists
3633    of:
3634
3635      a bit indicating whether or not fragment program mode is enabled,
3636      initially disabled;
3637
3638      a set of MAX_PROGRAM_ENV_PARAMETERS_ARB four-component floating-
3639      point program environment parameters, initially set to (0,0,0,0);
3640
3641      an unsigned integer naming the currently bound fragment program,
3642      initially zero;
3643
3644    The state required for each fragment program object consists of:
3645
3646      an unsigned integer indicating the program object name;
3647
3648      an array of type ubyte containing the program string, initially
3649      empty;
3650
3651      an unsigned integer holding the length of the program string,
3652      initially zero;
3653
3654      an enum indicating the program string format, initially
3655      PROGRAM_FORMAT_ASCII_ARB;
3656
3657      a bit indicating whether or not the program exceeds the native
3658      limits;
3659
3660      six unsigned integers holding the number of instruction (ALU,
3661      texture, and total), texture indirection, temporary variable, and
3662      program parameter binding resources used by the program, initially
3663      all zero;
3664
3665      six unsigned integers holding the number of native instruction
3666      (ALU, texture, and total), texture indirection, temporary
3667      variable, and program parameter binding resources used by the
3668      program, initially all zero;
3669
3670      and a set of MAX_PROGRAM_LOCAL_PARAMETERS_ARB four-component
3671      floating-point program local parameters, initially set to
3672      (0,0,0,0).
3673
3674    Initially, no fragment program objects exist.
3675
3676
3677Additions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment
3678Operations and the Frame Buffer)
3679
3680    None
3681
3682
3683Additions to Chapter 5 of the OpenGL 1.3 Specification (Special
3684Functions)
3685
3686    Modify Section 5.4, Display Lists (p. 191)
3687
3688    (modify third paragraph, p. 195) ... These are IsList, GenLists,
3689    ..., IsProgramARB, GenProgramsARB, and DeleteProgramsARB, as well as
3690    IsEnabled and all the Get commands (chapter 6).
3691
3692
3693Additions to Chapter 6 of the OpenGL 1.3 Specification (State and
3694State Requests)
3695
3696    Modify Section 6.1.2, Data Conversions (p. 198)
3697
3698    (add before last paragraph, p. 198) The matrix selected by the
3699    current matrix mode can be queried by calling GetBooleanv,
3700    GetIntegerv, GetFloatv, and GetDoublev with <pname> set to
3701    CURRENT_MATRIX_ARB; the matrix will be returned in transposed form
3702    with <pname> set to TRANSPOSE_CURRENT_MATRIX_ARB.  The depth of the
3703    selected matrix stack can be queried with <pname> set to
3704    CURRENT_MATRIX_STACK_DEPTH_ARB.  Querying CURRENT_MATRIX_ARB and
3705    CURRENT_MATRIX_STACK_DEPTH_ARB is the only means for querying the
3706    matrix and matrix stack depth of the program matrices described in
3707    section 3.11.7.
3708
3709
3710    (add to end of last paragraph, p. 199) Queries of texture state
3711    variables corresponding to texture coordinate processing unit
3712    (namely, TexGen state and enables, and matrices) will produce an
3713    INVALID_OPERATION error if the value of ACTIVE_TEXTURE is greater
3714    than or equal to MAX_TEXTURE_COORDS_ARB.  All other texture state
3715    queries will result in an INVALID_OPERATION error if the value of
3716    ACTIVE_TEXTURE is greater than or equal to
3717    MAX_TEXTURE_IMAGE_UNITS_ARB.
3718
3719
3720    Modify Section 6.1.11, Pointer and String Queries (p. 206)
3721
3722    (modify last paragraph, p. 206) ... The possible values for <name>
3723    are VENDOR, RENDERER, VERSION, EXTENSIONS, and
3724    PROGRAM_ERROR_STRING_ARB.
3725
3726
3727    (add after last paragraph of section, p. 207) Queries of
3728    PROGRAM_ERROR_STRING_ARB return a pointer to an implementation-
3729    dependent program load error string.  If the last call to
3730    ProgramStringARB failed to load a program, the returned string
3731    describes at least one reason why the program failed to load.  If
3732    the last call to ProgramStringARB successfully loaded a program, the
3733    returned string may be empty (containing only a zero terminator) or
3734    may contain one or more implementation-dependent warning messages.
3735    The contents of the error string are guaranteed to remain constant
3736    only until the next ProgramStringARB command, which may overwrite
3737    the error string.
3738
3739
3740    Insert a new Section 6.1.12, Program Queries (p. 207), between
3741    existing sections 6.1.11 and 6.1.12.
3742
3743    6.1.12  Program Queries
3744
3745    The commands
3746
3747      void GetProgramEnvParameterdvARB(enum target, uint index,
3748                                       double *params);
3749      void GetProgramEnvParameterfvARB(enum target, uint index,
3750                                       float *params);
3751
3752    obtain the current value for the program environment parameter
3753    numbered <index> for the given program target <target>, and places
3754    the information in the array <params>.  The error INVALID_ENUM is
3755    generated if <target> specifies a nonexistent program target or a
3756    program target that does not support program environment parameters.
3757    The error INVALID_VALUE is generated if <index> is greater than or
3758    equal to the implementation-dependent number of supported program
3759    environment parameters for the program target.
3760
3761    When <target> is FRAGMENT_PROGRAM_ARB, each program parameter
3762    returned is an array of four values.
3763
3764    The commands
3765
3766      void GetProgramLocalParameterdvARB(enum target, uint index,
3767                                         double *params);
3768      void GetProgramLocalParameterfvARB(enum target, uint index,
3769                                         float *params);
3770
3771    obtain the current value for the program local parameter numbered
3772    <index> belonging to the program object currently bound to <target>,
3773    and places the information in the array <params>.  The error
3774    INVALID_ENUM is generated if <target> specifies a nonexistent
3775    program target or a program target that does not support program
3776    local parameters.  The error INVALID_VALUE is generated if <index>
3777    is greater than or equal to the implementation-dependent number of
3778    supported program local parameters for the program target.
3779
3780    When the program target type is FRAGMENT_PROGRAM_ARB, each program
3781    local parameter returned is an array of four values.
3782
3783    The command
3784
3785      void GetProgramivARB(enum target, enum pname, int *params);
3786
3787    obtains program state for the program target <target>, writing the
3788    state into the array given by <params>.  GetProgramivARB can be used
3789    to determine the properties of the currently bound program object or
3790    implementation limits for <target>.
3791
3792    If <pname> is PROGRAM_LENGTH_ARB, PROGRAM_FORMAT_ARB, or
3793    PROGRAM_BINDING_ARB, GetProgramivARB returns one integer holding the
3794    program string length (in bytes), program string format, and program
3795    name, respectively, for the program object currently bound to
3796    <target>.
3797
3798    If <pname> is MAX_PROGRAM_LOCAL_PARAMETERS_ARB or
3799    MAX_PROGRAM_ENV_PARAMETERS_ARB, GetProgramivARB returns one integer
3800    holding the maximum number of program local parameters or program
3801    environment parameters, respectively, supported for the program
3802    target <target>.
3803
3804    If <pname> is MAX_PROGRAM_INSTRUCTIONS_ARB,
3805    MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, MAX_PROGRAM_TEX_INSTRUCTIONS_ARB,
3806    MAX_PROGRAM_TEX_INDIRECTIONS_ARB, MAX_PROGRAM_TEMPORARIES_ARB,
3807    MAX_PROGRAM_PARAMETERS_ARB, or MAX_PROGRAM_ATTRIBS_ARB,
3808    GetProgramivARB returns a single integer giving the maximum number
3809    of total instructions, ALU instructions, texture instructions,
3810    texture indirections, temporaries, parameters, and attributes that
3811    can be used by a program of type <target>.  If <pname> is
3812    PROGRAM_INSTRUCTIONS_ARB, PROGRAM_ALU_INSTRUCTIONS_ARB,
3813    PROGRAM_TEX_INSTRUCTIONS_ARB, PROGRAM_TEX_INDIRECTIONS_ARB,
3814    PROGRAM_TEMPORARIES_ARB, PROGRAM_PARAMETERS_ARB, or
3815    PROGRAM_ATTRIBS_ARB, GetProgramivARB returns a single integer giving
3816    the number of total instructions, ALU instructions, texture
3817    instructions, texture indirections, temporaries, parameters, and
3818    attributes used by the current program for <target>.
3819
3820    If <pname> is MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB,
3821    MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB,
3822    MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB,
3823    MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB,
3824    MAX_PROGRAM_NATIVE_TEMPORARIES_ARB,
3825    MAX_PROGRAM_NATIVE_PARAMETERS_ARB, or
3826    MAX_PROGRAM_NATIVE_ATTRIBS_ARB, GetProgramivARB returns a single
3827    integer giving the maximum number of native instruction, ALU
3828    instruction, texture instruction, texture indirection, temporary,
3829    parameter, and attribute resources available to a program of type
3830    <target>.  If <pname> is PROGRAM_NATIVE_INSTRUCTIONS_ARB,
3831    PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB,
3832    PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB,
3833    PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB,
3834    PROGRAM_NATIVE_TEMPORARIES_ARB, PROGRAM_NATIVE_PARAMETERS_ARB, or
3835    PROGRAM_NATIVE_ATTRIBS_ARB, GetProgramivARB returns a single integer
3836    giving the number of native instruction, ALU instruction, texture
3837    instruction, texture indirection, temporary, parameter, and
3838    attribute resources consumed by the program currently bound to
3839    <target>.  Native resource counts will reflect the results of
3840    implementation-dependent scheduling and optimization algorithms
3841    applied by the GL, as well as emulation of non-native features.  If
3842    <pname> is PROGRAM_UNDER_NATIVE_LIMITS_ARB, GetProgramivARB returns
3843    0 if the native resource consumption of the program currently bound
3844    to <target> exceeds the number of available resources for any
3845    resource type, and 1 otherwise.
3846
3847    The command
3848
3849      void GetProgramStringARB(enum target, enum pname, void *string);
3850
3851    obtains the program string for the program object bound to <target>
3852    and places the information in the array <string>.  <pname> must be
3853    PROGRAM_STRING_ARB.  <n> ubytes are returned into the array program
3854    where <n> is the length of the program in ubytes, as returned by
3855    GetProgramivARB when <pname> is PROGRAM_LENGTH_ARB.  The program
3856    string is always returned using the format given when the program
3857    string was specified.
3858
3859    The command
3860
3861      boolean IsProgramARB(uint program);
3862
3863    returns TRUE if <program> is the name of a program object.  If
3864    <program> is zero or is a non-zero value that is not the name of a
3865    program object, or if an error condition occurs, IsProgramARB
3866    returns FALSE.  A name returned by GenProgramsARB, but not yet
3867    bound, is not the name of a program object.
3868
3869
3870    Modify Section 6.2, State Tables (p. 216)
3871
3872    (add to caption of Table 6.5) When accessing the current texture
3873    coordinates (CURRENT_TEXTURE_COORDS) or the texture coordinates
3874    associated with raster position (CURRENT_RASTER_TEXTURE_COORDS), the
3875    active texture unit selector (ACTIVE_TEXTURE) must be less than the
3876    implementation dependent maximum number of texture coordinate sets
3877    (MAX_TEXTURE_COORDS_ARB).
3878
3879    (add to caption of Table 6.8) When accessing the texture matrix
3880    stack (TEXTURE_MATRIX, TRANSPOSE_TEXTURE_MATRIX) or the texture
3881    matrix stack pointer (TEXTURE_STACK_DEPTH), the active texture unit
3882    selector (ACTIVE_TEXTURE) must be less than the implementation
3883    dependent maximum number of texture coordinate sets
3884    (MAX_TEXTURE_COORDS_ARB).
3885
3886    (split Table 6.17 into two tables, Texture Environment and Texture
3887    Coordinate Generation; move active texture unit selector and texture
3888    coordinate generation state to table 6.18; renumber subsequent
3889    tables)
3890
3891    (add to captions of Tables 6.14, 6.15, 6.16) The active texture unit
3892    selector (ACTIVE_TEXTURE) identifies which texture object is
3893    accessed, and must be less than the implementation dependent maximum
3894    number of texture image units (MAX_TEXTURE_IMAGE_UNITS_ARB).
3895
3896    (add to caption of Table 6.18) With the exception of ACTIVE_TEXTURE,
3897    the active texture unit selector (ACTIVE_TEXTURE) identifies which
3898    texture coordinate set is accessed, and must be less than the
3899    implementation dependent maximum number of texture coordinate sets
3900    (MAX_TEXTURE_COORDS_ARB).
3901
3902Additions to Appendix A of the OpenGL 1.3 Specification (Invariance)
3903
3904    Add to end of Section A.3 (p. 242):
3905
3906      Rule 4.  Fragment program instructions not relevant to the
3907      calculation of any result must have no effect on that result.
3908
3909      Rule 5.  Fragment program instructions relevant to the calculation
3910      of any result must always produce the identical result.
3911
3912    Instructions relevant to the calculation of a result are any
3913    instructions in a sequence of instructions that eventually determine
3914    the source values for the calculation under consideration.
3915
3916    There is no guaranteed invariance between fragment colors generated
3917    by conventional GL texturing mode and fragment colors generated by
3918    fragment program mode.  Multi-pass rendering algorithms that require
3919    rendering invariances to operate correctly should not mix
3920    conventional GL fragment texturing mode with fragment program mode
3921    for different rendering passes.  However, such algorithms will
3922    operate correctly if the algorithms limit themselves to a single
3923    mode of fragment color generation.
3924
3925    There is no guaranteed invariance between the final z window
3926    coordinates of fragments processed by fragment programs that write
3927    depth values and fragments processed by any other means, even if the
3928    fragment programs in question simply copy the z value from the
3929    "fragment.position" binding.  Multi-pass rendering algorithms that
3930    use depth-replacing fragment programs should use depth-replacing
3931    fragment programs on each pass to guarantee identical z values.
3932
3933    The texture sample chosen for a fragment of a primitive must be
3934    invariant between fragment program mode and conventional texture
3935    application mode subject to these conditions:
3936
3937      1. All state with the exception of fragment program state is
3938         identical
3939
3940      2. The primitives generating the fragments are identical
3941
3942      3. The sample in the fragment program mode is the result of a
3943         'TEX' instruction (or a 'TXP' instruction with a unity q)
3944
3945      4. The texture coordinate operand for the texture instruction uses
3946         the same texture coordinate set as the conventional mode sample
3947
3948      5. The texture coordinate operand for the texture instruction has
3949         not been the result of any other operations in the fragment
3950         program
3951
3952
3953Additions to the AGL/GLX/WGL Specifications
3954
3955    Program objects are shared between AGL/GLX/WGL rendering contexts if
3956    and only if the rendering contexts share display lists.  No change
3957    is made to the AGL/GLX/WGL API.
3958
3959    Changes to program objects shared between multiple rendering
3960    contexts will be serialized (i.e., the changes will occur in a
3961    specific order).
3962
3963    Changes to a program object made by one rendering context are not
3964    guaranteed to take effect in another rendering context until the
3965    other calls BindProgram to bind the program object.
3966
3967    When a program object is deleted by one rendering context, the
3968    object itself is not destroyed until it is no longer the current
3969    program object in any context.  However, the name of the deleted
3970    object is removed from the program object name space, so the next
3971    attempt to bind a program using the same name will create a new
3972    program object.  Recall that destroying a program object bound in
3973    the current rendering context effectively unbinds the object being
3974    destroyed.
3975
3976
3977Dependencies on OpenGL 1.4
3978
3979    If OpenGL 1.4 is not supported, the modified equation for the
3980    calculation of level of detail by the TXB instruction in 3.11.6.3
3981    should read
3982
3983      lambda'(x,y) = log2[p(x,y)] +
3984                     clamp(texunit_bias + fragment_bias)
3985
3986Dependencies on EXT_vertex_weighting and ARB_vertex_blend
3987
3988    If EXT_vertex_weighting and ARB_vertex_blend are both not supported,
3989    all discussions of multiple modelview matrices should be removed.
3990
3991    In particular, the line in the grammar
3992
3993      <stateMatrixName>      ::= "modelview" <stateOptModMatNum>
3994
3995    should be changed to
3996
3997      <stateMatrixName>      ::= "modelview"
3998
3999    and the rules <stateOptModMatNum> and <stateModMatNum> should be
4000    deleted.  The first line of Table X.2.7 should be modified to read:
4001
4002      Binding                               Underlying State
4003      ------------------------------------  ---------------------------
4004        state.matrix.modelview              modelview matrix
4005
4006    The caption for Table X.2.7 should be modified to exclude optional
4007    modelview matrix number.  Subsequent references to "modelview matrix
4008    zero" and "modelview matrix 1" should be changed to "modelview
4009    matrix" and the example "state.matrix.modelview[1].row[0]" should be
4010    changed to "state.matrix.modelview.row[0]".
4011
4012
4013Dependencies on ARB_matrix_palette:
4014
4015    If ARB_matrix_palette is not supported, all discussions of the
4016    matrix palette should be removed.
4017
4018    In particular, the line
4019
4020      "palette" "[" <statePaletteMatNum> "]"
4021
4022    should be removed from the <stateMatrixName> grammar rule, and the
4023    <statePaletteMatNum> grammar rule should be removed entirely.
4024    "state.matrix.palette[n]" should be removed from Table X.2.7.
4025
4026
4027Dependencies on ARB_transpose_matrix
4028
4029    If ARB_transpose_matrix is not supported, the discussion of
4030    TRANSPOSE_CURRENT_MATRIX_ARB in the edits to section 6.1.2 should be
4031    removed.
4032
4033
4034Dependencies on EXT_fog_coord
4035
4036    If EXT_fog_coord is not supported, references to "fog coordinate"
4037    in the definition of the "fragment.fogcoord" attribute should be
4038    removed.
4039
4040Dependencies on EXT_texture_rectangle
4041
4042    If NV_texture_rectangle is not supported, the discussion of the
4043    rectangle (non-power-of-two) texture target in section 3.11.6 should
4044    be removed, and the line
4045
4046      "RECT"
4047
4048    should be removed from the <texTarget> grammar rule.
4049
4050
4051Interactions with ARB_shadow
4052
4053    The texture comparison introduced by ARB_shadow can be expressed in
4054    terms of a fragment program, and in fact use the same internal
4055    resources on some implementations.  Therefore, if fragment program
4056    mode is enabled, the GL behaves as if TEXTURE_COMPARE_MODE_ARB is
4057    NONE.
4058
4059
4060Interactions with ARB_vertex_program
4061
4062    The program object management entrypoints described in sections
4063    2.14.1 (for vertex programs) and 3.11.1 (for fragment programs)
4064    are shared by both program targets.  The PROGRAM_ERROR_STRING_ARB
4065    and program queries in sections 6.1.11 and 6.1.12 are also shared,
4066    as are all common tokens.
4067
4068    The Errors section should be modified to generate INVALID_OPERATION
4069    from the Get command with argument CURRENT_MATRIX_ARB,
4070    TRANSPOSE_CURRENT_MATRIX_ARB, and CURRENT_MATRIX_STACK_DEPTH_ARB
4071    when the current matrix mode is TEXTURE.
4072
4073    In the presence of ARB_vertex_program, ARB_fragment_program must
4074    recognize and return appropriate values for the GetProgram <pname>
4075    tokens introduced in that spec but not otherwise shared by
4076    ARB_fragment_program:
4077
4078        PROGRAM_ADDRESS_REGISTERS_ARB                   0x88B0
4079        MAX_PROGRAM_ADDRESS_REGISTERS_ARB               0x88B1
4080        PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB            0x88B2
4081        MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB        0x88B3
4082
4083    The following tables list new program object state and
4084    implementation-dependent state:
4085
4086    Get Value                        Type   Get Command          Initial Value    Description             Sec       Attrib
4087    --------------------             -----  -------------------  ---------------  ----------------------  --------  ------
4088    PROGRAM_ADDRESS_REGISTERS_ARB    Z+     GetProgramivARB      0                bound program           6.1.12    -
4089                                                                                  address registers
4090    PROGRAM_NATIVE_ADDRESS_          Z+     GetProgramivARB      0                bound program native    6.1.12    -
4091        REGISTERS_ARB                                                             address registers
4092
4093    Table X.7.  Program Object State.  Program object queries return attributes of
4094    the program object currently bound to the program target <target>.
4095
4096
4097                                                                Minimum
4098    Get Value                            Type  Get Command      Value    Description             Sec.       Attrib
4099    ---------                            ----  -----------      -------  -----------             ----       ------
4100    MAX_PROGRAM_ADDRESS_REGISTERS_ARB    Z+    GetProgramivARB  0        maximum program         6.1.12     -
4101                                                                         address registers
4102    MAX_PROGRAM_NATIVE_ADDRESS_          Z+    GetProgramivARB  0        maximum program native  6.1.12     -
4103        REGISTERS_ARB                                                    address registers
4104
4105    Table X.10.  New Implementation-Dependent Values Introduced by
4106    ARB_vertex_program.
4107
4108
4109    In the presence of ARB_fragment_program, ARB_vertex_program must
4110    recognize and return appropriate values for the GetProgram <pname>
4111    tokens introduced in this spec.  The following tables list new
4112    program object state and implementation-dependent state:
4113
4114    Get Value                            Type   Get Command          Initial Value    Description             Sec       Attrib
4115    --------------------                 -----  -------------------  ---------------  ----------------------  --------  ------
4116    PROGRAM_ALU_INSTRUCTIONS_ARB         Z+     GetProgramivARB      0                maximum program         6.1.12    -
4117                                                                                      ALU instructions
4118    PROGRAM_TEX_INSTRUCTIONS_ARB         Z+     GetProgramivARB      0                maximum program         6.1.12    -
4119                                                                                      texture instructions
4120    PROGRAM_TEX_INDIRECTIONS_ARB         Z+     GetProgramivARB      0                maximum program         6.1.12    -
4121                                                                                      texture indirections
4122    PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB  Z+     GetProgramivARB      0                maximum program native  6.1.12    -
4123                                                                                      ALU instructions
4124    PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB  Z+     GetProgramivARB      0                maximum program native  6.1.12    -
4125                                                                                      texture instructions
4126    PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB  Z+     GetProgramivARB      0                maximum program native  6.1.12    -
4127                                                                                      texture indirections
4128
4129    Table X.7.  Program Object State.  Program object queries return attributes of
4130    the program object currently bound to the program target <target>.
4131
4132
4133                                                                    Minimum
4134    Get Value                                Type  Get Command      Value    Description             Sec.       Attrib
4135    ---------                                ----  -----------      -------  -----------             ----       ------
4136    MAX_PROGRAM_ALU_INSTRUCTIONS_ARB         Z+    GetProgramivARB  0        Number of frag. prg.    6.1.12     -
4137                                                                             ALU instructions
4138    MAX_PROGRAM_TEX_INSTRUCTIONS_ARB         Z+    GetProgramivARB  0        Number of frag. prg.    6.1.12     -
4139                                                                             texture instructions
4140    MAX_PROGRAM_TEX_INDIRECTIONS_ARB         Z+    GetProgramivARB  0        Number of frag. prg.    6.1.12     -
4141                                                                             texture indirections
4142    MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB  Z+    GetProgramivARB  0        maximum program native  6.1.12     -
4143                                                                             ALU instructions
4144    MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB  Z+    GetProgramivARB  0        maximum program native  6.1.12     -
4145                                                                             texture instructions
4146    MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB  Z+    GetProgramivARB  0        maximum program native  6.1.12     -
4147                                                                             texture indirections
4148
4149    Table X.10.  New Implementation-Dependent Values Introduced by
4150    ARB_fragment_program.
4151
4152
4153Interactions with ATI_fragment_shader
4154
4155    The existing ATI_fragment_shader extension, if supported, also
4156    provides a similar fragment programming model.  Mixing the two
4157    models in a single application is possible but not recommended.
4158    FRAGMENT_PROGRAM_ARB has priority over FRAGMENT_SHADER_ATI if
4159    both are enabled.
4160
4161
4162Interactions with NV_fragment_program
4163
4164    The NV_fragment_program extension, if supported, also provides a
4165    similar programming model.  This extension is incompatible with
4166    NV_fragment_program in a number of different ways.  Mixing the two
4167    models in a single application is possible but not recommended.  The
4168    interactions between the extensions are defined below.
4169
4170    Functions, enumerants, and programs defined in NV_fragment_program
4171    are called "NV functions", "NV enumerants", and "NV programs,"
4172    respectively.  Functions, enumerants, and programs defined in
4173    ARB_fragment_program are called "ARB functions", "ARB enumerants",
4174    and "ARB programs," respectively.
4175
4176    The following GL state is identical in the two extensions:
4177
4178      - Fragment program mode enable.  The NV and ARB enumerants have
4179        different values, but the same effect.
4180
4181      - Program error position.
4182
4183      - Program error string.
4184
4185      - NV_fragment_program and ARB_fragment_program "program local
4186        parameters."
4187
4188      - Fragment program names, targets, formats, program string,
4189        program string lengths, and residency information.  The ARB and
4190        NV query functions operate differently.  The ARB query function
4191        does not allow queries of target (passed in to the query) and
4192        residency information.  The NV query function does not allow
4193        queries of program name (passed in to the query) or format.  The
4194        format of NV programs is always PROGRAM_FORMAT_ASCII_ARB.
4195
4196      - Program object name space.  Program objects are created
4197        differently in the NV and ARB specs.  Under the NV spec, program
4198        objects are created by calling LoadProgramNV.  Under the ARB
4199        spec, program objects are created by calling BindProgramARB with
4200        an unused program name.
4201
4202    The following state is provided only by ARB_fragment_program:
4203
4204      - Program environment parameters.
4205
4206      - Implementation-dependent limits on the number of instructions,
4207        ALU instructions, texture instructions, texture indirections,
4208        program parameters, fragment attributes, resource counts, and
4209        native resource counts.  The instruction limit is baked into the
4210        NV spec.  Implementations supporting NV_fragment_program have no
4211        specific restrictions on the number of ALU instructions, texture
4212        instructions, texture indirections, or fragment attributes used.
4213        Such implementations also have no limit on program parameters
4214        used, except that no more than one may be used by any single
4215        program instruction.
4216
4217    The following state is provided only by NV_fragment_program:
4218
4219      - Named program parameters (variables defined in the program text
4220        and updated by name).
4221
4222    The following are additional functional differences between
4223    ARB_fragment_program and NV_fragment_program:
4224
4225      - NV programs use a set of register names, with no support for
4226        user-defined variables (other than parameters in the program).
4227        ARB programs provide no support for fixed variable names; all
4228        variables must be declared, explicitly or implicitly, in the
4229        program.
4230
4231      - ARB programs support parameter variables that can be bound to
4232        selected GL state variables, and are updated automatically when
4233        the underlying state changes.  NV programs provide no such
4234        support; applications must set program parameters themselves.
4235
4236      - ARB_fragment_program doesn't provide explicit support for
4237        multiple data types (fx12, fp16, fp32) described in
4238        NV_fragment_program, and provides no mechanism for controlling
4239        the precision used to carry out arithmetic operations.
4240
4241      - ARB_fragment_program doesn't support condition codes,
4242        conditional writemasks, or the "C" instruction suffix that
4243        specifies a condition code update.
4244
4245      - ARB_fragment_program doesn't support an absolute value operator
4246        that can be applied to a source vector as it is loaded.
4247
4248      - ARB_fragment_program doesn't define behavior for many floating-
4249        point special cases.  On platforms where NV_fragment_program is
4250        supported, ARB programs will have the same special-case
4251        behavior.
4252
4253      - Language to declare program parameters is slightly different
4254        (NV_fragment_program has "DECLARE" and "DEFINE";
4255        ARB_fragment_program has "PARAM").
4256
4257      - NV_fragment_program provides a number of instructions not found
4258        in ARB_fragment_program:
4259
4260          * DDX, DDY:  partial derivatives relative to x and  y.
4261
4262          * "PK*" and "UP*":  packing and unpacking instructions.
4263
4264          * RFL:  reflection vector.
4265
4266          * SEQ, SFL, SGT, SLE, SNE, STR:  set on equal, false, greater
4267            than, less than or equal, not equal, and true, respectively.
4268
4269          * TXD:  texture lookup w/partials.
4270
4271          * X2D:  2D coordinate transformation.
4272
4273      - ARB_fragment_program provides several instructions not found in
4274        NV_fragment_program, and there are a few instruction set
4275        differences:
4276
4277          * ABS:  absolute value.  ABS instructions are unnecessary in
4278              NV_fragment_program because of the free absolute value on
4279              input operator.  Equivalent to:
4280
4281                 MOV dst, |src|;
4282
4283          * CMP:  compare.  Roughly equivalent to the following
4284              sequence, but may be optimized further:
4285
4286                 SLT tmp, src0;
4287                 LRP dst, tmp, src1, src2;
4288
4289          * DPH:  homogenous dot product.  Equivalent to:
4290
4291                 DP3 tmp, src0, src1;
4292                 ADD dst, tmp, src0.w;
4293
4294          * KIL:  kill fragment.  Both extensions support this
4295              instruction, but the ARB instruction takes a vector
4296              operand rather than a condition code.
4297
4298          * SCS:  sine/cosine.  Emulated using the separate SIN and COS
4299              instructions in NV_fragment_program, which also have no
4300              restriction on the input values.
4301
4302          * SWZ:  extended swizzle.  On NV_fragment_program platforms,
4303              this instruction will be emulated using a single MAD
4304              instruction and a program parameter constant.
4305
4306          * TXB:  texture sample with bias.  Not exposed in the
4307              NV_fragment_program API.
4308
4309          * XPD:  cross product.  Emulated using a MUL and a MAD
4310              instruction.
4311
4312
4313GLX Protocol
4314
4315     The following rendering commands are sent to the server as part of
4316     a glXRender request:
4317
4318        BindProgramARB
4319            2           12              rendering command length
4320            2           4180            rendering command opcode
4321            4           ENUM            target
4322            4           CARD32          program
4323
4324        ProgramEnvParameter4fvARB
4325            2           32              rendering command length
4326            2           4184            rendering command opcode
4327            4           ENUM            target
4328            4           CARD32          index
4329            4           FLOAT32         params[0]
4330            4           FLOAT32         params[1]
4331            4           FLOAT32         params[2]
4332            4           FLOAT32         params[3]
4333
4334        ProgramEnvParameter4dvARB
4335            2           44              rendering command length
4336            2           4185            rendering command opcode
4337            4           ENUM            target
4338            4           CARD32          index
4339            8           FLOAT64         params[0]
4340            8           FLOAT64         params[1]
4341            8           FLOAT64         params[2]
4342            8           FLOAT64         params[3]
4343
4344        ProgramLocalParameter4fvARB
4345            2           32              rendering command length
4346            2           4215            rendering command opcode
4347            4           ENUM            target
4348            4           CARD32          index
4349            4           FLOAT32         params[0]
4350            4           FLOAT32         params[1]
4351            4           FLOAT32         params[2]
4352            4           FLOAT32         params[3]
4353
4354        ProgramLocalParameter4dvARB
4355            2           44              rendering command length
4356            2           4216            rendering command opcode
4357            4           ENUM            target
4358            4           CARD32          index
4359            8           FLOAT64         params[0]
4360            8           FLOAT64         params[1]
4361            8           FLOAT64         params[2]
4362            8           FLOAT64         params[3]
4363
4364    The ProgramStringARB is potentially large, and hence can be sent in
4365    a glXRender or glXRenderLarge request.
4366
4367        ProgramStringARB
4368            2           16+len+p        rendering command length
4369            2           4217            rendering command opcode
4370            4           ENUM            target
4371            4           ENUM            format
4372            4           sizei           len
4373            len         LISTofBYTE      program
4374            p                           unused, p=pad(len)
4375
4376         If the command is encoded in a glxRenderLarge request, the
4377         command opcode and command length fields above are expanded to
4378         4 bytes each:
4379
4380            4           16+len+p        rendering command length
4381            4           4217            rendering command opcode
4382
4383    The remaining commands are non-rendering commands.  These commands
4384    are sent separately (i.e., not as part of a glXRender or
4385    glXRenderLarge request), using the glXVendorPrivateWithReply
4386    request:
4387
4388        DeleteProgramsARB
4389            1           CARD8           opcode (X assigned)
4390            1           17              GLX opcode (glXVendorPrivateWithReply)
4391            2           4+n             request length
4392            4           1294            vendor specific opcode
4393            4           GLX_CONTEXT_TAG context tag
4394            4           INT32           n
4395            n*4         LISTofCARD32    programs
4396
4397        GenProgramsARB
4398            1           CARD8           opcode (X assigned)
4399            1           17              GLX opcode (glXVendorPrivateWithReply)
4400            2           4               request length
4401            4           1295            vendor specific opcode
4402            4           GLX_CONTEXT_TAG context tag
4403            4           INT32           n
4404          =>
4405            1           1               reply
4406            1                           unused
4407            2           CARD16          sequence number
4408            4           n               reply length
4409            24                          unused
4410            n*4         LISTofCARD322   programs
4411
4412        GetProgramEnvParameterfvARB
4413            1           CARD8           opcode (X assigned)
4414            1           17              GLX opcode (glXVendorPrivateWithReply)
4415            2           6               request length
4416            4           1296            vendor specific opcode
4417            4           GLX_CONTEXT_TAG context tag
4418            4           ENUM            target
4419            4           CARD32          index
4420            4           ENUM            pname
4421          =>
4422            1           1               reply
4423            1                           unused
4424            2           CARD16          sequence number
4425            4           m               reply length, m=(n==1?0:n)
4426            4                           unused
4427            4           CARD32          n (number of parameter components)
4428
4429            if (n=1) this follows:
4430
4431            4           FLOAT32         params
4432            12                          unused
4433
4434            otherwise this follows:
4435
4436            16                          unused
4437            n*4         LISTofFLOAT32   params
4438
4439        GetProgramEnvParameterdvARB
4440            1           CARD8           opcode (X assigned)
4441            1           17              GLX opcode (glXVendorPrivateWithReply)
4442            2           6               request length
4443            4           1297            vendor specific opcode
4444            4           GLX_CONTEXT_TAG context tag
4445            4           ENUM            target
4446            4           CARD32          index
4447            4           ENUM            pname
4448          =>
4449            1           1               reply
4450            1                           unused
4451            2           CARD16          sequence number
4452            4           m               reply length, m=(n==1?0:n*2)
4453            4                           unused
4454            4           CARD32          n (number of parameter components)
4455
4456            if (n=1) this follows:
4457
4458            8           FLOAT64         params
4459            8                           unused
4460
4461            otherwise this follows:
4462
4463            16                          unused
4464            n*8         LISTofFLOAT64   params
4465
4466        GetProgramLocalParameterfvARB
4467            1           CARD8           opcode (X assigned)
4468            1           17              GLX opcode (glXVendorPrivateWithReply)
4469            2           6               request length
4470            4           1305            vendor specific opcode
4471            4           GLX_CONTEXT_TAG context tag
4472            4           ENUM            target
4473            4           CARD32          index
4474            4           ENUM            pname
4475          =>
4476            1           1               reply
4477            1                           unused
4478            2           CARD16          sequence number
4479            4           m               reply length, m=(n==1?0:n)
4480            4                           unused
4481            4           CARD32          n (number of parameter components)
4482
4483            if (n=1) this follows:
4484
4485            4           FLOAT32         params
4486            12                          unused
4487
4488            otherwise this follows:
4489
4490            16                          unused
4491            n*4         LISTofFLOAT32   params
4492
4493        GetProgramLocalParameterdvARB
4494            1           CARD8           opcode (X assigned)
4495            1           17              GLX opcode (glXVendorPrivateWithReply)
4496            2           6               request length
4497            4           1306            vendor specific opcode
4498            4           GLX_CONTEXT_TAG context tag
4499            4           ENUM            target
4500            4           CARD32          index
4501            4           ENUM            pname
4502          =>
4503            1           1               reply
4504            1                           unused
4505            2           CARD16          sequence number
4506            4           m               reply length, m=(n==1?0:n*2)
4507            4                           unused
4508            4           CARD32          n (number of parameter components)
4509
4510            if (n=1) this follows:
4511
4512            8           FLOAT64         params
4513            8                           unused
4514
4515            otherwise this follows:
4516
4517            16                          unused
4518            n*8         LISTofFLOAT64   params
4519
4520        GetProgramivARB
4521            1           CARD8           opcode (X assigned)
4522            1           17              GLX opcode (glXVendorPrivateWithReply)
4523            2           5               request length
4524            4           1307            vendor specific opcode
4525            4           GLX_CONTEXT_TAG context tag
4526            4           ENUM            target
4527            4           ENUM            pname
4528          =>
4529            1           1               reply
4530            1                           unused
4531            2           CARD16          sequence number
4532            4           m               reply length, m=(n==1?0:n)
4533            4                           unused
4534            4           CARD32          n
4535
4536            if (n=1) this follows:
4537
4538            4           INT32           params
4539            12                          unused
4540
4541            otherwise this follows:
4542
4543            16                          unused
4544            n*4         LISTofINT32     params
4545
4546        GetProgramStringARB
4547            1           CARD8           opcode (X assigned)
4548            1           17              GLX opcode (glXVendorPrivateWithReply)
4549            2           5               request length
4550            4           1308            vendor specific opcode
4551            4           GLX_CONTEXT_TAG context tag
4552            4           ENUM            target
4553            4           ENUM            pname
4554          =>
4555            1           1               reply
4556            1                           unused
4557            2           CARD16          sequence number
4558            4           (n+p)/4         reply length
4559            4                           unused
4560            4           CARD32          n
4561            16                          unused
4562            n           STRING          program
4563            p                           unused, p=pad(n)
4564
4565        IsProgramARB
4566            1           CARD8           opcode (X assigned)
4567            1           17              GLX opcode (glXVendorPrivateWithReply)
4568            2           4               request length
4569            4           1304            vendor specific opcode
4570            4           GLX_CONTEXT_TAG context tag
4571            4           INT32           n
4572          =>
4573            1           1               reply
4574            1                           unused
4575            2           CARD16          sequence number
4576            4           0               reply length
4577            4           BOOL32          return value
4578            20                          unused
4579
4580
4581Errors
4582
4583    The error INVALID_OPERATION is generated by ProgramStringARB if the
4584    program string <string> is syntactically incorrect or violates any
4585    semantic restriction of the execution environment of the specified
4586    program target <target>.  The error INVALID_OPERATION may also be
4587    generated by ProgramStringARB if the specified program would exceed
4588    native resource limits of the implementation.
4589
4590    The error INVALID_OPERATION is generated by BindProgramARB if
4591    <program> is the name of a program whose target does not match
4592    <target>.
4593
4594    The error INVALID_VALUE is generated by commands
4595    ProgramEnvParameter{fd}ARB, ProgramEnvParameter{fd}vARB, and
4596    GetProgramEnvParameter{fd}vARB if <index> is greater than or equal
4597    to the value of MAX_PROGRAM_ENV_PARAMETERS_ARB corresponding to the
4598    program target <target>.
4599
4600    The error INVALID_VALUE is generated by commands
4601    ProgramLocalParameter4{fd}ARB, ProgramLocalParameter4{fd}vARB, and
4602    GetProgramLocalParameter{fd}vARB if <index> is greater than or equal
4603    to the value of MAX_PROGRAM_LOCAL_PARAMETERS_ARB corresponding to
4604    the program target <target>.
4605
4606    The error INVALID_OPERATION is generated if Begin, RasterPos, or any
4607    command that performs an explicit Begin is called when fragment
4608    program mode is enabled and the currently bound fragment program
4609    object does not contain a valid fragment program.
4610
4611    The error INVALID_OPERATION is generated by any command accessing
4612    texture coordinate processing state if the texture unit number
4613    corresponding to the current value of ACTIVE_TEXTURE is greater than
4614    or equal to the implementation-dependent constant
4615    MAX_TEXTURE_COORDS_ARB.  Such commands include: GetTexGen{if}v;
4616    TexGen{ifd}, TexGen{ifd}v; Disable, Enable, IsEnabled with argument
4617    TEXTURE_GEN_{STRQ}; Get with argument CURRENT_TEXTURE_COORDS,
4618    CURRENT_RASTER_TEXTURE_COORDS, TEXTURE_STACK_DEPTH, TEXTURE_MATRIX,
4619    TRANSPOSE_TEXTURE_MATRIX; when the current matrix mode is TEXTURE,
4620    Frustum, LoadIdentity, LoadMatrix{fd}, LoadTransposeMatrix{fd},
4621    MultMatrix{fd}, MultTransposeMatrix{fd}, Ortho, PopMatrix,
4622    PushMatrix, Rotate{fd}, Scale{fd}, Translate{fd}.
4623
4624    The error INVALID_OPERATION is generated by any command accessing
4625    texture image processing state if the texture unit number
4626    corresponding to the current value of ACTIVE_TEXTURE is greater than
4627    or equal to the implementation-dependent constant
4628    MAX_TEXTURE_IMAGE_UNITS_ARB.  Such commands include: BindTexture;
4629    GetCompressedTexImage, GetTexEnv{if}v, GetTexImage,
4630    GetTexLevelParameter{if}v, GetTexParameter{if}v; TexEnv{if},
4631    TexEnv{if}v, TexParameter{if}, TexParameter{if}v; Disable, Enable,
4632    IsEnabled with argument TEXTURE_{123}D, TEXTURE_CUBE_MAP; Get with
4633    argument TEXTURE_BINDING_{123}D, TEXTURE_BINDING_CUBE_MAP;
4634    CompressedTexImage{123}D, CompressedTexSubImage{123}D,
4635    CopyTexImage{12}D, CopyTexSubImage{123}D, TexImage{123}D,
4636    TexSubImage{123}D.
4637
4638
4639New State
4640
4641
4642    Get Value                        Type    Get Command    Initial Value Description         Section       Attribute
4643    -------------------------------  ------  -------------  ------------- ------------------  ------------  ------------
4644    FRAGMENT_PROGRAM_ARB             B       IsEnabled      False         fragment program    3.8           enable
4645                                                                          enable
4646    -                                24+xR4  GetProgramEnv- (0,0,0,0)     program environment 3.11.1        -
4647                                             ParameterARB                 parameters
4648    PROGRAM_ERROR_POSITION_ARB       Z       GetIntegerv    -1            last program error  3.11.1        -
4649                                                                          position
4650    PROGRAM_ERROR_STRING_ARB         0+xub   GetString      ""            last program error  3.11.1        -
4651                                                                          string
4652
4653    Table X.6.  New Accessible State Introduced by ARB_fragment_program.
4654
4655
4656    Get Value                            Type   Get Command          Initial Value    Description             Sec       Attrib
4657    --------------------                 -----  -------------------  ---------------  ----------------------  --------  ------
4658    PROGRAM_BINDING_ARB                  Z+     GetProgramivARB      object-specific  bound program name      6.1.12    -
4659    PROGRAM_LENGTH_ARB                   Z+     GetProgramivARB      0                bound program length    6.1.12    -
4660    PROGRAM_FORMAT_ARB                   Z1     GetProgramivARB      PROGRAM_FORMAT_  bound program format    6.1.12    -
4661                                                                     ASCII_ARB
4662    PROGRAM_STRING_ARB                   ubxn   GetProgramStringARB  (empty)          bound program string    6.1.12    -
4663    PROGRAM_INSTRUCTIONS_ARB             Z+     GetProgramivARB      0                bound program           6.1.12    -
4664                                                                                      total instructions
4665    PROGRAM_ALU_INSTRUCTIONS_ARB         Z+     GetProgramivARB      0                bound program           6.1.12    -
4666                                                                                      ALU instructions
4667    PROGRAM_TEX_INSTRUCTIONS_ARB         Z+     GetProgramivARB      0                bound program           6.1.12    -
4668                                                                                      texture instructions
4669    PROGRAM_TEX_INDIRECTIONS_ARB         Z+     GetProgramivARB      0                bound program           6.1.12    -
4670                                                                                      texture indirections
4671    PROGRAM_TEMPORARIES_ARB              Z+     GetProgramivARB      0                bound program           6.1.12    -
4672                                                                                      temporaries
4673    PROGRAM_PARAMETERS_ARB               Z+     GetProgramivARB      0                bound program           6.1.12    -
4674                                                                                      parameter bindings
4675    PROGRAM_ATTRIBS_ARB                  Z+     GetProgramivARB      0                bound program           6.1.12    -
4676                                                                                      attribute bindings
4677    PROGRAM_NATIVE_INSTRUCTIONS_ARB      Z+     GetProgramivARB      0                bound program native    6.1.12    -
4678                                                                                      instructions
4679    PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB  Z+     GetProgramivARB      0                bound program native    6.1.12    -
4680                                                                                      ALU instructions
4681    PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB  Z+     GetProgramivARB      0                bound program native    6.1.12    -
4682                                                                                      texture instructions
4683    PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB  Z+     GetProgramivARB      0                bound program native    6.1.12    -
4684                                                                                      texture indirections
4685    PROGRAM_NATIVE_TEMPORARIES_ARB       Z+     GetProgramivARB      0                bound program native    6.1.12    -
4686                                                                                      temporaries
4687    PROGRAM_NATIVE_PARAMETERS_ARB        Z+     GetProgramivARB      0                bound program native    6.1.12    -
4688                                                                                      parameter bindings
4689    PROGRAM_NATIVE_ATTRIBS_ARB           Z+     GetProgramivARB      0                bound program native    6.1.12    -
4690                                                                                      attribute bindings
4691    PROGRAM_UNDER_NATIVE_LIMITS_ARB      B      GetProgramivARB      0                bound program under     6.1.12    -
4692                                                                                      native resource limits
4693    -                                    24+xR4 GetProgramLocal-     (0,0,0,0)        bound program local     3.11.1    -
4694                                                ParameterARB                          parameter value
4695
4696    Table X.7.  Program Object State.  Program object queries return attributes of
4697    the program object currently bound to the program target <target>.
4698
4699
4700    Get Value    Type    Get Command   Initial Value  Description                Sec       Attribute
4701    ---------    ------  -----------   -------------  -------------------------  --------  ---------
4702    -            16+xR4  -             undefined      temporary registers        3.11.3.3  -
4703    -            2xR4    -             undefined      fragment result registers  3.11.3.4  -
4704
4705    Table X.8.  Fragment Program Per-fragment Execution State.  All per-fragment
4706    execution state registers are uninitialized at the beginning of program
4707    execution.
4708
4709
4710    Get Value                          Type      Get Command      Initial Value  Description          Sec      Attribute
4711    ------------------------------     --------  --------------   -------------  -------------------  -------  ---------
4712    CURRENT_MATRIX_ARB                 m*n*xM^4  GetFloatv        Identity       current matrix       6.1.2    -
4713    CURRENT_MATRIX_STACK_DEPTH_ARB     m*Z+      GetIntegerv      1              current stack depth  6.1.2    -
4714
4715    Table X.9.  Current matrix state where m is the total number of matrices
4716    including texture matrices and program matrices and n is the number of
4717    matrices on each particular matrix stack.  Note that this state is aliased
4718    with existing matrix state.
4719
4720
4721New Implementation Dependent State
4722                                                                    Minimum
4723    Get Value                                Type  Get Command      Value      Description             Sec.       Attrib
4724    ---------                                ----  -----------      -------    -----------             ----       ------
4725    MAX_TEXTURE_COORDS_ARB                   Z+    GetIntegerv      2          number of texture       2.7        -
4726                                                                               coordinate sets
4727    MAX_TEXTURE_IMAGE_UNITS_ARB              Z+    GetIntegerv      2          number of texture       2.10.2     -
4728                                                                               image units
4729    MAX_PROGRAM_ENV_PARAMETERS_ARB           Z+    GetProgramivARB  24         maximum program         3.11.1     -
4730                                                                               env parameters
4731    MAX_PROGRAM_LOCAL_PARAMETERS_ARB         Z+    GetProgramivARB  24         maximum program         3.11.1     -
4732                                                                               local parameters
4733    MAX_PROGRAM_MATRICES_ARB                 Z+    GetIntegerv      8 (not to  maximum number of       3.11.7     -
4734                                                                    exceed 32) program matrices
4735    MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB       Z+    GetIntegerv      1          maximum program         3.11.7     -
4736                                                                               matrix stack depth
4737    MAX_PROGRAM_INSTRUCTIONS_ARB             Z+    GetProgramivARB  72         maximum program         6.1.12     -
4738                                                                               total instructions
4739    MAX_PROGRAM_ALU_INSTRUCTIONS_ARB         Z+    GetProgramivARB  48         number of frag. prg.    6.1.12     -
4740                                                                               ALU instructions
4741    MAX_PROGRAM_TEX_INSTRUCTIONS_ARB         Z+    GetProgramivARB  24         number of frag. prg.    6.1.12     -
4742                                                                               texture instructions
4743    MAX_PROGRAM_TEX_INDIRECTIONS_ARB         Z+    GetProgramivARB  4          number of frag. prg.    6.1.12     -
4744                                                                               texture indirections
4745    MAX_PROGRAM_TEMPORARIES_ARB              Z+    GetProgramivARB  16         maximum program         6.1.12     -
4746                                                                               temporaries
4747    MAX_PROGRAM_PARAMETERS_ARB               Z+    GetProgramivARB  24         maximum program         6.1.12     -
4748                                                                               parameter bindings
4749    MAX_PROGRAM_ATTRIBS_ARB                  Z+    GetProgramivARB  10         maximum program         6.1.12     -
4750                                                                               attribute bindings
4751    MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB      Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4752                                                                               total instructions
4753    MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB  Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4754                                                                               ALU instructions
4755    MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB  Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4756                                                                               texture instructions
4757    MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB  Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4758                                                                               texture indirections
4759    MAX_PROGRAM_NATIVE_TEMPORARIES_ARB       Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4760                                                                               temporaries
4761    MAX_PROGRAM_NATIVE_PARAMETERS_ARB        Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4762                                                                               parameter bindings
4763    MAX_PROGRAM_NATIVE_ATTRIBS_ARB           Z+    GetProgramivARB  -          maximum program native  6.1.12     -
4764                                                                               attribute bindings
4765
4766    Table X.10.  New Implementation-Dependent Values Introduced by
4767    ARB_fragment_program.  Values queried by GetProgram require a <pname> of
4768    FRAGMENT_PROGRAM_ARB.
4769
4770
4771Sample Usage
4772
4773    The following program shows how to perform a simple modulation
4774    between the interpolated color and a single texture:
4775
4776      !!ARBfp1.0
4777      # Simple program to show how to code up the default texture environment
4778
4779      ATTRIB tex = fragment.texcoord;      #first set of texture coordinates
4780      ATTRIB col = fragment.color.primary; #diffuse interpolated color
4781
4782      OUTPUT outColor = result.color;
4783
4784      TEMP tmp;
4785
4786      TXP tmp, tex, texture, 2D;           #sample the texture
4787
4788      MUL outColor, tmp, col;              #perform the modulation
4789
4790      END
4791
4792    The following is an example the simulates a chrome surface:
4793
4794      !!ARBfp1.0
4795
4796      ########################
4797      # Input Textures:
4798      #-----------------------
4799      # Texture 0 contains the default 2D texture used for general mapping
4800      # Texture 2 contains a 1D pointlight falloff map
4801      # Texture 3 contains a 2D map for calculating specular lighting
4802      # Texture 4 contains normalizer cube map
4803      #
4804      # Input Texture Coordinates:
4805      #-----------------------
4806      # TexCoord1 contains the calculated normal
4807      # TexCoord2 contains the light to vertex vector
4808      # TexCoord3 contains the half-vector in tangent space
4809      # TexCoord4 contains the light vector in tangent space
4810      # TexCoord5 contains the eye vector in tangent space
4811      ########################
4812
4813      TEMP     NdotH, lV, L;
4814
4815      ALIAS    diffuse  = L;
4816      PARAM       half  = { 0.5, 0.5, 0.5, 0.5 };
4817      ATTRIB   norm_tc  = fragment.texcoord[1];
4818      ATTRIB     lv_tc  = fragment.texcoord[2];
4819      ATTRIB   half_tc  = fragment.texcoord[3];
4820      ATTRIB  light_tc  = fragment.texcoord[4];
4821      ATTRIB    eye_tc  = fragment.texcoord[5];
4822      OUTPUT      oCol  = result.color;
4823
4824      TEX     L, light_tc, texture[4], CUBE; # Sample cube map normalizer
4825
4826      # Calculate diffuse lighting (N.L)
4827      SUB     L, L, half;              # Bias L and then multiply by 2
4828      ADD     L, L, L;
4829      DP3     diffuse, norm_tc, L;     # N.L
4830
4831      # Calculate specular lighting component { (N.H), |H|^2 }
4832      DP3     NdotH.x, norm_tc, half_tc;
4833      DP3     NdotH.y, half_tc, half_tc;
4834
4835      DP3     lV.x, lv_tc, lv_tc;     # lV = (|light to vertex|)^2
4836
4837
4838      #############
4839      # Pass 2
4840      #############
4841
4842      TEMP     base, specular;
4843      ALIAS    atten  = lV;
4844
4845      TEX      base,     eye_tc, texture[0], 2D; # sample enviroment map using eye vector
4846      TEX      atten,    lV,     texture[2], 1D; # Sample attenuation map
4847      TEX      specular, NdotH,  texture[3], 2D; # Sample specular NHHH map= (N.H)^256
4848
4849      # specular = (N.H)^256 * (N.L)
4850      # this ensures a pixel is only lit if facing the light (since the specular
4851      # exponent makes negative N.H positive we must do this)
4852      MUL      specular, specular, diffuse;
4853
4854      # specular = specular * environment map
4855      MUL      specular, base, specular;
4856
4857      # diffuse = diffuse * environment map
4858      MUL      diffuse, base, diffuse;
4859
4860      # outColor = (specular * environment map) + (diffuse * environment map)
4861      ADD      base, specular, diffuse;
4862
4863      # Apply point light attenutaion
4864      MUL      oCol, base, atten.r;
4865
4866      END
4867
4868
4869Revision History
4870
4871   Date: 10/08/2013
4872   Revision: 28
4873      - Change GLvoid -> void (Bug 10412).
4874
4875   Date: 11/04/2006
4876   Revision: 27
4877      - Updated contact info after ATI/AMD merger.
4878
4879   Date: 8/22/2003
4880   Revision: 26
4881      - Added list of commands generating errors when active texture
4882        unit selector is out of range.
4883      - Fixed typo in <stateMatrixItem> rule.
4884      - Clarified behavior of fragment.position.z with respect to depth
4885        offset.
4886
4887   Date: 2/26/2003
4888   Revision: 25
4889      - Fixed description of KIL instruction to reflect less than zero
4890        test, not less than or equal to zero.
4891      - Clarified the processing of incoming and outgoing depths and
4892        colors to reflect the conversion to floating-point on input and
4893        the conversion to fixed-point on output.
4894
4895   Date: 1/10/2003
4896   Revision: 24
4897      - Fixed bug where "state.matrix.mvp" was specified incorrectly.
4898        It should be P*M0 rather than M0*P.
4899      - Added issue warning about CMP opcode's order of operands.
4900
4901   Date: 10/22/2002
4902   Revision: 23
4903      - Fixed reference to <extSwizComp> rule in 3.11.5.28.  Instead
4904        reference both <xyzwExtSwizComp> and <rgbaExtSwizComp> rules.
4905
4906   Date: 10/02/2002
4907   Revision: 22
4908      - Fixed typo in section 3.11.1, where 8 program environment and
4909        8 program local parameters are listed as the minimums instead
4910        of 24 of each.  Table X.10 had the correct values.
4911      - Fixed <stateTexEnvItem> to refer to legacy texture units.
4912      - Fixed typos in issue 29 pseudo-code, added some clarification.
4913
4914   Date: 9/19/2002
4915   Revision: 21
4916      - Added clarifying paragraph for native texture indirection
4917        counting, offering examples of possible cases where texture
4918        indirections may be increased.
4919      - Fixed typos in issues 25 and 29.
4920
4921   Date: 9/16/2002
4922   Revision: 20
4923      - Added precision hint program options.
4924      - Fixed various typos, reworded some parts for consistency.
4925      - Updated issues list.
4926
4927   Date: 9/13/2002
4928   Revision: 19
4929      - Promoted minimum precision of texture coordinates in 2.1.1.
4930      - Added ARB_fog_* program options.
4931      - Removed modification to 3.9, put clamps in 3.11.4.4.
4932      - Made 'texture' a reserved keyword in the grammar.
4933      - Fixed various typos.
4934      - Updated section 3.11.6.
4935      - Updated issues list.
4936
4937   Date: 9/11/2002
4938   Revision: 18
4939      - Updated for consistency with ARB_vertex_program revision 36.
4940      - Depth output moved to 3rd component of result.depth.
4941      - Fixed various typos, reworded things in many places.
4942      - Added NV_fragment_program interactions.
4943      - Updated issues list.
4944
4945   Date: 9/09/2002
4946   Revision: 17
4947      - Added fogcoord and position attributes.
4948      - Moved fragment program section to 3.11, after fog.
4949      - Changed MAX_TEXTURE_UNITS/MAX_AUX_TEXTURE_UNITS to
4950        MAX_TEXTURE_COORDS/MAX_TEXTURE_IMAGE_UNITS.
4951      - Removed TRC and MOD instructions.
4952      - Added SIN and COS instructions.
4953      - Added more clarity to resource consumption wording.
4954      - Added invariance wording concerning depth-replacement.
4955      - Added rule that a program that fails to load must always fail to
4956        load, regardless of GL state.
4957      - Updated issues list.
4958
4959   Date: 8/30/2002
4960   Revision: 16
4961      - Improved texture indirection description.
4962      - Defined result of sample from incomplete texture as (0,0,0,1).
4963      - Removed PROGRAMS_LOAD_OVER_NATIVE_LIMITS_ARB per-target query.
4964      - Allowed ProgramStringARB to fail on non-native programs.
4965      - Updated issues list.
4966
4967   Date: 8/28/2002
4968   Revision: 15
4969      - Updated for consistency with ARB_vertex_program revision 35.
4970      - Added PROGRAMS_LOAD_OVER_NATIVE_LIMITS_ARB per-target query.
4971      - Changed MAX_AUX_TEXTURE_UNITS_ARB enum value.
4972      - Updated issues list.
4973
4974   Date: 8/22/2002
4975   Revision: 14
4976      - Added sine/cosine instruction (SCS).
4977      - Updated texture sample grammar, replaced texenables hierarchy.
4978      - Added EXT_vertex_weighting and ARB_vertex_blend dependency.
4979      - Updated issues list.
4980
4981   Date: 8/14/2002
4982   Revision: 13
4983      - Fixed <paramConstant> grammar rule.
4984      - Updated issues list.
4985
4986   Date: 8/06/2002
4987   Revision: 12
4988      - Fixed various typos.
4989      - Updated issues list.
4990      - Added wording to 3.10.3.6 to reflect that native resource
4991        consumption may increase due to emulated instructions.
4992
4993   Date: 7/29/2002
4994   Revision: 11
4995      - Updated for consistency with ARB_vertex_program revision 34.
4996      - Added support for matrix binding.
4997      - Removed precision queries.
4998      - Updated issues list.
4999
5000   Date: 7/16/2002
5001   Revision: 10
5002      - Updated for consistency with ARB_vertex_program revision 31.
5003      - Added fog params and depth range bindings to grammar.
5004      - Removed stpq writemasks and swizzles from grammar.
5005      - Required swizzle components to come from same set, xyzw or rgba.
5006
5007   Date: 7/10/2002
5008   Revision: 9
5009      - Made fog params and depth range bindable.
5010      - Changed texture instruction names to match 3-letter format.
5011      - Made texture instructions more consistent with ALU instructions.
5012      - Increased minimums for implementation-dependent values.
5013      - Re-introduced 4-components swizzles and the SWZ instruction.
5014      - Updated issues list.
5015
5016   Date: 7/03/2002
5017   Revision: 8
5018      - Fixed typos.
5019      - Added DST, LIT, SGE, SLT instructions.
5020      - Changed FRC definition to match ARB_vertex_program, added MOD
5021        instruction to expose fmod(arg, 1.0) behavior.
5022
5023   Date: 6/25/2002
5024   Revision: 7
5025      - Updated for consistency with ARB_vertex_program revision 29.
5026
5027   Date: 6/19/2002
5028   Revision: 6
5029      - Updated for consistency with ARB_vertex_program revision 28.
5030      - Changed from ATI to ARB prefix/suffix.
5031      - Started using single integer revision number.
5032      - Added a few more issues to the list.
5033
5034   Date: 6/14/2002
5035   Revision: 1.4
5036      - Updated for consistency with ARB_vertex_program revision 27.
5037      - Added a few more issues to the list.
5038
5039   Date: 6/05/2002
5040   Revision: 1.3
5041      - Updated for consistency with ARB_vertex_program revision 26.
5042      - Incorporated program object management, removing dependency on
5043        ARB_vertex_program.
5044      - Added interaction with ARB_shadow.
5045
5046   Date: 6/03/2002
5047   Revision: 1.2
5048      - Updated for consistency with ARB_vertex_program revision 25.
5049      - Fixed TexInstructions to use <texSrcReg>, i.e. no parameters.
5050      - Added TRC, POW, DPH instructions, updated FRC and LRP.
5051      - Added fog color parameter binding.
5052
5053   Date: 5/23/2002
5054   Revision: 1.1
5055      - Updated for consistency with ARB_vertex_program revision 24.
5056      - Added GetProgramfvATI entrypoint for querying precision values.
5057
5058   Date: 5/10/2002
5059   Revision: 1.0
5060      - First draft for circulation.
5061