Name

    ARB_geometry_shader4

Name String

    GL_ARB_geometry_shader4

Contact

    Pat Brown, NVIDIA (pbrown 'at' nvidia.com)
    Barthold Lichtenbelt, NVIDIA (blichtenbelt 'at' nvidia.com)

Notice

    Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Approved by the ARB on July 11, 2008

Version

    Last Modified Date:         01/21/2011
    NVIDIA Revision:            26

Number

    ARB Extension #47

Dependencies

    OpenGL 1.1 is required.

    This extension is written against the OpenGL 2.0 specification.

    EXT_framebuffer_object interacts with this extension.

    EXT_framebuffer_blit interacts with this extension.

    EXT_texture_array interacts with this extension.

    ARB_texture_rectangle trivially affects the definition of this
    extension.

    ARB_texture_buffer_object trivially affects the definition of this
    extension.

    NV_primitive_restart trivially affects the definition of this
    extension.

    This extension interacts with ARB_tranform_feedback.

    This extension interacts with geometry shader support in OpenGL 3.2.

    This extension interacts with ARB_uniform_buffer_object.

Overview

    ARB_geometry_shader4 defines a new shader type available to be run on the
    GPU, called a geometry shader. Geometry shaders are run after vertices are
    transformed, but prior to color clamping, flat shading and clipping.

    A geometry shader begins with a single primitive (point, line,
    triangle). It can read the attributes of any of the vertices in the
    primitive and use them to generate new primitives. A geometry shader has a
    fixed output primitive type (point, line strip, or triangle strip) and
    emits vertices to define a new primitive. A geometry shader can emit
    multiple disconnected primitives. The primitives emitted by the geometry
    shader are clipped and then processed like an equivalent OpenGL primitive
    specified by the application.

    Furthermore, ARB_geometry_shader4 provides four additional primitive
    types: lines with adjacency, line strips with adjacency, separate
    triangles with adjacency, and triangle strips with adjacency.  Some of the
    vertices specified in these new primitive types are not part of the
    ordinary primitives, instead they represent neighboring vertices that are
    adjacent to the two line segment end points (lines/strips) or the three
    triangle edges (triangles/tstrips). These vertices can be accessed by
    geometry shaders and used to match up the vertices emitted by the geometry
    shader with those of neighboring primitives.

    Since geometry shaders expect a specific input primitive type, an error
    will occur if the application presents primitives of a different type.
    For example, if a geometry shader expects points, an error will occur at
    Begin() time, if a primitive mode of TRIANGLES is specified.

New Procedures and Functions

    void ProgramParameteriARB(uint program, enum pname, int value);
    void FramebufferTextureARB(enum target, enum attachment, 
                               uint texture, int level);
    void FramebufferTextureLayerARB(enum target, enum attachment, 
                                    uint texture, int level, int layer);
    void FramebufferTextureFaceARB(enum target, enum attachment,
                                   uint texture, int level, enum face);

New Tokens

    Accepted by the <type> parameter of CreateShader and returned by the
    <params> parameter of GetShaderiv:

        GEOMETRY_SHADER_ARB                             0x8DD9

    Accepted by the <pname> parameter of ProgramParameteriARB and
    GetProgramiv:

        GEOMETRY_VERTICES_OUT_ARB                       0x8DDA
        GEOMETRY_INPUT_TYPE_ARB                         0x8DDB
        GEOMETRY_OUTPUT_TYPE_ARB                        0x8DDC

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

        MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB             0x8C29
        MAX_GEOMETRY_VARYING_COMPONENTS_ARB              0x8DDD
        MAX_VERTEX_VARYING_COMPONENTS_ARB                0x8DDE
        MAX_VARYING_COMPONENTS
        MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB              0x8DDF
        MAX_GEOMETRY_OUTPUT_VERTICES_ARB                 0x8DE0
        MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB         0x8DE1

    Accepted by the <mode> parameter of Begin, DrawArrays,
    MultiDrawArrays, DrawElements, MultiDrawElements, and
    DrawRangeElements:

        LINES_ADJACENCY_ARB                              0xA
        LINE_STRIP_ADJACENCY_ARB                         0xB
        TRIANGLES_ADJACENCY_ARB                          0xC
        TRIANGLE_STRIP_ADJACENCY_ARB                     0xD

    Returned by CheckFramebufferStatusARB:

        FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB         0x8DA8
        FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB           0x8DA9

    Accepted by the <pname> parameter of GetFramebufferAttachment-
    ParameterivARB:

        FRAMEBUFFER_ATTACHMENT_LAYERED_ARB               0x8DA7
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER             0x8CD4

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
    and by the <pname> parameter of GetIntegerv, GetFloatv, GetDoublev,
    and GetBooleanv:

        PROGRAM_POINT_SIZE_ARB                           0x8642

    (Note: FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is simply an alias for the
    FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_ARB token provided in
    EXT_framebuffer_object.  This extension generalizes the notion of
    "<zoffset>" to include layers of an array texture.)

    (Note:  PROGRAM_POINT_SIZE_ARB is simply an alias for the
    VERTEX_PROGRAM_POINT_SIZE token provided in OpenGL 2.0, which is itself an
    alias for VERTEX_PROGRAM_POINT_SIZE_ARB provided by
    ARB_vertex_program. Program-computed point sizes can be enabled if
    geometry shaders are enabled.)

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL
Operation)

    Modify Section 2.6.1 (Begin and End Objects), p. 13

    (Add to end of section, p. 18)

    (add figure on discussions of lines and line strips with adjacency)

        1 - - - 2----->3 - - - 4     1 - - - 2--->3--->4--->5 - - - 6

        5 - - - 6----->7 - - - 8

               (a)                             (b)

      Figure 2.X1 (a) Lines with adjacency, (b) Line strip with adjacency.
      The vertices connected with solid lines belong to the main primitives;
      the vertices connected by dashed lines are the adjacent vertices that
      may be used in a geometry shader.

    Lines with Adjacency

    Lines with adjacency are independent line segments where each endpoint has
    a corresponding "adjacent" vertex that can be accessed by a geometry
    shader (Section 2.16).  If a geometry shader is not active, the "adjacent"
    vertices are ignored.

    A line segment is drawn from the 4i + 2nd vertex to the 4i + 3rd vertex
    for each i = 0, 1, ... , n-1, where there are 4n+k vertices between the
    Begin and End.  k is either 0, 1, 2, or 3; if k is not zero, the final k
    vertices are ignored.  For line segment i, the 4i + 1st and 4i + 4th
    vertices are considered adjacent to the 4i + 2nd and 4i + 3rd vertices,
    respectively.  See Figure 2.X1.

    Lines with adjacency are generated by calling Begin with the argument
    value LINES_ADJACENCY_ARB.

    Line Strips with Adjacency

    Line strips with adjacency are similar to line strips, except that each
    line segment has a pair of adjacent vertices that can be accessed by a
    geometry shader (Section 2.15).  If a geometry shader is not active, the
    "adjacent" vertices are ignored.

    A line segment is drawn from the i + 2nd vertex to the i + 3rd vertex for
    each i = 0, 1, ..., n-1, where there are n+3 vertices between the Begin
    and End.  If there are fewer than four vertices between a Begin and End,
    all vertices are ignored.  For line segment i, the i + 1st and i + 4th
    vertex are considered adjacent to the i + 2nd and i + 3rd vertices,
    respectively.  See Figure 2.X1.

    Line strips with adjacency are generated by calling Begin with the
    argument value LINE_STRIP_ADJACENCY_ARB.

    --------------------------------------------------------------------

    (add figure and discussion of triangles with adjacency)

                   2 - - - 3 - - - 4     8 - - - 9 - - - 10
                           ^\                    ^\
                     \     | \     |       \     | \     |
                           |  \                  |  \
                       \   |   \   |         \   |   \   |
                           |    \                |    \
                         \ |     \ |           \ |     \ |
                           |      v              |      v
                           1<------5             7<------11

                             \     |               \     |

                               \   |                 \   |

                                 \ |                   \ |

                                   6                     12

      Figure 2.X2 Triangles with adjacency.  The vertices connected with solid
      lines belong to the main primitive; the vertices connected by dashed
      lines are the adjacent vertices that may be used in a geometry shader.

    Triangles with Adjacency

    Triangles with adjacency are similar to separate triangles, except that
    each triangle edge has an adjacent vertex that can be accessed by a
    geometry shader (Section 2.15).  If a geometry shader is not active, the
    "adjacent" vertices are ignored.

    The 6i + 1st, 6i + 3rd, and 6i + 5th vertices (in that order) determine a
    triangle for each i = 0, 1, ..., n-1, where there are 6n+k vertices
    between the Begin and End.  k is either 0, 1, 2, 3, 4, or 5; if k is
    non-zero, the final k vertices are ignored.  For triangle i, the i + 2nd,
    i + 4th, and i + 6th vertices are considered adjacent to edges from the i
    + 1st to the i + 3rd, from the i + 3rd to the i + 5th, and from the i +
    5th to the i + 1st vertices, respectively.  See Figure 2.X2.

    Triangles with adjacency are generated by calling Begin with the argument
    value TRIANGLES_ADJACENCY_ARB.

    --------------------------------------------------------------------

    (add figure and discussion of triangle strips with adjacency)

                                  6                     6

                                  | \                   | \

                                  |   \                 |   \

                                  |     \               |     \

      2 - - - 3- - - >6   2 - - - 3------>7     2 - - - 3------>7- - - 10
              ^\                  ^^      |             ^^      ^^      |
        \     | \     |     \     | \     | \     \     | \     | \
              |  \                |  \    |             |  \    |  \    |
          \   |   \   |       \   |   \   |   \     \   |   \   |   \
              |    \              |    \  |             |    \  |    \  |
            \ |     \ |         \ |     \ |     \     \ |     \ |     \
              |      v            |      vv             |      vv      v|
              1<------5           1<------5 - - - 8     1<------5<------9

                \     |             \     |               \     | \     |

                  \   |               \   |                 \   |   \   |

                    \ |                 \ |                   \ |     \ |

                      4                   4                     4       8


                                   6       10

                                   | \     | \

                                   |   \   |   \

                                   |     \ |     \
                           2 - - - 3------>7------>11
                                   ^^      ^^      |
                             \     | \     | \     | \
                                   |  \    |  \    |
                               \   |   \   |   \   |   \
                                   |    \  |    \  |
                                 \ |     \ |     \ |     \
                                   |      vv      vv
                                   1<------5<------9 - - - 12

                                     \     | \     |

                                       \   |   \   |

                                         \ |     \ |

                                           4       8

      Figure 2.X3 Triangle strips with adjacency.  The vertices connected with
      solid lines belong to the main primitives; the vertices connected by
      dashed lines are the adjacent vertices that may be used in a geometry
      shader.

    Triangle Strips with Adjacency

    Triangle strips with adjacency are similar to triangle strips, except that
    each triangle edge has an adjacent vertex that can be accessed by a
    geometry shader (Section 2.15).  If a geometry shader is not active, the
    "adjacent" vertices are ignored.

    In triangle strips with adjacency, n triangles are drawn using 2 * (n+2) +
    k vertices between the Begin and End.  k is either 0 or 1; if k is 1, the
    final vertex is ignored.  If fewer than 6 vertices are specified between
    the Begin and End, the entire primitive is ignored.  Table 2.X1 describes
    the vertices and order used to draw each triangle, and which vertices are
    considered adjacent to each edge of the triangle.  See Figure 2.X3.

    (add table)
                                 primitive          adjacent
                                 vertices           vertices
      primitive               1st   2nd   3rd     1/2  2/3  3/1
      ---------------        ----  ----  ----    ---- ---- ----
      only (i==0, n==1)        1     3     5       2    6    4
      first (i==0)             1     3     5       2    7    4
      middle (i odd)         2i+3  2i+1  2i+5    2i-1 2i+4 2i+7
      middle (i even)        2i+1  2i+3  2i+5    2i-1 2i+7 2i+4
      last (i==n-1, i odd)   2i+3  2i+1  2i+5    2i-1 2i+4 2i+6
      last (i==n-1, i even)  2i+1  2i+3  2i+5    2i-1 2i+6 2i+4

      Table 2.X1:  Triangles generated by triangle strips with adjacency.
      Each triangle is drawn using the vertices in the "1st", "2nd", and "3rd"
      columns under "primitive vertices", in that order.  The vertices in the
      "1/2", "2/3", and "3/1" columns under "adjacent vertices" are considered
      adjacent to the edges from the first to the second, from the second to
      the third, and from the third to the first vertex of the triangle,
      respectively.  The six rows correspond to the six cases:  the first and
      only triangle (i=0, n=1), the first triangle of several (i=0, n>0),
      "odd" middle triangles (i=1,3,5...), "even" middle triangles
      (i=2,4,6,...), and special cases for the last triangle inside the
      Begin/End, when i is either even or odd.  For the purposes of this
      table, the first vertex specified after Begin is numbered "1" and the
      first triangle is numbered "0".

    Triangle strips with adjacency are generated by calling Begin with the
    argument value TRIANGLE_STRIP_ADJACENCY_ARB.

    Modify Section 2.14.1, Lighting (p. 59)

    (modify fourth paragraph, p. 63) Additionally, vertex and geometry shaders
    can operate in two-sided color mode, which is enabled and disabled by
    calling Enable or Disable with the symbolic value VERTEX_PROGRAM_TWO_SIDE.
    When a vertex or geometry shader is active, the shaders can write front
    and back color values to the gl_FrontColor, gl_BackColor,
    gl_FrontSecondaryColor and gl_BackSecondaryColor outputs. When a vertex or
    geometry shader is active and two-sided color mode is enabled, the GL
    chooses between front and back colors, as described below.  If two-sided
    color mode is disabled, the front color output is always selected.

    Modify Section 2.15.2 Program Objects, p. 73

    Change the first paragraph on p. 74 as follows:

    Program objects are empty when they are created.  Default values for
    program object parameters are discussed in section 2.15.5, Required
    State. A non-zero name that can be used to reference the program object is
    returned.

    Change the language below the LinkProgram command on p. 74 as follows:

    ... Linking can fail for a variety of reasons as specified in the OpenGL
    Shading Language Specification. Linking will also fail if one or more of
    the shader objects, attached to <program> are not compiled successfully,
    or if more active uniform or active sampler variables are used in
    <program> than allowed (see sections 2.15.3 and 2.16.3). Linking will also
    fail if the program object contains objects to form a geometry shader (see
    section 2.16), but no objects to form a vertex shader or if the program
    object contains objects to form a geometry shader, and the value of
    GEOMETRY_VERTICES_OUT_ARB is zero. If LinkProgram failed, ..

    Add the following paragraphs above the description of
    DeleteProgram, p. 75:

    To set a program object parameter, call

        void ProgramParameteriARB(uint program, enum pname, int value)

    <param> identifies which parameter to set for <program>. <value> holds the
    value being set.  Legal values for <param> and <value> are discussed in
    section 2.16.

    Modify Section 2.15.3, Shader Variables, p. 75

    Modify the first paragraph of section 'Varying Variables' p. 83 as
    follows:

    A vertex shader may define one or more varying variables (see the OpenGL
    Shading Language specification). Varying variables are outputs of a vertex
    shader. They are either used as the mechanism to communicate values to a
    geometry shader, if one is active, or to communicate values to the
    fragment shader.  The OpenGL Shading Language specification also defines a
    set of built-in varying variables that vertex shaders can write to (see
    section 7.6 of the OpenGL Shading Language Specification). These variables
    can also be used to communicate values to a geometry shader, if one is
    active, or to communicate values to the fragment shader and to the fixed-
    function processing that occurs after vertex shading.

    If a geometry shader is not active, the values of all varying variables,
    including built-in variables, are expected to be interpolated across the
    primitive being rendered, unless flat shaded. The number of interpolators
    available for processing varying variables is given by the
    implementation-dependent constant MAX_VARYING_COMPONENTS. This value
    represents the number of individual components that can be interpolated;
    varying variables declared as vectors, matrices, and arrays will all
    consume multiple interpolators. When a program is linked, all components
    of any varying variable written by a vertex shader, or read by a fragment
    shader, will count against this limit. The transformed vertex position
    (gl_Position) does not count against this limit. A program whose vertex
    and/or fragment shaders access more than MAX_VARYING_COMPONENTS
    components worth of varying variables may fail to link, unless
    device-dependent optimizations are able to make the program fit within
    available hardware resources.

    Note that the two values MAX_VARYING_FLOATS and MAX_VARYING_COMPONENTS
    are aliases of each other. The use of MAX_VARYING_FLOATS however is
    discouraged; varying variables can be declared as integers as well.

    If a geometry shader is active, the values of varying variables are
    collected by the primitive assembly stage and passed on to the geometry
    shader once enough data for one primitive has been collected (see also
    section 2.16). The OpenGL Shading Language specification also defines a
    set of built-in varying and built-in special variables that vertex shaders
    can write to (see sections 7.1 and 7.6 of the OpenGL Shading Language
    Specification). These variables are also collected and passed on to the
    geometry shader once enough data has been collected. The number of
    components of varying and special variables that can be collected per
    vertex by the primitive assembly stage is given by the implementation
    dependent constant MAX_VERTEX_VARYING_COMPONENTS_ARB. This value
    represents the number of individual components that can be collected;
    varying variables declared as vectors, matrices, and arrays will all
    consume multiple components. When a program is linked, all components of
    any varying variable written by a vertex shader, or read by a geometry
    shader, will count against this limit. A program whose vertex and/or
    geometry shaders access more than MAX_VERTEX_VARYING_COMPONENTS_ARB
    components worth of varying variables may fail to link, unless
    device-dependent optimizations are able to make the program fit within
    available hardware resources.

    Modify Section 2.15.4 Shader Execution, p. 84

    Change the following sentence:

    "The following operations are applied to vertex values that are the result
    of executing the vertex shader:"

    As follows:

    If no geometry shader (see section 2.16) is present in the program object,
    the following operations are applied to vertex values that are the result
    of executing the vertex shader:

    [bulleted list of operations]

    On page 85, below the list of bullets, add the following:

    If a geometry shader is present in the program object, geometry shading
    (section 2.16) is applied to vertex values that are the result of
    executing the vertex shader.

    Modify the first paragraph of the section 'Texture Access', p. 85,
    as follows:

    Vertex shaders have the ability to do a lookup into a texture map, if
    supported by the GL implementation. The maximum number of texture image
    units available to a vertex shader is MAX_VERTEX_TEXTURE_IMAGE_UNITS; a
    maximum number of zero indicates that the GL implementation does not
    support texture accesses in vertex shaders.  The vertex shader, geometry
    shader, if exists, and fragment processing combined cannot use more than
    MAX_COMBINED_TEXTURE_IMAGE_UNITS texture image units. If the vertex
    shader, geometry shader and the fragment processing stage access the same
    texture image unit, then that counts as using three texture image units
    against the MAX_COMBINED_TEXTURE_IMAGE_UNITS limit.

    Modify Section 2.15.5, Required State, p. 88

    Add the following bullets to the state required per program object:

      * One integer to store the value of GEOMETRY_VERTICES_OUT_ARB, initially
        zero.

      * One integer to store the value of GEOMETRY_INPUT_TYPE_ARB, initially
        set to TRIANGLES.

      * One integer to store the value of GEOMETRY_OUTPUT_TYPE_ARB, initially
        set to TRIANGLE_STRIP.

    Insert New Section 2.16, Geometry Shaders after p. 89

    After vertices are processed, they are arranged into primitives, as
    described in section 2.6.1 (Begin/End Objects). This section described a
    new pipeline stage that processes those primitives. A geometry shader
    defines the operations that are performed in this new pipeline stage. A
    geometry shader is an array of strings containing source code. The source
    code language used is described in the OpenGL Shading Language
    specification. A geometry shader operates on a single primitive at a time
    and emits one or more output primitives, all of the same type, which are
    then processed like an equivalent OpenGL primitive specified by the
    application.  The original primitive is discarded after the geometry
    shader completes. The inputs available to a geometry shader are the
    transformed attributes of all the vertices that belong to the primitive.
    Additional "adjacency" primitives are available which also make the
    transformed attributes of neighboring vertices available to the shader.
    The results of the shader are a new set of transformed vertices, arranged
    into primitives by the shader.

    This new geometry shader pipeline stage is inserted after primitive
    assembly, right before color clamping (section 2.14.6), flat shading
    (section 2.14.7) and clipping (sections 2.12 and 2.14.8).

    A geometry shader only applies when the GL is in RGB mode. Its operation
    in color index mode is undefined.

    Geometry shaders are created as described in section 2.15.1 using a type
    parameter of GEOMETRY_SHADER_ARB. They are attached to and used in program
    objects as described in section 2.15.2. When the program object currently
    in use includes a geometry shader, its geometry shader is considered
    active, and is used to process primitives. If the program object has no
    geometry shader, or no program object is in use, this new primitive
    processing pipeline stage is bypassed.

    A program object that includes a geometry shader must also include a
    vertex shader; otherwise a link error will occur.

    Section 2.16.1, Geometry shader Input Primitives

    A geometry shader can operate on one of five input primitive types.
    Depending on the input primitive type, one to six input vertices are
    available when the shader is executed.  Each input primitive type supports
    a subset of the primitives provided by the GL. If a geometry shader is
    active, Begin, or any function that implicitly calls Begin, will produce
    an INVALID_OPERATION error if the <mode> parameter is incompatible with
    the input primitive type of the currently active program object, as
    discussed below.

    The input primitive type is a parameter of the program object, and must be
    set before linking by calling ProgramParameteriARB with <pname> set to
    GEOMETRY_INPUT_TYPE_ARB and <value> set to one of POINTS, LINES,
    LINES_ADJACENCY_ARB, TRIANGLES or TRIANGLES_ADJACENCY_ARB. This setting
    will not be in effect until the next time LinkProgram has been called
    successfully. Note that queries of GEOMETRY_INPUT_TYPE_ARB will return the
    last value set.  This is not necessarily the value used to generate the
    executable code in the program object. After a program object has been
    created it will have a default value for GEOMETRY_INPUT_TYPE_ARB, as
    discussed in section 2.15.5, Required State.

    Note that a geometry shader that accesses more input vertices than are
    available for a given input primitive type can be successfully compiled,
    because the input primitive type is not part of the shader
    object. However, a program object, containing a shader object that access
    more input vertices than are available for the input primitive type of the
    program object, will not link.

    The supported input primitive types are:

    Points (POINTS)

    Geometry shaders that operate on points are valid only for the POINTS
    primitive type.  There is only a single vertex available for each geometry
    shader invocation.

    Lines (LINES)

    Geometry shaders that operate on line segments are valid only for the
    LINES, LINE_STRIP, and LINE_LOOP primitive types.  There are two vertices
    available for each geometry shader invocation. The first vertex refers to
    the vertex at the beginning of the line segment and the second vertex
    refers to the vertex at the end of the line segment. See also section
    2.16.4.

    Lines with Adjacency (LINES_ADJACENCY_ARB)

    Geometry shaders that operate on line segments with adjacent vertices are
    valid only for the LINES_ADJACENCY_ARB and LINE_STRIP_ADJACENCY_ARB
    primitive types.  There are four vertices available for each program
    invocation. The second vertex refers to attributes of the vertex at the
    beginning of the line segment and the third vertex refers to the vertex at
    the end of the line segment. The first and fourth vertices refer to the
    vertices adjacent to the beginning and end of the line segment,
    respectively.

    Triangles (TRIANGLES)

    Geometry shaders that operate on triangles are valid for the TRIANGLES,
    TRIANGLE_STRIP and TRIANGLE_FAN primitive types.

    There are three vertices available for each program invocation. The first,
    second and third vertices refer to attributes of the first, second and
    third vertex of the triangle, respectively.

    Triangles with Adjacency (TRIANGLES_ADJACENCY_ARB)

    Geometry shaders that operate on triangles with adjacent vertices are
    valid for the TRIANGLES_ADJACENCY_ARB and TRIANGLE_STRIP_ADJACENCY_ARB
    primitive types.  There are six vertices available for each program
    invocation. The first, third and fifth vertices refer to attributes of the
    first, second and third vertex of the triangle, respectively. The second,
    fourth and sixth vertices refer to attributes of the vertices adjacent to
    the edges from the first to the second vertex, from the second to the
    third vertex, and from the third to the first vertex, respectively.

    Section 2.16.2, Geometry Shader Output Primitives

    A geometry shader can generate primitives of one of three types.  The
    supported output primitive types are points (POINTS), line strips
    (LINE_STRIP), and triangle strips (TRIANGLE_STRIP).  The vertices output
    by the geometry shader are decomposed into points, lines, or triangles
    based on the output primitive type in the manner described in section
    2.6.1. The resulting primitives are then further processed as shown in
    figure 2.16.xxx. If the number of vertices emitted by the geometry shader
    is not sufficient to produce a single primitive, nothing is drawn.

    The output primitive type is a parameter of the program object, and can be
    set by calling ProgramParameteriARB with <pname> set to
    GEOMETRY_OUTPUT_TYPE_ARB and <value> set to one of POINTS, LINE_STRIP or
    TRIANGLE_STRIP. This setting will not be in effect until the next time
    LinkProgram has been called successfully. Note that queries of
    GEOMETRY_OUTPUT_TYPE_ARB will return the last value set; which is not
    necessarily the value used to generate the executable code in the program
    object. After a program object has been created it will have a default
    value for GEOMETRY_OUTPUT_TYPE_ARB, as discussed in section 2.15.5,
    Required State. .

    Section 2.16.3 Geometry Shader Variables

    Geometry shaders can access uniforms belonging to the current program
    object.  The amount of storage available for uniform variables in the
    default uniform block accessed by a geometry shader is specified by the
    value of the implementation-dependent constant
    MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB. The total amount of combined storage
    available for uniform variables in all uniform blocks accessed by a
    geometry shader (including the default uniform block) is specified by the
    value of the implementation-dependent constant
    MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS.  These values represent the
    numbers of individual floating-point, integer, or boolean values that can
    be held in uniform variable storage for a geometry shader. A link error is
    generated if an attempt is made to utilize more than the space available
    for geometry shader uniform variables.  Uniforms are manipulated as
    described in section 2.15.3.  Geometry shaders also have access to
    samplers, to perform texturing operations, as described in sections 2.15.3
    and 3.8.

    Geometry shaders can access the transformed attributes of all vertices for
    its input primitive type through input varying variables. A vertex shader,
    writing to output varying variables, generates the values of these input
    varying variables. This includes values for built-in as well as
    user-defined varying variables. Values for any varying variables that are
    not written by a vertex shader are undefined. Additionally, a geometry
    shader has access to a built-in variable that holds the ID of the current
    primitive. This ID is generated by the primitive assembly stage that sits
    in between the vertex and geometry shader.

    Additionally, geometry shaders can write to one, or more, varying
    variables for each primitive it outputs. These values are optionally flat
    shaded (using the OpenGL Shading Language varying qualifier "flat") and
    clipped, then the clipped values interpolated across the primitive (if not
    flat shaded). The results of these interpolations are available to a
    fragment shader, if one is active. Furthermore, geometry shaders can write
    to a set of built- in varying variables, defined in the OpenGL Shading
    Language, that correspond to the values required for the fixed-function
    processing that occurs after geometry processing.

    Section 2.16.4, Geometry Shader Execution Environment

    If a successfully linked program object that contains a geometry shader is
    made current by calling UseProgram, the executable version of the geometry
    shader is used to process primitives resulting from the primitive assembly
    stage.

    The following operations are applied to the primitives that are the result
    of executing a geometry shader:

      * color clamping or masking (section 2.14.6),

      * flat shading (section 2.14.7),

      * clipping, including client-defined clip planes (section 2.12),

      * front face determination (section 2.14.1),

      * color and associated data clipping (section 2.14.8),

      * perspective division on clip coordinates (section 2.11),

      * final color processing (section 2.14.9), and

      * viewport transformation, including depth-range scaling (section
        2.11.1).

    There are several special considerations for geometry shader execution
    described in the following sections.

    Texture Access

    Geometry shaders have the ability to do a lookup into a texture map, if
    supported by the GL implementation. The maximum number of texture image
    units available to a geometry shader is
    MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB; a maximum number of zero indicates
    that the GL implementation does not support texture accesses in geometry
    shaders.

    The vertex shader, geometry shader and fragment processing combined cannot
    use more than MAX_COMBINED_TEXTURE_IMAGE_UNITS texture image units. If the
    vertex shader, geometry shader and the fragment processing stage access
    the same texture image unit, then that counts as using three texture image
    units against the MAX_COMBINED_TEXTURE_IMAGE_UNITS limit.

    When a texture lookup is performed in a geometry shader, the filtered
    texture value tau is computed in the manner described in sections 3.8.8
    and 3.8.9, and converted to a texture source color Cs according to table
    3.21 (section 3.8.13). A four component vector (Rs,Gs,Bs,As) is returned
    to the geometry shader. In a geometry shader it is not possible to perform
    automatic level-of- detail calculations using partial derivatives of the
    texture coordinates with respect to window coordinates as described in
    section 3.8.8. Hence, there is no automatic selection of an image array
    level. Minification or magnification of a texture map is controlled by a
    level-of-detail value optionally passed as an argument in the texture
    lookup functions. If the texture lookup function supplies an explicit
    level-of-detail value lambda, then the pre-bias level-of-detail value
    LAMBDAbase(x, y) = lambda (replacing equation 3.18). If the texture lookup
    function does not supply an explicit level-of-detail value, then
    LAMBDAbase(x, y) = 0. The scale factor Rho(x, y) and its approximation
    function f(x, y) (see equation 3.21) are ignored.

    Texture lookups involving textures with depth component data can either
    return the depth data directly or return the results of a comparison with
    the R value (see section 3.8.14) used to perform the lookup. The
    comparison operation is requested in the shader by using any of the shadow
    sampler and in the texture using the TEXTURE COMPARE MODE parameter. These
    requests must be consistent; the results of a texture lookup are undefined
    if:

      * the sampler used in a texture lookup function is not one of the shadow
        sampler types, and the texture object's internal format is DEPTH
        COMPONENT, and the TEXTURE COMPARE MODE is not NONE;

      * the sampler used in a texture lookup function is one of the shadow
        sampler types, and the texture object's internal format is DEPTH
        COMPONENT, and the TEXTURE COMPARE MODE is NONE; or

      * the sampler used in a texture lookup function is one of the shadow
        sampler types, and the texture object's internal format is not DEPTH
        COMPONENT.

    If a geometry shader uses a sampler where the associated texture object is
    not complete as defined in section 3.8.10, the texture image unit will
    return (R,G,B,A) = (0, 0, 0, 1).

    Geometry Shader Inputs

    The OpenGL Shading Language specification describes the set of built-in
    variables that are available as inputs to the geometry shader. This set
    receives the values from the equivalent built-in output variables written
    by the vertex shader. These built-in variables are arrays; each element in
    the array holds the value for a specific vertex of the input
    primitive. The length of each array depends on the value of the input
    primitive type, as determined by the program object value
    GEOMETRY_INPUT_TYPE_ARB, and is set by the GL during link. Each built-in
    variable is a one-dimensional array, except for the built-in texture
    coordinate variable, which is a two- dimensional array. The vertex shader
    built-in output gl_TexCoord[] is a one-dimensional array. Therefore, the
    geometry shader equivalent input variable gl_TexCoordIn[][] becomes a two-
    dimensional array. See the OpenGL Shading Language Specification, sections
    4.3.6 and 7.6 for more information.

    The built-in varying variables gl_FrontColorIn[], gl_BackColorIn[],
    gl_FrontSecondaryColorIn[] and gl_BackSecondaryColorIn[] hold the
    per-vertex front and back colors of the primary and secondary colors, as
    written by the vertex shader to its equivalent built-in output variables.

    The built-in varying variable gl_TexCoordIn[][] holds the per- vertex
    values of the array of texture coordinates, as written by the vertex
    shader to its built-in output array gl_TexCoord[].

    The built-in varying variable gl_FogFragCoordIn[] holds the per- vertex
    fog coordinate, as written by the vertex shader to its built- in output
    variable gl_FogFragCoord.

    The built-in varying variable gl_PositionIn[] holds the per-vertex
    position, as written by the vertex shader to its output variable
    gl_Position. Note that writing to gl_Position from either the vertex or
    fragment shader is optional. See also section 7.1 "Vertex and Geometry
    Shader Special Variables" of the OpenGL Shading Language specification.

    The built-in varying variable gl_ClipVertexIn[] holds the per-vertex
    position in clip coordinates, as written by the vertex shader to its
    output variable gl_ClipVertex.

    The built-in varying variable gl_PointSizeIn[] holds the per-vertex point
    size written by the vertex shader to its built-in output varying variable
    gl_PointSize. If the vertex shader does not write gl_PointSize, the value
    of gl_PointSizeIn[] is undefined, regardless of the value of the enable
    VERTEX_PROGRAM_POINT_SIZE.

    The built-in special variable gl_PrimitiveIDIn is not an array and has no
    vertex shader equivalent. It is filled with the number of primitives
    processed since the last time Begin was called (directly or indirectly via
    vertex array functions).  The first primitive generated after a Begin is
    numbered zero, and the primitive ID counter is incremented after every
    individual point, line, or triangle primitive is processed.  For triangles
    drawn in point or line mode, the primitive ID counter is incremented only
    once, even though multiple points or lines may be drawn. Restarting a
    primitive topology using the primitive restart index has no effect on the
    primitive ID counter.

    Similarly to the built-in varying variables, user-defined input varying
    variables need to be declared as arrays. Declaring a size is optional. If
    no size is specified, it will be inferred by the linker from the input
    primitive type. If a size is specified, it has to be of the size matching
    the number of vertices of the input primitive type, otherwise a link error
    will occur. The built-in variable gl_VerticesIn, if so desired, can be
    used to size the array correctly for each input primitive
    type. User-defined varying variables can be declared as arrays in the
    vertex shader. This means that those, on input to the geometry shader,
    must be declared as two-dimensional arrays. See sections 4.3.6 and 7.6 of
    the OpenGL Shading Language Specification for more information.

    Using any of the built-in or user-defined input varying variables can
    count against the limit MAX_VERTEX_VARYING_COMPONENTS_ARB as discussed in
    section 2.15.3.

    Geometry Shader outputs

    A geometry shader is limited in the number of vertices it may emit per
    invocation. The maximum number of vertices a geometry shader can possibly
    emit needs to be set as a parameter of the program object that contains
    the geometry shader. To do so, call ProgramParameteriARB with <pname> set
    to GEOMETRY_VERTICES_OUT_ARB and <value> set to the maximum number of
    vertices the geometry shader will emit in one invocation. This setting
    will not be guaranteed to be in effect until the next time LinkProgram has
    been called successfully. If a geometry shader, in one invocation, emits
    more vertices than the value GEOMETRY_VERTICES_OUT_ARB, these emits may
    have no effect.

    There are two implementation-dependent limits on the value of
    GEOMETRY_VERTICES_OUT_ARB.  First, the error INVALID_VALUE will be
    generated by ProgramParameteriARB if the number of vertices specified
    exceeds the value of MAX_GEOMETRY_OUTPUT_VERTICES_ARB.  Second, the
    product of the total number of vertices and the sum of all components of
    all active varying variables may not exceed the value of
    MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB.  LinkProgram will fail if it
    determines that the total component limit would be violated.

    A geometry shader can write to built-in as well as user-defined varying
    variables. These values are expected to be interpolated across the
    primitive it outputs, unless they are specified to be flat shaded.  In
    order to seamlessly be able to insert or remove a geometry shader from a
    program object, the rules, names and types of the output built-in varying
    variables and user-defined varying variables are the same as for the
    vertex shader. Refer to section 2.15.3 and the OpenGL Shading Language
    specification sections 4.3.6, 7.1 and 7.6 for more detail.

    The built-in output variables gl_FrontColor, gl_BackColor,
    gl_FrontSecondaryColor, and gl_BackSecondaryColor hold the front and back
    colors for the primary and secondary colors for the current vertex.

    The built-in output variable gl_TexCoord[] is an array and holds the set
    of texture coordinates for the current vertex.

    The built-in output variable gl_FogFragCoord is used as the "c" value, as
    described in section 3.10 "Fog" of the OpenGL 2.0 specification.

    The built-in special variable gl_Position is intended to hold the
    homogeneous vertex position. Writing gl_Position is optional.

    The built-in special variable gl_ClipVertex holds the vertex coordinate
    used in the clipping stage, as described in section 2.12 "Clipping" of the
    OpenGL 2.0 specification.

    The built-in special variable gl_PointSize, if written, holds the size of
    the point to be rasterized, measured in pixels.

    Additionally, a geometry shader can write to the built-in special
    variables gl_PrimitiveID and gl_Layer, whereas a vertex shader cannot. The
    built-in gl_PrimitiveID provides a single integer that serves as a
    primitive identifier.  This written primitive ID is available to fragment
    shaders.  If a fragment shader using primitive IDs is active and a
    geometry shader is also active, the geometry shader must write to
    gl_PrimitiveID or the primitive ID number is undefined. The built-in
    variable gl_Layer is used in layered rendering, and discussed in the next
    section.

    The number of components available for varying variables is given by the
    implementation-dependent constant
    MAX_GEOMETRY_VARYING_COMPONENTS_ARB. This value represents the number of
    individual components of a varying variable; varying variables declared as
    vectors, matrices, and arrays will all consume multiple components. When a
    program is linked, all components of any varying variable written by a
    geometry shader, or read by a fragment shader, will count against this
    limit. The transformed vertex position (gl_Position) does not count
    against this limit. A program whose geometry and/or fragment shaders
    access more than MAX_GEOMETRY_VARYING_COMPONENTS_ARB worth of varying
    variable components may fail to link, unless device-dependent
    optimizations are able to make the program fit within available hardware
    resources.

    Layered rendering

    Geometry shaders can be used to render to one of several different layers
    of cube map textures, three-dimensional textures, plus one- dimensional
    and two-dimensional texture arrays. This functionality allows an
    application to bind an entire "complex" texture to a framebuffer object,
    and render primitives to arbitrary layers computed at run time. For
    example, this mechanism can be used to project and render a scene onto all
    six faces of a cubemap texture in one pass. The layer to render to is
    specified by writing to the built-in output variable gl_layer. Layered
    rendering requires the use of framebuffer objects. Refer to the section
    'Dependencies on EXT_framebuffer_object' for details.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    Modify Section 3.3, Points (p. 95)

    (replace all Section 3.3 text on p. 95)

    A point is drawn by generating a set of fragments in the shape of a square
    or circle centered around the vertex of the point. Each vertex has an
    associated point size that controls the size of that square or circle.

    If no vertex or geometry shader is active, the size of the point is
    controlled by

          void PointSize(float size);

    <size> specifies the requested size of a point. The default value is
    1.0. A value less than or equal to zero results in the error
    INVALID_VALUE.

    The requested point size is multiplied with a distance attenuation factor,
    clamped to a specified point size range, and further clamped to the
    implementation-dependent point size range to produce the derived point
    size:

           derived size = clamp(size * sqrt(1/(a+b*d+c*d^2)))

    where d is the eye-coordinate distance from the eye, (0,0,0,1) in eye
    coordinates, to the vertex, and a, b, and c are distance attenuation
    function coefficients.

    If a vertex or geometry shader is active, the derived size depends on the
    per-vertex point size mode enable.  Per-vertex point size mode is enabled
    or disabled by calling Enable or Disable with the symbolic value
    PROGRAM_POINT_SIZE_ARB.  If per-vertex point size is enabled and a
    geometry shader is active, the derived point size is taken from the
    (potentially clipped) point size variable gl_PointSize written by the
    geometry shader. If per-vertex point size is enabled and no geometry
    shader is active, the derived point size is taken from the (potentially
    clipped) point size variable gl_PointSize written by the vertex shader. If
    per-vertex point size is disabled and a geometry and/or vertex shader is
    active, the derived point size is taken from the <size> value provided to
    PointSize, with no distance attenuation applied.  In all cases, the
    derived point size is clamped to the implementation-dependent point size
    range.

    If multisampling is not enabled, the derived size is passed on to
    rasterization as the point width. ...

    Modify section 3.10 "Fog", p. 191

    Modify the third paragraph of this section as follows.

    If a vertex or geometry shader is active, or if the fog source, as defined
    below, is FOG_COORD, then c is the interpolated value of the fog
    coordinate for this fragment.  Otherwise, ...

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    None.

Additions to Chapter 5 of the OpenGL 2.0 Specification (Special
Functions)

    Change section 5.4 Display Lists, p. 237

    Add the command ProgramParameteriARB to the list of commands that are not
    compiled into a display list, but executed immediately, under "Program and
    Shader Objects", p. 241

Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State
Requests)

    Modify section 6.1.14, Shader and Program Objects, p. 256

    Add to the second paragraph on p. 257:

    ... if <shader> is a fragment shader object, and GEOMETRY_SHADER_ARB is
    returned if <shader> is a geometry shader object.

    Add to the end of the description of GetProgramiv, p. 257:

    If <pname> is GEOMETRY_VERTICES_OUT_ARB, the current value of the maximum
    number of vertices the geometry shader will output is returned. If <pname>
    is GEOMETRY_INPUT_TYPE_ARB, the current geometry shader input type is
    returned and can be one of POINTS, LINES, LINES_ADJACENCY_ARB, TRIANGLES
    or TRIANGLES_ADJACENCY_ARB.  If <pname> is GEOMETRY_OUTPUT_TYPE_ARB, the
    current geometry shader output type is returned and can be one of POINTS,
    LINE_STRIP or TRIANGLE_STRIP.

Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

Dependencies on NV_primitive_restart

    The spec describes the behavior that primitive restart does not affect the
    primitive ID counter gl_PrimitiveIDIn. If NV_primitive_restart is not
    supported, references to that extension in the discussion of the primitive
    ID should be removed.

Dependencies on EXT_framebuffer_object

    If EXT_framebuffer_object (or similar functionality) is not supported, the
    gl_Layer output has no effect.  "FramebufferTextureARB" and
    "FramebufferTextureLayerARB" should be removed from "New Procedures and
    Functions", and FRAMEBUFFER_ATTACHMENT_LAYERED_ARB,
    FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB, and
    FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB should be removed from "New
    Tokens".

    Otherwise, this extension modifies EXT_framebuffer_object to add the
    notion of layered framebuffer attachments and framebuffers that can be
    used in conjunction with geometry shaders to allow programs to direct
    primitives to a face of a cube map or layer of a three-dimensional texture
    or one- or two-dimensional array texture.  The layer used for rendering
    can be selected by the geometry shader at run time.

    (insert before the end of Section 4.4.2, Attaching Images to Framebuffer
    Objects)

    There are several types of framebuffer-attachable images:

      * the image of a renderbuffer object, which is always two-dimensional,

      * a single level of a one-dimensional texture, which is treated as a
        two-dimensional image with a height of one,

      * a single level of a two-dimensional or rectangle texture,

      * a single face of a cube map texture level, which is treated as a
        two-dimensional image, or

      * a single layer of a one- or two-dimensional array texture or
        three-dimensional texture, which is treated as a two-dimensional
        image.

    Additionally, an entire level of a three-dimensional texture, cube map
    texture, or one- or two-dimensional array texture can be attached to an
    attachment point.  Such attachments are treated as an array of
    two-dimensional images, arranged in layers, and the corresponding
    attachment point is considered to be layered.

    (replace section 4.4.2.3, "Attaching Texture Images to a Framebuffer")

    GL supports copying the rendered contents of the framebuffer into the
    images of a texture object through the use of the routines
    CopyTexImage{1D|2D}, and CopyTexSubImage{1D|2D|3D}.  Additionally, GL
    supports rendering directly into the images of a texture object.

    To render directly into a texture image, a specified level of a texture
    object can be attached as one of the logical buffers of the currently
    bound framebuffer object by calling:

      void FramebufferTextureARB(enum target, enum attachment,
                                 uint texture, int level);

    <target> must be FRAMEBUFFER_EXT.  <attachment> must be one of the
    attachment points of the framebuffer listed in table 1.nnn.

    If <texture> is zero, any image or array of images attached to the
    attachment point named by <attachment> is detached, and the state of the
    attachment point is reset to its initial values.  <level> is ignored if
    <texture> is zero.

    If <texture> is non-zero, FramebufferTextureARB attaches level <level> of
    the texture object named <texture> to the framebuffer attachment point
    named by <attachment>.  The error INVALID_VALUE is generated if <texture>
    is not the name of a texture object, or if <level> is not a supported
    texture level number for textures of the type corresponding to <target>.
    The error INVALID_OPERATION is generated if <texture> is the name of a
    buffer texture.

    If <texture> is the name of a three-dimensional texture, cube map texture,
    or one- or two-dimensional array texture, the texture level attached to
    the framebuffer attachment point is an array of images, and the
    framebuffer attachment is considered layered.

    The command

      void FramebufferTextureLayerARB(enum target, enum attachment,
                                      uint texture, int level, int layer);

    operates like FramebufferTextureARB, except that only a single layer of
    the texture level, numbered <layer>, is attached to the attachment point.
    If <texture> is non-zero, the error INVALID_VALUE is generated if <layer>
    is negative, or if <texture> is not the name of a texture object.  The
    error INVALID_OPERATION is generated unless <texture> is zero or the name
    of a three-dimensional or one- or two-dimensional array texture.

    The command

      void FramebufferTextureFaceARB(enum target, enum attachment,
                                     uint texture, int level, enum face);

    operates like FramebufferTextureARB, except that only a single face of a
    cube map texture, given by <face>, is attached to the attachment point.
    <face> is one of TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z. If <texture> is
    non-zero, the error INVALID_VALUE is generated if <texture> is not the
    name of a texture object.  The error INVALID_OPERATION is generated unless
    <texture> is zero or the name of a cube map texture.

    The command

      void FramebufferTexture1DARB(enum target, enum attachment,
                                   enum textarget, uint texture, int level);

    operates identically to FramebufferTextureARB, except for two additional
    restrictions.  If <texture> is non-zero, the error INVALID_ENUM is
    generated if <textarget> is not TEXTURE_1D and the error INVALID_OPERATION
    is generated unless <texture> is the name of a one-dimensional texture.

    The command

      void FramebufferTexture2DARB(enum target, enum attachment,
                                   enum textarget, uint texture, int level);

    operates similarly to FramebufferTextureARB.  If <textarget> is TEXTURE_2D
    or TEXTURE_RECTANGLE_ARB, <texture> must be zero or the name of a
    two-dimensional or rectangle texture.  If <textarget> is
    TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, or TEXTURE_CUBE_MAP_NEGATIVE_Z, <texture>
    must be zero or the name of a cube map texture.  For cube map textures,
    only the single face of the cube map texture level given by <textarget> is
    attached.  The error INVALID_ENUM is generated if <texture> is not zero
    and <textarget> is not one of the values enumerated above.  The error
    INVALID_OPERATION is generated if <texture> is the name of a texture whose
    type does not match the texture type required by <textarget>.

    The command

      void FramebufferTexture3DEXT(enum target, enum attachment,
                                   enum textarget, uint texture,
                                   int level, int zoffset);

    behaves identically to FramebufferTextureLayerARB, with the <layer>
    parameter set to the value of <zoffset>.  The error INVALID_ENUM is
    generated if <textarget> is not TEXTURE_3D.  The error INVALID_OPERATION
    is generated unless <texture> is zero or the name of a three-dimensional
    texture.

    For all FramebufferTexture commands, if <texture> is non-zero and the
    command does not result in an error, the framebuffer attachment state
    corresponding to <attachment> is updated based on the new attachment.
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is set to TEXTURE,
    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT is set to <texture>, and
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL is set to <level>.
    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_FACE is set to <textarget> if
    FramebufferTexture2DEXT is called and <texture> is the name of a cubemap
    texture; otherwise, it is set to TEXTURE_CUBE_MAP_POSITIVE_X.
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is set to <layer> or <zoffset> if
    FramebufferTextureLayerEXT or FramebufferTexture3DEXT is called;
    otherwise, it is set to zero.  FRAMEBUFFER_ATTACHMENT_LAYERED_ARB is set
    to TRUE if FramebufferTextureARB is called and <texture> is the name of a
    three-dimensional texture, cube map texture, or one- or two-dimensional
    array texture; otherwise it is set to FALSE.

    (modify Section 4.4.4.1, Framebuffer Attachment Completeness -- add to the
    conditions necessary for attachment completeness)

    The framebuffer attachment point <attachment> is said to be "framebuffer
    attachment complete" if ...:

      * If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE and
        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT names a three-dimensional
        texture, FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER must be smaller than
        the depth of the texture.

      * If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE and
        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT names a one- or two-dimensional
        array texture, FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER must be
        smaller than the number of layers in the texture.

    (modify section 4.4.4.2, Framebuffer Completeness -- add to the list of
    conditions necessary for completeness)

      * If any framebuffer attachment is layered, all populated attachments
        must be layered.  Additionally, all populated color attachments must
        be from textures of the same target (i.e., three-dimensional, cube
        map, or one- or two-dimensional array textures).
        { FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB }

      * If any framebuffer attachment is layered, all attachments must have
        the same layer count.  For three-dimensional textures, the layer count
        is the depth of the attached volume.  For cube map textures, the layer
        count is always six.  For one- and two-dimensional array textures, the
        layer count is simply the number of layers in the array texture.
        { FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB }

    The enum in { brackets } after each clause of the framebuffer completeness
    rules specifies the return value of CheckFramebufferStatusARB (see below)
    that is generated when that clause is violated. ...

    (add section 4.4.7, Layered Framebuffers)

    A framebuffer is considered to be layered if it is complete and all of its
    populated attachments are layered.  When rendering to a layered
    framebuffer, each fragment generated by the GL is assigned a layer number.
    The layer number for a fragment is zero if

      * the fragment is generated by DrawPixels, CopyPixels, or Bitmap,

      * geometry shaders are disabled, or

      * the current geometry shader does not contain an instruction that
        statically assigns a value to the built-in output variable gl_Layer.

    Otherwise, the layer for each point, line, or triangle emitted by the
    geometry shader is taken from the layer output of one of the vertices of
    the primitive.  The vertex used is implementation-dependent.  To get
    defined results, all vertices of each primitive emitted should set the
    same value for gl_Layer.  Since the EndPrimitive() built-in function
    starts a new output primitive, defined results can be achieved if
    EndPrimitive() is called between two vertices emitted with different layer
    numbers.  A layer number written by a geometry shader has no effect if the
    framebuffer is not layered.

    When fragments are written to a layered framebuffer, the fragment's layer
    number selects a single image from the array of images at each attachment
    point to use for the stencil test (section 4.1.5), depth buffer test
    (section 4.1.6), and for blending and color buffer writes (section 4.1.8).
    If the fragment's layer number is negative or greater than the number of
    layers attached, the effects of the fragment on the framebuffer contents
    are undefined.

    When the Clear command is used to clear a layered framebuffer attachment,
    all layers of the attachment are cleared.

    When commands such as ReadPixels or CopyPixels read from a layered
    framebuffer, the image at layer zero of the selected attachment is always
    used to obtain pixel values.

    When cube map texture levels are attached to a layered framebuffer, there
    are six layers attached, numbered zero through five.  Each layer number is
    mapped to a cube map face, as indicated in Table X.4.

      layer number   cube map face
      ------------   ---------------------------
           0         TEXTURE_CUBE_MAP_POSITIVE_X
           1         TEXTURE_CUBE_MAP_NEGATIVE_X
           2         TEXTURE_CUBE_MAP_POSITIVE_Y
           3         TEXTURE_CUBE_MAP_NEGATIVE_Y
           4         TEXTURE_CUBE_MAP_POSITIVE_Z
           5         TEXTURE_CUBE_MAP_NEGATIVE_Z

      Table X.4, Layer numbers for cube map texture faces.  The layers are
      numbered in the same sequence as the cube map face token values.

    (modify Section 6.1.3, Enumerated Queries -- Modify/add to list of <pname>
    values for GetFramebufferAttachmentParameterivARB if
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE)

      If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER and the attached
      image is a layer of a three-dimensional texture or one- or
      two-dimensional array texture, then <params> will contain the specified
      layer number.  Otherwise, <params> will contain the value zero.

      If <pname> is FRAMEBUFFER_ATTACHMENT_LAYERED_ARB, then <params> will
      contain TRUE if an entire level of a three-dimesional texture, cube map
      texture, or one- or two-dimensional array texture is attached to the
      <attachment>.  Otherwise, <params> will contain FALSE.

    (Modify the Additions to Chapter 5, section 5.4)

    Add the commands FramebufferTextureARB, FramebufferTextureLayerARB, and
    FramebufferTextureFaceARB to the list of commands that are not compiled
    into a display list, but executed immediately.

Dependencies on EXT_framebuffer_blit

    If EXT_framebuffer_blit is supported, the EXT_framebuffer_object language
    should be further amended so that <target> values passed to
    FramebufferTextureARB and FramebufferTextureLayerARB can be
    DRAW_FRAMEBUFFER_EXT or READ_FRAMEBUFFER_EXT, and that those functions
    set/query state for the draw framebuffer if <target> is FRAMEBUFFER_EXT.

    If BlitFramebufferEXT() is called with a layered read framebuffer, pixel
    values are obtained from layer zero from the read framebuffer.  If the
    draw framebuffer is layered, pixel values are written to layer zero of the
    draw framebuffer.  If both framebuffers are layered, the two-dimensional
    blit operation is still performed only on layer zero.

Dependencies on EXT_texture_array

    If EXT_texture_array is not supported, the discussion array textures the
    layered rendering edits to EXT_framebuffer_object should be
    removed. Layered rendering to cube map and 3D textures would still be
    supported.

    If EXT_texture_array is supported, the edits to EXT_framebuffer_object
    supersede those made in EXT_texture_array, except for language pertaining
    to mipmap generation of array textures.

    There are no functional incompatibilities between the FBO support in these
    two specifications.  The only differences are that this extension supports
    layered rendering and also rewrites certain sections of the core FBO
    specification more aggressively.

Dependencies on ARB_texture_rectangle

    If ARB_texture_rectangle is not supported, all references to rectangle
    textures in the EXT_framebuffer_object spec language should be removed.

Dependencies on ARB_texture_buffer_object

    If ARB_buffer_object is not supported, the reference to an
    INVALID_OPERATION error if a buffer texture is passed to
    FramebufferTextureARB should be removed.

Dependencies on OpenGL 3.2

    If this extension and OpenGL 3.2 (and GLSL 1.50) are supported, two
    slightly different versions of geometry shader support are available.

    In this extension, the input and output primitive types and maximum output
    vertex count are specified prior to linking, using the
    ProgramParameteriARB command.  However, OpenGL 3.2 requires that these
    properties be specified using the "layout" modifier in geometry shader
    source and provides no program paramter state.  For implementations
    supporting both features, there are potentially two different ways to set
    these properties prior to linking a program.  If no geometry shader
    enables this extension via "#extension", all three properties must be
    specified in shader source as required by OpenGL 3.2.  Otherwise, these
    properties need not be specified in source code, but still may be if
    #version 150 or better is enabled.  If a given property is specified in
    geometry shader source, the value from the source code is used; otherwise,
    the value of the program parameter state is used.

    Additionally, OpenGL 3.2 and ARB_geometry_shader have similarly-named
    queries for the input and output primitive type and maximum vertex count.
    In particular, the commands

      glGetProgramiv(program, GL_GEOMETRY_VERTICES_OUT_ARB, &verticesOut);
      glGetProgramiv(program, GL_GEOMETRY_INPUT_TYPE_ARB,   &inputType);
      glGetProgramiv(program, GL_GEOMETRY_OUTPUT_TYPE_ARB,  &outputType);

    query the program parameter state provided by this extension.  If the
    program parameter state is changed without relinking, the new values will
    be returned, even though old values will be in effect when the program is
    used.  These queries are not supported by unextended OpenGL 3.2.  Instead,
    OpenGL 3.2 supports the following queries:

      glGetProgramiv(program, GL_GEOMETRY_VERTICES_OUT, &verticesOut);
      glGetProgramiv(program, GL_GEOMETRY_INPUT_TYPE,   &inputType);
      glGetProgramiv(program, GL_GEOMETRY_OUTPUT_TYPE,  &outputType);

    The OpenGL 3.2 queries return the properties established when the program
    is linked, and ignore the program parameter state.  Despite the very
    similar names, there is no conflict -- neither the enumerant names nor the
    values are exactly the same.

    If OpenGL 3.2 is supported and layered framebuffer attachments are used,
    the requirement that all layer counts match is removed and the
    FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB error condition will never be
    generated.  Instead, rendering will use the minimum layer count for all
    attachments as specified by OpenGL 3.2.  This change was made for
    consistency with OpenGL 3.0's framebuffer object support, which similarly
    lifted the requirement that framebuffer attachments have matching widths
    and heights.

Dependencies on ARB_uniform_buffer_object

    If ARB_uniform_buffer_object (or OpenGL 3.1) is not supported, language
    referring to MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS (defined in the
    ARB_uniform_buffer_object spec) and the "default uniform block" should be
    removed.


GLX Protocol

    The following rendering command is sent to the server as part of a
    glXRender request:

    ProgramParameteriARB
        2           16               rendering command length
        2           266              rendering command opcode
        4           CARD32           program
        4           ENUM             pname
        4           INT32            value

    FramebufferTextureARB

        2           20               rendering command length
        2           267              rendering command opcode
        4           ENUM             target
        4           ENUM             attachment
        4           CARD32           texture
        4           INT32            level

    FramebufferTextureLayerARB

        2           24               rendering command length
        2           237              rendering command opcode
        4           ENUM             target
        4           ENUM             attachment
        4           CARD32           texture
        4           INT32            level
        4           INT32            layer

    FramebufferTextureFaceARB

        2           24               rendering command length
        2           268              rendering command opcode
        4           ENUM             target
        4           ENUM             attachment
        4           CARD32           texture
        4           INT32            level
        4           ENUM             face

Errors

    The error INVALID_VALUE is generated by ProgramParameteriARB if <pname> is
    GEOMETRY_INPUT_TYPE_ARB and <value> is not one of POINTS, LINES,
    LINES_ADJACENCY_ARB, TRIANGLES or TRIANGLES_ADJACENCY_ARB.

    The error INVALID_VALUE is generated by ProgramParameteriARB if <pname> is
    GEOMETRY_OUTPUT_TYPE_ARB and <value> is not one of POINTS, LINE_STRIP or
    TRIANGLE_STRIP.

    The error INVALID_VALUE is generated by ProgramParameteriARB if <pname> is
    GEOMETRY_VERTICES_OUT_ARB and <value> is negative.

    The error INVALID_VALUE is generated by ProgramParameteriARB if <pname> is
    GEOMETRY_VERTICES_OUT_ARB and <value> exceeds
    MAX_GEOMETRY_OUTPUT_VERTICES_ARB.

    The error INVALID_VALUE is generated by ProgramParameteriARB if <pname> is
    set to GEOMETRY_VERTICES_OUT_ARB and the product of <value> and the sum of
    all components of all active varying variables exceeds
    MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB.

    The error INVALID_OPERATION is generated if Begin, or any command that
    implicitly calls Begin, is called when a geometry shader is active and:

      * the input primitive type of the current geometry shader is
        POINTS and <mode> is not POINTS,

      * the input primitive type of the current geometry shader is
        LINES and <mode> is not LINES, LINE_STRIP, or LINE_LOOP,

      * the input primitive type of the current geometry shader is
        TRIANGLES and <mode> is not TRIANGLES, TRIANGLE_STRIP or
        TRIANGLE_FAN,

      * the input primitive type of the current geometry shader is
        LINES_ADJACENCY_ARB and <mode> is not LINES_ADJACENCY_ARB or
        LINE_STRIP_ADJACENCY_ARB, or

      * the input primitive type of the current geometry shader is
        TRIANGLES_ADJACENCY_ARB and <mode> is not
        TRIANGLES_ADJACENCY_ARB or TRIANGLE_STRIP_ADJACENCY_ARB.

New State

                                                       Initial
    Get Value                  Type    Get Command      Value  Description            Sec.    Attribute
    -------------------------  ----    -----------     ------- ---------------------- ------  ----------
    FRAMEBUFFER_ATTACHMENT_    nxB     GetFramebuffer-  FALSE  Framebuffer attachment 4.4.2.3     -
      LAYERED_ARB                      Attachment-             is layered
                                       ParameterivARB

    Modify the following state value in Table 6.28, Shader Object State,
    p. 289.

    Get Value           Type    Get Command      Value  Description                   Sec.    Attribute
    ------------------  ----    -----------     ------- ----------------------        ------  ---------
    SHADER_TYPE          Z2      GetShaderiv       -    Type of shader (vertex,       2.15.1      -
                                                        Fragment, geometry)

    Add the following state to Table 6.29, Program Object State, p. 290

                                                    Initial
    Get Value                 Type   Get Command     Value     Description               Sec.  Attribute
    ------------------------- ----  ------------    -------    -----------------        ------  -------
    GEOMETRY_VERTICES_OUT_ARB  Z+    GetProgramiv      0       max # of output vertices 2.16.4    -
    GEOMETRY_INPUT_TYPE_ARB    Z5    GetProgramiv   TRIANGLES  Primitive input type     2.16.1    -
    GEOMETRY_OUTPUT_TYPE_ARB   Z3    GetProgramiv   TRIANGLE_  Primitive output type    2.16.2    -
                                                      STRIP

New Implementation Dependent State

                                               Min.
    Get Value               Type  Get Command  Value  Description            Sec.     Attrib
    ----------------------  ----  -----------  -----  --------------------   --------  ------
    MAX_GEOMETRY_TEXTURE_     Z+  GetIntegerv  0      maximum number of       2.16.4     -
      IMAGE_UNITS_ARB                                 texture image units
                                                      accessible in a
                                                      geometry shader
    MAX_GEOMETRY_OUTPUT_      Z+  GetIntegerv  256    maximum number of       2.16.4     -
      VERTICES_ARB                                    vertices that any
                                                      geometry shader can
                                                      can emit
    MAX_GEOMETRY_TOTAL_       Z+  GetIntegerv  1024   maximum number of       2.16.4     -
      OUTPUT_COMPONENTS_ARB                           total components (all 
                                                      vertices) of active
                                                      varyings that a
                                                      geometry shader can
                                                      emit
    MAX_GEOMETRY_UNIFORM_     Z+  GetIntegerv  512    Number of words for     2.16.3     -
      COMPONENTS_ARB                                  geometry shader 
                                                      uniform variables
    MAX_GEOMETRY_VARYING_     Z+  GetIntegerv  32     Number of components    2.16.4     -
      COMPONENTS_ARB                                  for varying variables
                                                      between geometry and
                                                      fragment shaders
    MAX_VERTEX_VARYING_       Z+  GetIntegerv  32     Number of components    2.15.3     -
      COMPONENTS_ARB                                  for varying variables
                                                      between Vertex and
                                                      geometry shaders
    MAX_VARYING_              Z+  GetIntegerv  32     Alias for               2.15.3     -
      COMPONENTS_ARB                                  MAX_VARYING_FLOATS

Modifications to the OpenGL Shading Language Specification version
1.10.59

    Including the following line in a shader can be used to control the
    language features described in this extension:

      #extension GL_ARB_geometry_shader4 : <behavior>

    where <behavior> is as specified in section 3.3.

    A new preprocessor #define is added to the OpenGL Shading Language:

      #define GL_ARB_geometry_shader4 1

    Change the introduction to Chapter 2 "Overview of OpenGL Shading" as
    follows:

    The OpenGL Shading Language is actually three closely related
    languages. These languages are used to create shaders for the programmable
    processors contained in the OpenGL processing pipeline. The precise
    definition of these programmable units is left to separate
    specifications. In this document, we define them only well enough to
    provide a context for defining these languages.  Unless otherwise noted in
    this paper, a language feature applies to all languages, and common usage
    will refer to these languages as a single language. The specific languages
    will be referred to by the name of the processor they target: vertex,
    geometry or fragment.

    Change the last sentence of the first paragraph of section 3.2
    "Source Strings" to:

    Multiple shaders of the same language (vertex, geometry or fragment) can
    be linked together to form a single program.

    Change the first paragraph of section 4.1.3, "Integers" as follows:

    ... integers are limited to 16 bits of precision, plus a sign
    representation in the vertex, geometry and fragment languages..

    Change the first paragraph of section 4.1.9, "Arrays", as follows:

    Variables of the same type can be aggregated into one- and two-
    dimensional arrays by declaring a name followed by brackets ( [ ] for
    one-dimensional arrays and [][] for two-dimensional arrays) enclosing an
    optional size. When an array size is specified in a declaration, it must
    be an integral constant expression (see Section 4.3.3 "Integral Constant
    Expressions") greater than zero.  If an array is indexed with an
    expression that is not an integral constant expression or passed as an
    argument to a function, then its size must be declared before any such
    use. It is legal to declare an array without a size and then later
    re-declare the same name as an array of the same type and specify a
    size. It is illegal to declare an array with a size, and then later (in
    the same shader) index the same array with an integral constant expression
    greater than or equal to the declared size. It is also illegal to index an
    array with a negative constant expression. Arrays declared as formal
    parameters in a function declaration must specify a size.  Undefined
    behavior results from indexing an array with a non-constant expression
    that's greater than or equal to the array's size or less than 0. All basic
    types and structures can be formed into arrays.

    Two-dimensional arrays can only be declared as "varying in" variables in a
    geometry shader. See section 4.3.6 for details. All other declarations of
    two-dimensional arrays are illegal.

    Change the fourth paragraph of section 4.2 "Scoping", as follows:

    Shared globals are global variables declared with the same name in
    independently compiled units (shaders) of the same language (vertex,
    geometry or fragment) that are linked together .

    Change section 4.3 "Type Qualifiers"

    Change the "varying", "in" and "out" qualifiers as follows:

    varying - linkage between a vertex shader and geometry shader, or between
    a geometry shader and a fragment shader, or between a vertex shader and a
    fragment shader.

    in - for function parameters passed into a function or for input varying
    variables (geometry only)

    out - for function parameters passed back out of a function, but not
    initialized for use when passed in. Also for output varying variables
    (geometry only).

    Change section 4.3.6 "Varying" as follows:

    Varying variables provide the interface between the vertex shader and
    geometry shader and also between the geometry shader and fragment shader
    and the fixed functionality between them. If no geometry shader is
    present, varying variables also provide the interface between the vertex
    shader and fragment shader.

    The vertex, or geometry shader will compute values per vertex (such
    as color, texture coordinates, etc) and write them to output variables
    declared with the "varying" qualifier (vertex or geometry) or "varying
    out" qualifiers (geometry only). A vertex or geometry shader may also
    read these output varying variables, getting back the same values it has
    written. Reading an output varying variable in a vertex or geometry shader
    returns undefined results if it is read before being written.

    A geometry shader may also read from an input varying variable declared
    with the "varying in" qualifiers. The value read will be the same value as
    written by the vertex shader for that varying variable. Since a geometry
    shader operates on primitives, each input varying variable needs to be
    declared as an array. Each element of such an array corresponds to a
    vertex of the primitive being processed. If the varying variable is
    declared as a scalar or matrix in the vertex shader, it will be a
    one-dimensional array in the geometry shader. Each array can optionally
    have a size declared. If a size is not specified, it inferred by the
    linker and depends on the value of the input primitive type. See table
    4.3.xxx to determine the exact size. The read-only built-in constant
    gl_VerticesIn will be set to this value by the linker.  If a size is
    specified, it has to be the size as given by table 4.3.xxx, otherwise a
    link error will occur. The built-in constant gl_VerticesIn, if so desired,
    can be used to size the array correctly for each input primitive
    type. Varying variables can also be declared as arrays in the vertex
    shader. This means that those, on input to the geometry shader, must be
    declared as two- dimensional arrays. The first index to the
    two-dimensional array holds the vertex number. Declaring a size for the
    first range of the array is optional, just as it is for one-dimensional
    arrays.  The second index holds the per-vertex array data. Declaring a
    size for the second range of the array is not optional, and has to match
    the declaration in the vertex shader.

                                 Value of built-in
        Input primitive type     gl_VerticesIn
        -----------------------  -----------------
        POINTS                          1
        LINES                           2
        LINES_ADJACENCY_ARB             4
        TRIANGLES                       3
        TRIANGLES_ADJACENCY_ARB         6

    Table 4.3.xxxx The value of the built-in variable gl_VerticesIn is
    determined at link time, based on the input primitive type.

    It is illegal to index these varying arrays, or in the case of two-
    dimensional arrays, the first range of the array, with a negative integral
    constant expression or an integral constant expression greater than or
    equal to gl_VerticesIn. A link error will occur in these cases.

    Varying variables that are part of the interface to the fragment shader
    are set per vertex and interpolated in a perspective correct manner,
    unless flat shaded, over the primitive being rendered. If single-sampling,
    the interpolated value is for the fragment center.  If multi-sampling, the
    interpolated value can be anywhere within the pixel, including the
    fragment center or one of the fragment samples.

    A fragment shader may read from varying variables and the value read will
    be the interpolated value, as a function of the fragment's position within
    the primitive, unless the varying variable is flat shaded. A fragment
    shader cannot write to a varying variable.

    If a geometry shader is present, the type of the varying variables with
    the same name declared in the vertex shader and the input varying
    variables in the geometry shader must match, otherwise the link command
    will fail. Likewise, the type of the output varying variables with the
    same name declared in the geometry shader and the varying variables in the
    fragment shader must match.

    If a geometry shader is not present, the type of the varying variables
    with the same name declared in both the vertex and fragment shaders must
    match, otherwise the link command will fail.

    Only those varying variables used (i.e. read) in the geometry or fragment
    shader must be written to by the vertex or geometry shader; declaring
    superfluous varying variables in the vertex shader or declaring
    superfluous output varying variables in the geometry shader is
    permissible.

    Varying variables are declared as in the following example:

      varying in float foo[];    // geometry shader input. Size of the
                                 // array set as a result of link, based
                                 // on the input primitive type.

      varying in float foo[gl_VerticesIn]; // geometry shader input
  
      varying in float foo[3];   // geometry shader input. Only legal for
                                 // the TRIANGLES input primitive type

      varying in float foo[][5]; // Size of the first range set as a
                                 // result of link. Each vertex holds an
                                 // array of 5 floats.

      varying out vec4 bar;      // geometry output
      varying vec3 normal;       // vertex shader output or fragment
                                 // shader input

    The varying qualifier can be used only with the data types float, vec2,
    vec3, vec4, mat2, mat3 and mat4 or arrays of these.  Structures cannot be
    varying. Additionally, the "varying in" and "varying out" qualifiers can
    only be used in a geometry shader.

    If no vertex shader is active, the fixed functionality pipeline of OpenGL
    will compute values for the built-in varying variables that will be
    consumed by the fragment shader. Similarly, if no fragment shader is
    active, the vertex shader or geometry shader is responsible for computing
    and writing to the built-in varying variables that are needed for OpenGL's
    fixed functionality fragment pipeline.

    Varying variables are required to have global scope, and must be declared
    outside of function bodies, before their first use.

    Change section 7.1 "Vertex Shader Special Variables"

    Rename this section to "Vertex and Geometry Shader Special Variables"

    Anywhere in this section where it reads "vertex language" replace it with
    "vertex and geometry language".

    Anywhere in this section where it reads "vertex shader" replace it with
    "vertex shader or geometry shader".

    Change the second paragraph to:

    The variable gl_Position is available only in the vertex and geometry
    language and is intended for writing the homogeneous vertex position. It
    can be written at any time during shader execution. It may also be read
    back by the shader after being written. This value will be used by
    primitive assembly, clipping, culling, and other fixed functionality
    operations that operate on primitives after vertex or geometry processing
    has occurred.  Compilers may generate a diagnostic message if they detect
    gl_Position is read before being written, but not all such cases are
    detectable. Writing to gl_Position is optional. If gl_Position is not
    written but subsequent stages of the OpenGL pipeline consume gl_Position,
    then results are undefined.

    Change the last sentence of this section into the following:

    The read-only built-in gl_PrimitiveIDIn is available only in the geometry
    language and is filled with the number of primitives processed by the
    geometry shader since the last time Begin was called (directly or
    indirectly via vertex array functions). See section 2.16.4 for more
    information.

    This variable is intrinsically declared as:

        int gl_PrimitiveIDIn; // read only

    The built-in output variable gl_PrimitiveID is available only in the
    geometry language and provides a single integer that serves as a primitive
    identifier.  This written primitive ID is available to fragment shaders.
    If a fragment shader using primitive IDs is active and a geometry shader
    is also active, the geometry shader must write to gl_PrimitiveID or the
    primitive ID in the fragment shader number is undefined.

    The built-in output variable gl_Layer is available only in the geometry
    language, and provides the number of the layer of textures attached to a
    FBO to direct rendering to. If a shader statically assigns a value to
    gl_Layer, layered rendering mode is enabled. See section 2.16.4 for a
    detailed explanation. If a shader statically assigns a value to gl_Layer,
    and there is an execution path through the shader that does not set
    gl_Layer, then the value of gl_Layer may be undefined for executions of
    the shader that take that path.

    These variables area intrinsically declared as:

        int gl_PrimitiveID;
        int gl_Layer;

    These variables can be read back by the shader after writing to them, to
    retrieve what was written. Reading the variable before writing it results
    in undefined behavior. If it is written more than once, the last value
    written is consumed by the subsequent operations.

    All built-in variables discussed in this section have global scope.

    Change section 7.2 "Fragment Shader Special Variables"

    Change the first paragraph on p. 44 as follows:

    The fragment shader has access to the read-only built-in variable
    gl_FrontFacing whose value is true if the fragment belongs to a
    front-facing primitive. One use of this is to emulate two-sided lighting
    by selecting one of two colors calculated by the vertex shader or geometry
    shader.

    Change the first sentence of section 7.4 "Built-in Constants"

    The following built-in constant is provided to geometry shaders.

      const int gl_VerticesIn; // Value set at link time

    The following built-in constants are provided to the vertex, geometry and
    fragment shaders:

    Change section 7.6 "Varing Variables"

    Unlike user-defined varying variables, the built-in varying variables
    don't have a strict one-to-one correspondence between the vertex language,
    geometry language and the fragment language. Four sets are provided, one
    set for the vertex language output, one set for the geometry language
    output, one set for the fragment language input and another set for the
    geometry language input. Their relationship is described below.

    The following built-in varying variables are available to write to in a
    vertex shader or geometry shader. A particular one should be written to if
    any functionality in a corresponding geometry shader or fragment shader or
    fixed pipeline uses it or state derived from it. Otherwise, behavior is
    undefined.

    Vertex language built-in outputs:

      varying vec4 gl_FrontColor;
      varying vec4 gl_BackColor;
      varying vec4 gl_FrontSecondaryColor;
      varying vec4 gl_BackSecondaryColor;
      varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
      varying float gl_FogFragCoord;

    Geometry language built-in outputs:

      varying out vec4 gl_FrontColor;
      varying out vec4 gl_BackColor;
      varying out vec4 gl_FrontSecondaryColor;
      varying out vec4 gl_BackSecondaryColor;
      varying out vec4 gl_TexCoord[]; // at most gl_MaxTextureCoords
      varying out float gl_FogFragCoord;

    For gl_FogFragCoord, the value written will be used as the "c" value on
    page 160 of the OpenGL 1.4 Specification by the fixed functionality
    pipeline. For example, if the z-coordinate of the fragment in eye space is
    desired as "c", then that's what the vertex or geometry shader should
    write into gl_FogFragCoord.

    Indices used to subscript gl_TexCoord must either be an integral constant
    expressions, or this array must be re-declared by the shader with a
    size. The size can be at most gl_MaxTextureCoords.  Using indexes close to
    0 may aid the implementation in preserving varying resources.

    The following input varying variables are available to read from in a
    geometry shader.

      varying in vec4 gl_FrontColorIn[gl_VerticesIn];
      varying in vec4 gl_BackColorIn[gl_VerticesIn];
      varying in vec4 gl_FrontSecondaryColorIn[gl_VerticesIn];
      varying in vec4 gl_BackSecondaryColorIn[gl_VerticesIn];
      varying in vec4 gl_TexCoordIn[gl_VerticesIn][]; // at most will be 
                                                      // gl_MaxTextureCoords
      varying in float gl_FogFragCoordIn[gl_VerticesIn];
      varying in vec4 gl_PositionIn[gl_VerticesIn];
      varying in float gl_PointSizeIn[gl_VerticesIn];
      varying in vec4 gl_ClipVertexIn[gl_VerticesIn];

    All built-in variables are one-dimensional arrays, except for
    gl_TexCoordIn, which is a two-dimensional array. Each element of a
    one-dimensional array, or the first index of a two-dimensional array,
    corresponds to a vertex of the primitive being processed and receives
    their value from the equivalent vertex output varying variables. See also
    section 4.3.6.

    The following varying variables are available to read from in a fragment
    shader. The gl_Color and gl_SecondaryColor names are the same names as
    attributes passed to the vertex shader. However, there is no name
    conflict, because attributes are visible only in vertex shaders and the
    following are only visible in a fragment shader.

      varying vec4 gl_Color;
      varying vec4 gl_SecondaryColor;
      varying vec4 gl_TexCoord[]; // at most will be gl_MaxTextureCoords
      varying float gl_FogFragCoord;

    The values in gl_Color and gl_SecondaryColor will be derived automatically
    by the system from gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor,
    and gl_BackSecondaryColor. This selection process is described in section
    2.14.1 of the OpenGL 2.0 Specification. If fixed functionality is used for
    vertex processing, then gl_FogFragCoord will either be the z-coordinate of
    the fragment in eye space, or the interpolation of the fog coordinate, as
    described in section 3.10 of the OpenGL 1.4 Specification. The
    gl_TexCoord[] values are the interpolated gl_TexCoord[] values from a
    vertex or geometry shader or the texture coordinates of any fixed pipeline
    based vertex functionality.

    Indices to the fragment shader gl_TexCoord array are as described above in
    the vertex and geometry shader text.

    Change section 8.7 "Texture Lookup Functions"

    Change the first paragraph to:

    Texture lookup functions are available to vertex, geometry and fragment
    shaders. However, level of detail is not computed by fixed functionality
    for vertex or geometry shaders, so there are some differences in operation
    between texture lookups. The functions.

    Change the third and fourth paragraphs to:

    In all functions below, the bias parameter is optional for fragment
    shaders. The bias parameter is not accepted in a vertex or geometry
    shader. For a fragment shader, if bias is present, it is added to the
    calculated level of detail prior to performing the texture access
    operation. If the bias parameter is not provided, then the implementation
    automatically selects level of detail: For a texture that is not
    mip-mapped, the texture is used directly. If it is mip- mapped and running
    in a fragment shader, the LOD computed by the implementation is used to do
    the texture lookup. If it is mip- mapped and running on the vertex or
    geometry shader, then the base LOD of the texture is used.

    The built-ins suffixed with "Lod" are allowed only in a vertex or geometry
    shader. For the "Lod" functions, lod is directly used as the level of
    detail.

    Change section 8.9 Noise Functions

    Change the first paragraph to:

    Noise functions are available to the vertex, geometry and fragment
    shaders.  They are...

    Add a section 8.10 Geometry Shader Functions

    This section contains functions that are geometry language specific.

    Syntax:

        void EmitVertex();   // Geometry only
        void EndPrimitive(); // Geometry only

    Description:

    The function EmitVertex() specifies that a vertex is completed. A vertex
    is added to the current output primitive using the current values of the
    varying output variables and the current values of the special built-in
    output variables gl_PointSize, gl_ClipVertex, gl_Layer, gl_Position and
    gl_PrimitiveID.  The values of any unwritten output variables are
    undefined. The values of all varying output variables and the special
    built-in output variables are undefined after a call to EmitVertex(). If a
    geometry shader, in one invocation, emits more vertices than the value
    GEOMETRY_VERTICES_OUT_ARB, these emits may have no effect.

    The function EndPrimitive() specifies that the current output primitive is
    completed and a new output primitive (of the same type) should be
    started. This function does not emit a vertex. The effect of
    EndPrimitive() is roughly equivalent to calling End followed by a new
    Begin, where the primitive mode is taken from the program object parameter
    GEOMETRY_OUTPUT_TYPE_ARB. If the output primitive type is POINTS, calling
    EndPrimitive() is optional.

    A geometry shader starts with an output primitive containing no
    vertices. When a geometry shader terminates, the current output primitive
    is automatically completed. It is not necessary to call EndPrimitive() if
    the geometry shader writes only a single primitive.

    Add/Change section 9 (Shading language grammar):

      init_declarator_list:
        single_declaration
        init_declarator_list COMMA IDENTIFIER
        init_declarator_list COMMA IDENTIFIER array_declarator_suffix
        init_declarator_list COMMA IDENTIFIER EQUAL initializer
  
      single_declaration:
        fully_specified_type
        fully_specified_type IDENTIFIER
        fully_specified_type IDENTIFIER array_declarator_suffix
        fully_specified_type IDENTIFIER EQUAL initializer
  
      array_declarator_suffix:
        LEFT_BRACKET RIGHT_BRACKET
        LEFT_BRACKET constant_expression RIGHT_BRACKET
        LEFT_BRACKET RIGHT_BRACKET array_declarator_suffix
        LEFT_BRACKET constant_expression RIGHT_BRACKET
      array_declarator_suffix
  
      type_qualifier:
        CONST
        ATTRIBUTE     // Vertex only
        VARYING
        VARYING IN    // Geometry only
        VARYING OUT   // Geometry only
        UNIFORM

NVIDIA Implementation Details

    Because of a hardware limitation, some GeForce 8 series chips use the
    odd vertex of an incomplete TRIANGLE_STRIP_ADJACENCY_ARB primitive
    as a replacement adjacency vertex rather than ignoring it.

Issues

   1. How do geometry shaders fit into the existing GL pipeline?

      RESOLVED:  The following diagram illustrates how geometry shaders fit
      into the "vertex processing" portion of the GL (Chapter 2 of the OpenGL
      2.0 Specification).

      First, vertex attributes are specified via immediate-mode commands or
      through vertex arrays.  They can be conventional attributes (e.g.,
      glVertex, glColor, glTexCoord) or generic (numbered) attributes.

      Vertices are then transformed, either using a vertex shader or
      fixed-function vertex processing.  Fixed-function vertex processing
      includes position transformation (modelview and projection matrices),
      lighting, texture coordinate generation, and other calculations.  The
      results of either method are a "transformed vertex", which has a
      position (in clip coordinates), front and back colors, texture
      coordinates, generic attributes (vertex shader only), and so on.  Note
      that on many current GL implementations, vertex processing is performed
      by executing a "fixed function vertex shader" generated by the driver.

      After vertex transformation, vertices are assembled into primitives,
      according to the topology (e.g., TRIANGLES, QUAD_STRIP) provided by the
      call to glBegin().  Primitives are points, lines, triangles, quads, or
      polygons.  Many GL implementations do not directly support quads or
      polygons, but instead decompose them into triangles as permitted by the
      spec.

      After initial primitive assembly, a geometry shader is executed on each
      individual point, line, or triangle primitive, if one is active.  It can
      read the attributes of each transformed vertex, perform arbitrary
      computations, and emit new transformed vertices.  These emitted vertices
      are themselves assembled into primitives according to the output
      primitive type of the geometry shader.

      Then, the colors of the vertices of each primitive are clamped to [0,1]
      (if color clamping is enabled), and flat shading may be performed by
      taking the color from the provoking vertex of the primitive.

      Each primitive is clipped to the view volume, and to any enabled
      user-defined clip planes.  Color, texture coordinate, and other
      attribute values are computed for each new vertex introduced by
      clipping.

      After clipping, the position of each vertex (in clip coordinates) is
      converted to normalized device coordinates in the perspective division
      (divide by w) step, and to window coordinates in the viewport
      transformation step.

      At the same time, color values may be converted to normalized
      fixed-point values according to the "Final Color Processing" portion of
      the specification.

      After the vertices of the primitive are transformed to window
      coordinate, the GL determines if the primitive is front- or back-facing.
      That information is used for two-sided color selection, where a single
      set of colors is selected from either the front or back colors
      associated with each transformed vertex.

      When all this is done, the final transformed position, colors (primary
      and secondary), and other attributes are used for rasterization (Chapter
      3 in the OpenGL 2.0 Specification).

      When the raster position is specified (via glRasterPos), it goes through
      the entire vertex processing pipeline as though it were a point.
      However, geometry shaders are never run on the raster position.


                        |generic              |conventional
                        |vertex               |vertex
                        |attributes           |attributes
                        |                     |
                        | +-------------------+
                        | |                   |
                        V V                   V
                      vertex            fixed-function
                      shader              vertex
                         |               processing
                         |                    |
                         |                    |
                         +<-------------------+                
                         |                                     Output
                         |position, color,                   Primitive
                         |other vertex data                     Type
                         |                                       |
                         V                                       |
        Begin/       primitive        geometry       primitive   |
         End ------> assembly  -----> shader   ----> assembly  <-+
        State            |                               |
                         V                               |
                         +<------------------------------+
                         |
                         |
                         |             color            flat
                         +----------> clamping ---->  shading
                         |                               |
                         V                               |
                         +<------------------------------+
                         |
                         |
                      clipping
                         |
                         |        perspective       viewport
                         +------>   divide    ----> transform
                         |                              |
                         |                          +---+-----+
                         |                          V         |
                         |           final        facing      |
                         +------>    color     determination  |
                         |         processing       |         |
                         |             |            |         |
                         |             |            |         |
                         |             +-----+ +----+         |
                         |                   | |              |
                         |                   V V              |
                         |                two-sided           |
                         |                 coloring           |
                         |                    |               |
                         |                    |               |
                         +------------------+ | +-------------+
                                            | | |
                                            V V V
                                        rasterization 
                                              |
                                              |
                                              V

   2. Why is this called GL_ARB_geometry_shader4?  There aren't any previous
      versions of this extension, let alone three?

      RESOLVED:  To match its sibling, ARB_gpu_shader4 and the assembly
      version NV_gpu_program4. This is the fourth generation of shading
      functionality, hence the "4" in the name.

   3. Should the GL produce errors at Begin time if an application specifies a
      primitive mode that is "incompatible" with the geometry shader?  For
      example, if the geometry shader operates on triangles and the
      application sends a POINTS primitive?

      RESOLVED:  Yes.  Mismatches of app-specified primitive types and
      geometry shader input primitive types appear to be errors and would
      produce weird and wonderful effects.

   4. Can the input primitive type of a geometry shader be determined at run
      time?

      RESOLVED:  No. Each geometry shader has a single input primitive type,
      and vertices are presented to the shader in a specific order based on
      that type.

   5. Can the input primitive type of a geometry shader be changed?

      DISCUSSION: The input primitive type is a property of the program
      object. A change of the input primitive type means the program object
      will need to be re-linked. It would be nice if the input primitive type
      was known at compile time, so that the compiler can do error checking of
      the type and the number of vertices being accessed by the shader. Since
      we allow multiple compilation units to form one geometry shader, it is
      not clear how to achieve that.  Therefore, the input primitive type is a
      property of the program object, and not of a shader object.

      RESOLVED: Yes, but each change means the program object will have to be
      re-linked.

   6. Can the output primitive type of a geometry shader be determined
      at run time?

      RESOLVED:  Not in this extension.

   7. Can the output primitive type of a program object be changed?

      RESOLVED: Yes, but the program object will have to be re-linked in order
      for the change to have effect on program execution.

   8. Must the output primitive type of a geometry shader match the
      input primitive type in any way?

      RESOLVED:  No, you can have a geometry shader generate points out of
      triangles or triangles out of points.  Some combinations are analogous
      to existing OpenGL operations:  reading triangles and writing points or
      line strips can be used to emulate a subset of PolygonMode
      functionality.  Reading points and writing triangle strips can be used
      to emulate point sprites.

   9. Are primitives emitted by a geometry shader processed like any other
      OpenGL primitive?

      RESOLVED:  Yes.  Antialiasing, stippling, polygon offset, polygon mode,
      culling, two-sided lighting and color selection, point sprite
      operations, and fragment processing all work as expected.

      One limitation is that the only output primitive types supported are
      points, line strips, and triangle strips, none of which meaningfully
      support edge flags that are sometimes used in conjunction with the POINT
      and LINE polygon modes. Edge flags are always ignored for line-mode
      triangle strips.

  10. Should geometry shaders support additional input primitive types?
 
      RESOLVED:  Possibly in a future extension.  It should be straightforward
      to build a future extension to support geometry shaders that operate on
      quads.  Other primitive types might be more demanding on hardware. Quads
      with adjacency would require 12 vertices per shader execution. General
      polygons may require even more, since there is no fixed bound on the
      number of vertices in a polygon.

  11. Should geometry shaders support additional output primitive types?

      RESOLVED:  Possibly in a future extension.  Additional output types
      (e.g., independent lines, line loops, triangle fans, polygons) may be
      useful in the future; triangle fans/polygons seem particularly useful.

  12. How are adjacency primitives processed by the GL?

      RESOLVED: The primitive type of an adjacent primitive is set as a Begin
      mode parameter. Any vertex of an adjacency primitive will be treated as
      a regular vertex, and processed by a vertex shader as well as the
      geometry shader. The geometry shader cannot output adjacency primitives,
      thus processing stops with the geometry shader. If a geometry shader is
      not active, the GL ignores the "adjacent" vertices in the adjacency
      primitive.

  13. Should we provide additional adjacency primitive types that can be
      used inside a Begin/End?

      RESOLVED:  Not in this extension.  It may be desirable to add new
      primitive types (e.g., TRIANGLE_FAN_ADJACENCY) in a future extension.

  14. How do geometry shaders interact with RasterPos?

      RESOLVED:  Geometry shaders are ignored when specifying the raster
      position.

  15. How do geometry shaders interact with pixel primitives
      (DrawPixels, Bitmap)?

      RESOLVED:  They do not.

  16. Is there a limit on the number of vertices that can be emitted by
      a geometry shader?

      RESOLVED:  Unfortunately, yes.  Besides practical hardware limits, there
      may also be practical performance advantages when applications guarantee
      a tight upper bound on the number of vertices a geometry shader will
      emit.  GPUs frequently excecute programs in parallel, and there are
      substantial implementation challenges to parallel execution of geometry
      threads that can write an unbounded number of results, particular given
      that all the primitives generated by the first geometry shader
      invocation must be consumed before any of the primitives generated by
      the second program invocation.  Limiting the amount of data a geometry
      shader can write substantially eases the implementation burden.

      A program object, holding a geometry shader, must declare a maximum
      number of vertices that can be emitted. There is an
      implementation-dependent limit on the total number of vertices a program
      object can emit (256 minimum) and the product of the number of vertices
      emitted and the number of components of all active varying variables
      (1024 minimum).

      It would be ideal if the limit could be inferred from the instructions
      in the shader itself, and that would be possible for many shaders,
      particularly ones with straight-line flow control.  For shaders with
      more complicated flow control (subroutines, data- dependent looping, and
      so on), it would be impossible to make such an inference and a "safe"
      limit would have to be used with adverse and possibly unexpected
      performance consequences.

      The limit on the number of EmitVertex() calls that can be issued can not
      always be enforced at compile time, or even at Begin time.  We specify
      that if a shader tries to emit more vertices than allowed, emits that
      exceed the limit may or may not have any effect.

  17. Should it be possible to change the limit GEOMETRY_VERTICES_OUT_ARB, the
      number of vertices emitted by a geometry shader, after the program
      object, containing the shader, is linked?

      RESOLVED: NO. See also issue 31. Changing this limit might require a
      re-compile and/or re-link of the shaders and program object on certain
      implementations. Pretending that this limit can be changed without
      re-linking does not reflect reality.

  18. How do user clipping and geometry shaders interact?

      RESOLVED: Just like vertex shaders and user clipping interact. The
      geometry shader needs to provide the (eye) position gl_ClipVertex.
      Primitives are clipped after geometry shader execution, not before.

  19. How do edge flags interact with adjacency primitives?

      RESOLVED:  If geometry programs are disabled, adjacency primitives are
      still supported.  For TRIANGLES_ADJACENCY_ARB, edge flags will apply as
      they do for TRIANGLES.  Such primitives are rendered as independent
      triangles as though the adjacency vertices were not provided.  Edge
      flags for the "real" vertices are supported.  For all other adjacency
      primitive types, edge flags are irrelevant.

  20. Now that a third shader object type is added, what combinations of
      GLSL, assembly (ARB or NV) low level and fixed-function do we want
      to support?

      DISCUSSION: With the addition of the geometry shader, the number of
      combinations the GL pipeline could support doubled (there is no
      fixed-function geometry shading).  Possible combinations now are:

        vertex        geometry        fragment

        ff/ASM/GLSL   none/ASM/GLSL   ff/ASM/GLSL

      for a total of 3 x 3 x 3 is 27 combinations. Before the geometry shader
      was added, the number of combinations was 9, and those we need to
      support. We have a choice on the other 18.

      RESOLUTION: It makes sense to draw a line at raster in the GL
      pipeline. The 'north' side of this line covers vertex and geometry
      shaders, the 'south' side fragment shaders. We now add a simple rule
      that states that if a program object contains anything north of this
      line, the north side will be 100% GLSL. This means that:

      a) GLSL program objects with a vertex shader can only use a geometry
      shader and not an assembly geometry program.  If an assembly geometry
      program is enabled, it is bypassed.  This also avoids a tricky case -- a
      GLSL program object with a vertex and a fragment program linked
      together.  Injecting an assembly geometry shader in the middle at run
      time won't work well.

      b) GLSL program objects with a geometry shader must have a vertex shader
      (cannot be ARB/NV or fixed-function vertex shading).

      The 'south' side in this program object still can be any of
      ff/ARB/NV/GLSL.

  21. How do geometry shaders interact with color clamping?

      RESOLVED:  Geometry shader execution occurs prior to color clamping in
      the pipeline.  This means the colors written by vertex shaders are not
      clamped to [0,1] before they are read by geometry shaders.  If color
      clamping is enabled, any vertex colors written by the geometry shader
      will have their components clamped to [0,1].

  22. What is a primitive ID and a vertex ID? I am confused.

      DISCUSSION: A vertex shader can read a built-in attribute that holds the
      ID of the current vertex it is processing. See the ARB_gpu_shader4 spec
      for more information on vertex ID. If the geometry shader needs access
      to a vertex ID as well, it can be passed as a user-defined varying
      variable. A geometry shader can read a built-in varying variable that
      holds the ID of the current primitive it is processing. It also has the
      ability to write to a built-in output primitive ID variable, to
      communicate the primitive ID to a fragment shader.  A fragment shader
      can read a built-in attribute that holds the ID of the current primitive
      it is processing. A primitive ID will be generated even if no geometry
      shader is active.

  23. After a call to EmitVertex(), should the values of the output varying
      variables be retained or be undefined?

      DISCUSSION: There is not a clear answer to this question .The underlying
      HW mechanism is as follows. An array of output registers is set aside to
      store vertices that make up primitives.  After each EmitVertex() a
      pointer into that array is incremented.  The shader no longer has access
      to the previous set of values.  This argues that the values of output
      varying variables should be undefined after an EmitVertex() call. The
      shader is responsible for writing values to all varying variables it
      wants to emit, for each emit. The counter argument to this is that this
      is not a nice model for GLSL to program in. The compiler can store
      varying outputs in a temp register and preserve their values across
      EmitVertex() calls, at the cost of increased register pressure.

      RESOLUTION: For now, without being a clear winner, we've decided to go
      with the undefined option. The shader is responsible for writng values
      to all varying variabvles it wants to emit, for each emit.

  24. How to distinguish between input and output "varying" variables?

      DISCUSSION: Geometry shader outputs are varying variables consistent
      with the existing definition of varying (used to communicate to the
      fragment processing stage). Geometry inputs are received from a vertex
      shader writing to its varying variable outputs. The inputs could be
      called "varying", to match with the vertex shader, or could be called
      "attributes" to match the vertex shader inputs (which are called
      attributes).

      RESOLUTION: We'll call input variables "varying", and not
      "attributes". To distinguish between input and output, they will be
      further qualified with the words "in" and "out" resulting in, for
      example:

        varying in float foo;
        varying out vec4 bar[];
  
  25. What is the syntax for declaring varying input variables?

      DISCUSSION: We need a way to distinguish between the vertices of the
      input primitive.  Suggestions:

        1. Declare each input varying variable as an unsized array. Its size
           is inferred by the linker based on the output primitive type.

        2. Declare each input varying variable as a sized array. If the size
           does not match the output primitive type, a link error occurs.

        3. Have an array of structures, where the structure contains the
           attributes for each vertex.

      RESOLUTION: Option 1 seems simple and solves the problem, but it is not
      a clear winner over the other two. To aid the shader writer in figuring
      out the size of each array, a new built-in constant, gl_VerticesIn, is
      defined that holds the number of vertices for the current input
      primitive type.

  26. Does gl_PointSize, gl_Layer, gl_ClipVertex count agains the
      MAX_GEOMETRY_VARYING_COMPONENTS limit?

      RESOLUTION: Core OpenGL 2.0 makes a distinction between varying
      variables, output from a vertex shader and interpolated over a
      primitive, and 'special built-in variables' that are outputs, but not
      interpolated across a primitive. Only varying variables do count against
      the MAX_VERTEX_VARYING_COMPONENTS limit.  gl_PointSize, gl_Layer,
      gl_ClipVertex and gl_Position are 'special built-in' variables, and
      therefore should not count against the limit. If HW does need to take
      components away to support those, that is ok. The actual spec language
      does mention possible implementation dependencies.

  27. Should writing to gl_Position be optional?

      DISCUSSION: Before this extensions, the OpenGL Shading Language required
      that gl_Position be written to in a vertex shader. With the addition of
      geometry shaders, it is not necessary anymore for a vertex shader to
      output gl_Position. The geometry shader can do so. With the addition of
      transform-feedback (see the transform feedback specification) it is not
      necessary useful for the geometry shader to write out gl_Position
      either.

      RESOLUTION: Yes, this should be optional.

  28. Should geometry shaders be able to select a layer of a 3D texture, cube
      map texture, or array texture at run time?  If so, how?

      RESOLVED: See also issue 32. This extension provides a per-vertex output
      called "gl_Layer", which is an integer specifying the layer to render
      to. In order to get defined results, the value of gl_Layer needs to be
      constant for each primitive (point, line or triangle) being emitted by a
      geometry shader. This layer value is used for all fragments generated by
      that primitive.

      The EXT_framebuffer_object (FBO) extension is used for rendering to
      textures, but for cube maps and 3D textures, it only provides the
      ability to attach a single face or layer of such textures.

      This extension generalizes FBO by creates new entry points to bind an
      entire texture level (FramebufferTextureARB) or a single layer of a
      texture level (FramebufferTextureLayerARB) or a single face of a level
      of a cube map texture (FramebufferTextureFaceARB) to an attachment
      point.  The existing FBO binding functions, FramebufferTexture[123]DARB
      are retained, and are defined in terms of the more general new
      functions.

      The new functions do not have a dimension in the function name or a
      <textarget> parameter, which can be inferred from the provided
      texture.

      When an entire texel level of a cube map, 3D, or array texture is
      attached, that attachment is considered layered.  The framebuffer is
      considered layered if any attachment is layered.  When the framebuffer
      is layered, there are three additional completeness requirements:

        * all attachments must be layered
        * all color attachments must be from textures of identical type
        * all attachments must have the same number of layers

      We expect subsequent versions of the FBO spec to relax the requirement
      that all attachments must have the same width and height, and plan to
      relax the similar requirement for layer count at that time.

      When rendering to a layered framebuffer, layer zero is used unless a
      geometry shader that writes (statically assings, to be precise) to
      gl_Layer. When rendering to a non-layered framebuffer, the value of
      gl_Layer is ignored and the set of single-image attachments are used.
      When reading from a layered framebuffer (e.g., ReadPixels), layer zero
      is always used.  When clearing a layered framebuffer, all layers are
      cleared to the corresponding clear values.

      Several other approaches were considered, including leveraging existing
      FBO attachment functions and requiring the use of FramebufferTexture3D
      with a <zoffset> of zero to make a framebuffer attachment "layerable"
      (attaching layer zero means that the attachment could be used for either
      layered- or non- layered rendering).  Whether rendering was layered or
      not could either be inferred from the active geometry shader, or set as
      a new property of the framebuffer object.  There is presently no
      FramebufferParameter API to set a property of a framebuffer, so it would
      have been necessary to create new set/query APIs if this approach were
      chosen.

  29. How should per-vertex point size work with geometry shaders?

      RESOLVED: The value of the existing VERTEX_PROGRAM_POINT_SIZE enable, to
      control the point size behavior of a vertex shader, does not affect
      geometry shaders.  Specifically, If a geometry shader is active, the
      point size is taken from the point size output gl_PointSize of the
      vertex shader, regardless of the value of VERTEX_PROGRAM_POINT_SIZE.

  30. Geometry shaders don't provide a QUADS or generic POLYGON input
      primitive type.  In this extension, what happens if an application
      provides QUADS, QUAD_STRIP, or POLYGON primitives?

      RESOLVED:  Not all vendors supporting this extension were able to accept
      quads and polygon primitives as input, so such functionality was not
      provided in this extension.  This extension requires that primitives
      provided to the GL must match the input primitive type of the active
      geometry shader (if any).  QUADS, QUAD_STRIP, and POLYGON primitives are
      considered not to match any input primitive type, so an
      INVALID_OPERATION error will result.

      The NV_geometry_shader4 extension (built on top of this one) allows
      applications to provide quads or general polygon primitives to a
      geometry shader with an input primitive type of TRIANGLES.  Such
      primitives are decomposed into triangles, and a geometry shader is run
      on each triangle independently.

  31. Geometry shaders provide a limit on the number of vertices that can be
      emitted.  Can this limit be changed at dynamically?

      RESOLVED: See also issue 17.  Not in this extension.  This functionality
      was not provided because it would be an expensive operation on some
      implementations of this extension.  The NV_geometry_shader4 extension
      (layered on top of this one) does allow applications to change this
      limit dynamically.

      An application can change the vertex output limit at any time.  To allow
      for the possibility of dynamic changes (as in NV_geometry_shader4) but
      not require it, a limit change is not guaranteed to take effect unless
      the program object is re-linked.  However, there is no guarantee that
      such limit changes will not take effect immediately.

  32. See also issue 28. Each vertex emitted by a geometry shader can specify
      a layer to render to using the output variable "gl_Layer".  For
      LINE_STRIP and TRIANGLE_STRIP output primitive types, which vertex's
      layer is used?

      RESOLVED:  The vertex from which the layer is extracted is unfortunately
      undefined.  In practice, some implementations of this extension will
      extract the layer number from the first vertex of the output primitive;
      others will extract it from the last (provoking) vertex.  A future
      geometry shader extension may choose to define this behavior one way or
      the other.

      To get portable results, the layer number should be the same for all
      vertices in any single primitive emitted by the geometry shader.  The
      EndPrimitive() built-in function available in a geometry shader starts a
      new primitive, and the layer number emitted can be safely changed after
      EndPrimitive() is called.

  33. The grammar allows "varying", "varying out", and "varying in" as
      type-qualifiers for geometry shaders.  What does "varying" without "in"
      or "out" mean for a geometry shader?

      RESOLVED:  The "varying" type qualifier in a geometry shader not
      followed by "in" or "out" means the same as "varying out".

      This is consistent with the specification saying: "In order to seamlessly
      be able to insert or remove a geometry shader from a program object,
      the rules, names and types of the output built-in varying variables and
      user-defined varying variables are the same as for the vertex shader."

  34. What happens if you try to do a framebuffer blit (EXT_framebuffer_blit)
      to/from a layered framebuffer?

      RESOLVED:  BlitFramebufferEXT() is a two-dimensional operation (only has
      a width and height), so only reads/writes layer zero.  The framebuffer
      blit operation is defined partially in terms of CopyPixels, which itself
      is defined in terms of ReadPixels and DrawPixels.  This spec defines
      both operations to use layer zero when a layered framebuffer is
      involved.

      It may be desirable to provide a three-dimensional framebuffer blit
      operation or an explicit copy single-step operation between two
      three-dimensional, cube map, or array textures.  That functionality is
      left for a future extension or OpenGL version.

  35. Why are the MAX_VARYING_COMPONENTS and FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
      tokens un-suffixed?

      PROPOSED: Both of these tokens are provided in un-suffixed form in
      OpenGL 3.0, which was released simultaneously with
      ARB_geometry_shader4, and are not going to change their meaning
      when this extension is promoted to a future core release since
      their meaning is already defined by both 3.0 and this extension
      to be the same

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
     26   01/21/11  pbrown    Add language describing MAX_COMBINED_
                              GEOMETRY_UNIFORM_COMPONENTS from an interaction
                              with ARB_uniform_buffer_object (bug 7027).

     25   12/21/09  jjones    Add GLX protocol.

     24   07/21/09  pbrown    Clarify that when doing layered rendering,
                              a layer specified in the shader is used to
                              select the depth and stencil layers accessed.

     23   06/30/09  pbrown    Add interaction with OpenGL 3.2.

     22   08/07/08  jleech    Strip ARB suffix from a few tokens already
                              in OpenGL 3.0 (see issue 35).

     21   07/09/08  jsandmel  last edit accidentally added dependencies
                              on ARB_framebuffer_object.  as per working
                              group meeting 7/11, this was unintentional, so
                              it's now been reverted back to a dependency on
                              EXT_framebuffer_object

     20   07/09/08  jsandmel  converted to ARB.  no functional changes.
           
    
     19   04/04/08  pbrown    Changed MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB
                              minimum value to zero, to match discussion (from
                              aeddy).  Added separators to group pictures and 
                              discussions of each of the new primitive types
                              together.

     18   03/15/08  pbrown    Additional dependency on EXT_framebuffer_blit;
                              blits to/from layered targets affect only
                              layer zero.

     17   05/22/07  mjk       Clarify that "varying" means the same as
                              "varying out" in a geometry shader.

     16   01/10/07  pbrown    Specify that the total component limit is
                              enforced at LinkProgram time.

     15   12/15/06  pbrown    Documented that the '#extension' token
                              for this extension should begin with "GL_",
                              as apparently called for per convention.

     14      --               Pre-release revisions.
