Name

    ARB_tessellation_shader

Name Strings

    GL_ARB_tessellation_shader

Contact

    Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)

Contributors

    Barthold Lichtenbelt, NVIDIA
    Bill Licea-Kane, AMD
    Bruce Merry, ARM
    Chris Dodd, NVIDIA
    Eric Werness, NVIDIA
    Graham Sellers, AMD
    Greg Roth, NVIDIA
    Ignacio Castano, NVIDIA
    Jeff Bolz, NVIDIA
    Nick Haemel, AMD
    Pierre Boudier, AMD
    Piers Daniell, NVIDIA

Notice

    Copyright (c) 2010-2015 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

    Complete. Approved by the ARB at the 2010/01/22 F2F meeting.
    Approved by the Khronos Board of Promoters on March 10, 2010.
    
Version

    Last Modified Date:         April 20, 2015
    Revision: 22

Number

    ARB Extension #91

Dependencies

    This extension is written against the OpenGL 3.2 (Compatibility Profile)
    Specification.

    This extension is written against Version 1.50 (Revision 09) of the OpenGL
    Shading Language Specification.

    OpenGL 3.2 and GLSL 1.50 are required.

    This specification interacts with the core profile of OpenGL 3.2.

    This specification interacts with ARB_gpu_shader5.

    This specification interacts with ARB_gpu_shader_fp64.

    This specification interacts with NV_gpu_shader5.

    This specification interacts with NV_primitive_restart.

Overview

    This extension introduces new tessellation stages and two new shader types
    to the OpenGL primitive processing pipeline.  These pipeline stages
    operate on a new basic primitive type, called a patch.  A patch consists
    of a fixed-size collection of vertices, each with per-vertex attributes,
    plus a number of associated per-patch attributes.  Tessellation control
    shaders transform an input patch specified by the application, computing
    per-vertex and per-patch attributes for a new output patch.  A
    fixed-function tessellation primitive generator subdivides the patch, and
    tessellation evaluation shaders are used to compute the position and
    attributes of each vertex produced by the tessellator.

    When tessellation is active, it begins by running the optional
    tessellation control shader.  This shader consumes an input patch and
    produces a new fixed-size output patch.  The output patch consists of an
    array of vertices, and a set of per-patch attributes.  The per-patch
    attributes include tessellation levels that control how finely the patch
    will be tessellated.  For each patch processed, multiple tessellation
    control shader invocations are performed -- one per output patch vertex.
    Each tessellation control shader invocation writes all the attributes of
    its corresponding output patch vertex.  A tessellation control shader may
    also read the per-vertex outputs of other tessellation control shader
    invocations, as well as read and write shared per-patch outputs.  The
    tessellation control shader invocations for a single patch effectively run
    as a group.  A built-in barrier() function is provided to allow
    synchronization points where no shader invocation will continue until all
    shader invocations have reached the barrier.

    The tessellation primitive generator then decomposes a patch into a new
    set of primitives using the tessellation levels to determine how finely
    tessellated the output should be.  The primitive generator begins with
    either a triangle or a quad, and splits each outer edge of the primitive
    into a number of segments approximately equal to the corresponding element
    of the outer tessellation level array.  The interior of the primitive is
    tessellated according to elements of the inner tessellation level array.
    The primitive generator has three modes:  "triangles" and "quads" split a
    triangular or quad-shaped patch into a set of triangles that cover the
    original patch; "isolines" splits a quad-shaped patch into a set of line
    strips running across the patch horizontally.  Each vertex generated by
    the tessellation primitive generator is assigned a (u,v) or (u,v,w)
    coordinate indicating its relative location in the subdivided triangle or
    quad.

    For each vertex produced by the tessellation primitive generator, the
    tessellation evaluation shader is run to compute its position and other
    attributes of the vertex, using its (u,v) or (u,v,w) coordinate.  When
    computing final vertex attributes, the tessellation evaluation shader can
    also read the attributes of any of the vertices of the patch written by
    the tessellation control shader.  Tessellation evaluation shader
    invocations are completely independent, although all invocations for a
    single patch share the same collection of input vertices and per-patch
    attributes.

    The tessellator operates on vertices after they have been transformed by a
    vertex shader.  The primitives generated by the tessellator are passed
    further down the OpenGL pipeline, where they can be used as inputs to
    geometry shaders, transform feedback, and the rasterizer.

    The tessellation control and evaluation shaders are both optional.  If
    neither shader type is present, the tessellation stage has no effect.  If
    no tessellation control shader is present, the input patch provided by the
    application is passed directly to the tessellation primitive generator,
    and a set of default tessellation level parameters is used to control
    primitive generation.  In this extension, patches may not be passed beyond
    the tessellation evaluation shader, and an error is generated if an
    application provides patches and the current program object contains no
    tessellation evaluation shader.

IP Status

    No known IP claims.

New Procedures and Functions

      void PatchParameteri(enum pname, int value);
      void PatchParameterfv(enum pname, const float *values);

New Tokens

    Accepted by the <mode> parameter of Begin and all vertex array functions
    that implicitly call Begin:

        PATCHES                                         0xE

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

        PATCH_VERTICES                                 0x8E72

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

        PATCH_DEFAULT_INNER_LEVEL                       0x8E73
        PATCH_DEFAULT_OUTER_LEVEL                       0x8E74

    Accepted by the <pname> parameter of GetProgramiv:

        TESS_CONTROL_OUTPUT_VERTICES                    0x8E75
        TESS_GEN_MODE                                   0x8E76
        TESS_GEN_SPACING                                0x8E77
        TESS_GEN_VERTEX_ORDER                           0x8E78
        TESS_GEN_POINT_MODE                             0x8E79

    Returned by GetProgramiv when <pname> is TESS_GEN_MODE:

        TRIANGLES
        QUADS
        ISOLINES                                        0x8E7A

    Returned by GetProgramiv when <pname> is TESS_GEN_SPACING:

        EQUAL
        FRACTIONAL_ODD                                  0x8E7B
        FRACTIONAL_EVEN                                 0x8E7C

    Returned by GetProgramiv when <pname> is TESS_GEN_VERTEX_ORDER:

        CCW
        CW

    Returned by GetProgramiv when <pname> is TESS_GEN_POINT_MODE:

        FALSE
        TRUE

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

        MAX_PATCH_VERTICES                              0x8E7D
        MAX_TESS_GEN_LEVEL                              0x8E7E
        MAX_TESS_CONTROL_UNIFORM_COMPONENTS             0x8E7F
        MAX_TESS_EVALUATION_UNIFORM_COMPONENTS          0x8E80
        MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS            0x8E81
        MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS         0x8E82
        MAX_TESS_CONTROL_OUTPUT_COMPONENTS              0x8E83
        MAX_TESS_PATCH_COMPONENTS                       0x8E84
        MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS        0x8E85
        MAX_TESS_EVALUATION_OUTPUT_COMPONENTS           0x8E86
        MAX_TESS_CONTROL_UNIFORM_BLOCKS                 0x8E89
        MAX_TESS_EVALUATION_UNIFORM_BLOCKS              0x8E8A
        MAX_TESS_CONTROL_INPUT_COMPONENTS               0x886C
        MAX_TESS_EVALUATION_INPUT_COMPONENTS            0x886D
        MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS    0x8E1E
        MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F

    Accepted by the <pname> parameter of GetActiveUniformBlockiv:
    
        UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER     0x84F0
        UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER  0x84F1

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

        TESS_EVALUATION_SHADER                          0x8E87
        TESS_CONTROL_SHADER                             0x8E88


Additions to Chapter 2 of the OpenGL 3.2 (Compatibility Profile) Specification (OpenGL
Operation)

    Modify Section 2.6.1, Begin and End, p. 22

    (insert before the last paragraph, p. 27)

    Separate Patches

    Separate patches are specified with mode PATCHES.  A patch is an ordered
    collection of vertices used for primitive tessellation (section 2.X).  The
    vertices comprising a patch have no implied geometric ordering.  The
    vertices of a patch are used by tessellation shaders and a fixed-function
    tessellator to generate new point, line, or triangle primitives.

    Each patch in the series has a fixed number of vertices, which is
    specified by calling

      void PatchParameteri(enum pname, int value);

    with <pname> set to PATCH_VERTICES.  The error INVALID_VALUE is generated
    if <value> is less than or equal to zero or is greater than the
    implementation-dependent maximum patch size, MAX_PATCH_VERTICES.  The
    patch size is initially three vertices.

    If the number of vertices in a patch is given by <v>, the <v>*<i>+1st
    through <v>*<i>+<v>th vertices (in that order) determine a patch for each
    i = 0, 1, ..., n-1, where there are <v>*<n>+<k> vertices.  <k> is in the
    range [0,<v>-1]; if <k> is not zero, the final <k> vertices are ignored.


    (modify second paragraph, p. 29)  The state required for Begin and End
    consists of a sixteen-valued integer indicating either one of the fifteen
    possible Begin/End modes, or that no Begin/End mode is being processed.


    Modify Section 2.14, Vertex Shaders, p. 82

    (modify fourth paragraph, p. 82) In addition to vertex shaders,
    tessellation control shaders, tessellation evaluation shaders, geometry
    shaders, and fragment shaders can be created, compiled, and linked into
    program objects.  Tessellation control and evaluation shaders are used to
    control the operation of the tessellator, and are described in section
    2.X.  Geometry shaders affect the processing of primitives assembled from
    vertices (see section 2.15). Fragment shaders affect the processing of
    fragments during rasterization (see section 3.12).  A single program
    object can contain vertex, tessellation control, tessellation evaluation,
    geometry, and fragment shaders.


    Modify Section 2.14.2, Program Objects, p. 84

    (insert before third paragraph, p. 85)

    Linking will fail if the program object contains objects to form a
    tessellation control shader (see section 2.X.1), and

      * the program contains no objects to form a vertex shader;

      * the output patch vertex count is not specified in any compiled
        tessellation control shader object; or

      * the output patch vertex count is specified differently in multiple
        tessellation control shader objects.

    Linking will fail if the program object contains objects to form a
    tessellation evaluation shader (see section 2.X.3), and

      * the program contains no objects to form a vertex shader;

      * the tessellation primitive mode is not specified in any compiled
        tessellation evaluation shader object; or

      * the tessellation primitive mode, spacing, vertex order, or point mode
        is specified differently in multiple tessellation evaluation shader
        objects.


    Modify Section 2.14.4, Uniform Variables, p, 89

    (modify sixth paragraph, p. 93) If <pname> is
    UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER,
    UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER,
    UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER,
    UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER, or
    UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, then a boolean value
    indicating whether the uniform block identified by <uniformBlockIndex> is
    referenced by the vertex, tessellation control, tessellation evaluation,
    geometry, or fragment shaders of <program>, respectively, is returned.

    (modify next-to-last paragraph, p. 101) There is a set of
    implementation-dependent maximums for the number of active uniform blocks
    used by each shader.  If the number of uniform blocks used by any shader
    in the program exceeds its corresponding limit, the program will fail to
    link. The limits for vertex, tessellation control, tessellation
    evaluation, geometry, and fragment shaders can be obtained by calling
    GetIntegerv with pname values of MAX_VERTEX_UNIFORM_BLOCKS,
    MAX_TESS_CONTROL_UNIFORM_BLOCKS, MAX_TESS_EVALUATION_UNIFORM_BLOCKS,
    MAX_GEOMETRY_UNIFORM_BLOCKS, and MAX_FRAGMENT_UNIFORM_BLOCKS,
    respectively.


    Modify Section 2.14.6, Varying Variables, p. 106

    (modify three paragraphs starting with the last paragraph, p. 106, to
    refer less specifically to geometry shaders) ...  These varying variables
    are used as the mechanism to communicate values to the next active stage
    in the vertex processing pipeline:  either the tessellation control
    shader, the tessellation evaluation shader, the geometry shader, or the
    fixed-function vertex processing stages leading to rasterization.

    If the varying variables are passed directly to the vertex processing
    stages leading to rasterization, the values of all varying and special
    variables are expected to be interpolated across the primitive being
    rendered, unless flatshaded.  Otherwise, the values of all varying and
    special variables are collected by the primitive assembly stage and passed
    on to the subsequent pipeline stage once enough data for one primitive has
    been collected

    The number of components (individual scalar numeric values) of varying and
    special variables that can be written by the vertex shader, whether or not
    a tessellation control, tessellation evaluation, or geometry shader is
    active, is given by the value of the implementation-dependent constant
    MAX_VERTEX_OUTPUT_COMPONENTS.  Outputs declared as vectors, matrices, and
    arrays will all consume multiple components.

    (modify next-to-last paragraph, p. 107) Each program object can specify a
    set of output variables from one shader to be recorded in transform
    feedback mode (see section 2.19).  If a geometry shader is active, its
    output variables are the ones that can be recorded.  Otherwise,
    tessellation evaluation shader outputs will be recorded, if that shader is
    active.  Otherwise, tessellation control shader outputs will be recorded,
    if that shader is active.  Otherwise, vertex shader outputs will be
    recorded.  The values to record are specified with the command ...

    (modify bullet list, p. 108)

      * the count specified by TransformFeedbackVaryings is non-zero, but the
        program object has no vertex, tessellation control, tessellation
        evaluation, or geometry shader;

      * any variable name specified in the varyings array is not declared as
        an output in the shader stage whose outputs can be recorded;

      ...


    Modify Section 2.14.7, Shader Execution, p. 109

    (Modify the part of the section describing what is and is not done for
    processing vertices when vertex shaders are active, p. 109 and 110.  This
    rewrite is intended to apply to all programmable vertex processing
    pipeline stages.  Ideally, we should refactor the spec to first have a
    general programmable shading section describing common shader
    functionality and this pipeline, followed by sections containing
    domain-specific items.)

    If a successfully linked program object that contains a vertex,
    tessellation control, tessellation evaluation, or geometry shader is made
    current by calling UseProgram, the executable version of these shaders are
    used to process incoming vertex values, rather than the fixed-function
    vertex processing described in sections 2.16 through 2.13.  In particular,

      (keep list of fixed-function operations that are not performed)

    Instead, the following sequence of operations is performed:

      * Vertices are processed by the vertex shader (section 2.14) and
        assembled into primitives as described in sections 2.6 through 2.10.

      * If the current program contains a tessellation control shader, each
        individual patch primitive is processed by the tessellation control
        shader (section 2.X.1).  Otherwise, primitives are passed through
        unmodified.  If active, the tessellation control shader consumes its
        input patch and produces a new patch primitive, which is passed to
        subsequent pipeline stages.

      * If the current program contains a tessellation evaluation shader, each
        individual patch primitive is processed by the tessellation primitive
        generator (section 2.X.2) and tessellation evaluation shader (section
        2.X.3).  Otherwise, primitives are passed through unmodified.  When a
        tessellation evaluation shader is active, the tessellation primitive
        generator produces a new collection of point, line, or triangle
        primitives to be passed to subsequent pipeline stages.  The vertices
        of these primitives are processed by the tessellation evaluation
        shader.  The patch primitive passed to the tessellation primitive
        generator is consumed by this process.

      * If the current program contains a geometry shader, each individual
        primitive is processed by the geometry shader (section 2.15).
        Otherwise, primitives are passed through unmodified.  If active, the
        geometry shader consumes its input patch.  However, each geometry
        shader invocation may emit new vertices, which are arranged into
        primitives and passed to subsequent pipeline stages.

      * The primitives reaching this stage in the pipeline are then processed
        by the following fixed-function operations:

        (NOTE:  This change rearranges the order of some of the operations,
         and adds explicit references to transform feedback and rasterization.
         The pipeline stages have been in the wrong order since OpenGL 2.0 --
         in particular, clipping logically happens before perspective division
         and viewport transformations.)

        * Color clamping or masking (section 2.13.6).

        * Transform feedback (section 2.19).

        * Flatshading (section 2.21).

        * Clipping, including client-defined clip planes (section 2.22).

        * Perspective division on clip coordinates (section 2.16).

        * Viewport mapping, including depth range scaling (section 2.16.1).

        * Front face determination (section 2.13.1).

        * Color, texture coordinate, fog, point-size and generic attribute
          clipping (section 2.22.1).

        * Final color processing (section 2.23).

        * Rasterization (chapter 3).


    Modify Section 2.14.7, Shader Execution, p. 109

    (modify last paragraph, p. 110) This section describes texture
    functionality that is only accessible through vertex, tessellation
    control, tessellation evaluation, geometry, or fragment shaders. ...

    (modify first paragraph under "Texture Access", p. 112) Shaders have the
    ability to do a lookup into a texture map.  The maximum number of texture
    image units available to vertex, tessellation control, tessellation
    evaluation, geometry, or fragment shaders are the values of
    the implementation-dependent constants 

      * MAX_VERTEX_TEXTURE_IMAGE_UNITS (vertex),
      * MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS (tessellation control),
      * MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS (tessellation evaluation),
      * MAX_GEOMETRY_TEXTURE_IMAGE_UNITS (geometry), and
      * MAX_TEXTURE_IMAGE_UNITS (fragment).

    The vertex shader, tessellation control and evaluation shader, geometry
    shader, and fragment processing combined cannot use more than the value of
    MAX_COMBINED_TEXTURE_IMAGE_UNITS texture image units. If more than one
    pipeline stage accesses the same texture image unit, each such access
    counts separately against the MAX_COMBINED_TEXTURE_IMAGE_UNITS limit.

    (modify next-to-last paragraph p. 112) When a texture lookup is performed
    in a shader, the filtered ...

    (modify last paragraph p. 112) In shaders other than fragment shaders, it
    is not possible...

    (modify last paragraph before "Shader Inputs", p. 113) If a shader uses a
    sampler where the associated ...


    Insert a new section immediately after Section 2.14, Vertex Shaders.

    Section 2.X, Tessellation

    Tessellation is a process that reads a patch primitive and generates new
    primitives used by subsequent pipeline stages.  The generated primitives
    are formed by subdividing a single triangle or quad primitive according to
    fixed or shader-computed levels of detail and transforming each of the
    vertices produced during this subdivision.

    Tessellation functionality is controlled by two types of tessellation
    shaders:  tessellation control shaders and tessellation evaluation
    shaders.  Tessellation is considered active if and only if there is an
    active program object, and that program object contains a tessellation
    control or evaluation shader.

    The tessellation control shader is used to read an input patch provided by
    the application, and emit an output patch.  The tessellation control
    shader is run once for each vertex in the output patch and computes the
    attributes of that vertex.  Additionally, the tessellation control shader
    may compute additional per-patch attributes of the output patch.  The most
    important per-patch outputs are the tessellation levels, which are used to
    control the number of subdivisions performed by the tessellation primitive
    generator.  The tessellation control shader may also write additional
    per-patch attributes for use by the tessellation evaluation shader.  If no
    tessellation control shader is active, the patch provided is passed
    through to the tessellation primitive generator stage unmodified.

    If a tessellation evaluation shader is active, the tessellation primitive
    generator subdivides a triangle or quad primitive into a collection of
    points, lines, or triangles according to the tessellation levels of the
    patch and the set of layout declarations specified in the tessellation
    evaluation shader text.  The tessellation levels used to control
    subdivision are normally written by the tessellation control shader.  If
    no tessellation control shader is active, default tessellation levels are
    instead used.

    When a tessellation evaluation shader is active, it is run on each vertex
    generated by the tessellation primitive generator to compute the final
    position and other attributes of the vertex.  The tessellation evaluation
    shader can read the relative location of the vertex in the subdivided
    output primitive, given by an (u,v) or (u,v,w) coordinate, as well as the
    position and attributes of any or all of the vertices in the input patch.

    Tessellation operates only on patch primitives.  If tessellation is
    active, the error INVALID_OPERATION is generated by Begin (or vertex array
    commands that implicitly call Begin) if the primitive mode is not
    PATCHES.

    Patch primitives are not supported by pipeline stages below the
    tessellation evaluation shader.  If there is no active program object or
    the active program object does not contain a tessellation evaluation
    shader, the error INVALID_OPERATION is generated by Begin (or vertex array
    commands that implicitly call Begin) if the primitive mode is PATCHES.

    A program object that includes a tessellation shader of any kind must also
    include a vertex shader, and will fail to link if no vertex shader is
    provided.


    Section 2.X.1, Tessellation Control Shaders

    The tessellation control shader consumes an input patch provided by the
    application and emits a new output patch.  The input patch is an array of
    vertices with attributes corresponding to output variables written by the
    vertex shader.  The output patch consists of an array of vertices with
    attributes corresponding to per-vertex output variables written by the
    tessellation control shader and a set of per-patch attributes
    corresponding to per-patch output variables written by the tessellation
    control shader.  Tessellation control output variables are per-vertex by
    default, but may be declared as per-patch using the "patch" qualifier.

    The number of vertices in the output patch is fixed when the program is
    linked, and is specified in tessellation control shader source code using
    the output layout qualifier "vertices", as described in the OpenGL Shading
    Language Specification.  A program will fail to link if the output patch
    vertex count is not specified by any tessellation control shader object
    attached to the program, if it is specified differently by multiple
    tessellation control shader objects, if it is less than or equal to zero,
    or if it is greater than the implementation-dependent maximum patch
    size. The output patch vertex count may be queried by calling GetProgramiv
    with the symbolic constant TESS_CONTROL_OUTPUT_VERTICES.

    Tessellation control shaders are created as described in section 2.14.1,
    using a <type> of TESS_CONTROL_SHADER.  When a new input patch is
    received, the tessellation control shader is run once for each vertex in
    the output patch.  The tessellation control shader invocations
    collectively specify the per-vertex and per-patch attributes of the output
    patch.  The per-vertex attributes are obtained from the per-vertex output
    variables written by each invocation.  Each tessellation control shader
    invocation may only write to per-vertex output variables corresponding to
    its own output patch vertex.  The output patch vertex number corresponding
    to a given tessellation control point shader invocation is given by the
    built-in variable gl_InvocationID.  Per-patch attributes are taken from
    the per-patch output variables, which may be written by any tessellation
    control shader invocation.  While tessellation control shader invocations
    may read any per-vertex and per-patch output variable and write any
    per-patch output variable, reading or writing output variables also
    written by other invocations has ordering hazards discussed below.


    Section 2.X.1.1, Tessellation Control Shader Variables

    Tessellation control 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 tessellation control shader is
    specified by the value of the implementation-dependent constant
    MAX_TESS_CONTROL_UNIFORM_COMPONENTS.  The total amount of combined storage
    available for uniform variables in all uniform blocks accessed by a
    tessellation control shader (including the default uniform block) is
    specified by the value of the implementation-dependent constant
    MAX_COMBINED_TESS_CONTROL_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 tessellation evaluation shader.
    A link error is generated if an attempt is made to utilize more than the
    space available for tessellation control shader uniform variables.
    Uniforms are manipulated as described in section 2.14.4.  Tessellation
    control shaders also have access to samplers to perform texturing
    operations, as described in sections 2.14.5.

    Tessellation control shaders can access the transformed attributes of all
    vertices for their input primitive using input variables.  A vertex shader
    writing to output variables generates the values of these input varying
    variables, including 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, tessellation control shaders can write to one or more output
    variables, including per-vertex attributes for the vertices of the output
    patch and per-patch attributes of the patch.  Tessellation control shaders
    can also write to a set of built-in per-vertex and per-patch outputs
    defined in the OpenGL Shading Language.  The per-vertex and per-patch
    attributes of the output patch are used by the tessellation primitive
    generator (section 2.X.2) and may be read by tessellation evaluation
    shader (section 2.X.3).


    Section 2.X.1.2, Tessellation Control Shader Execution Environment

    If a successfully linked program object that contains a tessellation
    control shader is made current by calling UseProgram, the executable
    version of the tessellation control shader is used to process patches
    resulting from the primitive assembly stage.  When tessellation control
    shader execution completes, the input patch is consumed.  A new patch is
    assembled from the per-vertex and per-patch output variables written by
    the shader and is passed to subsequent pipeline stages.

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

    Texture Access

    The Shader-Only Texturing subsection of section 2.14.7 describes texture
    lookup functionality accessible to a vertex shader.  The texel fetch and
    texture size query functionality described there also applies to
    tessellation control shaders.

    Tessellation Control Shader Inputs

    Section 7.1 of the OpenGL Shading Language Specification describes the
    built-in variable array gl_in[] available as input to a tessellation
    control shader.  gl_in[] receives values from equivalent built-in output
    variables written by the vertex shader (section 2.14.7).  Each array
    element of gl_in[] is a structure holding values for a specific vertex of
    the input patch.  The length of gl_in[] is equal to the
    implementation-dependent maximum patch size (gl_MaxPatchVertices).
    Behavior is undefined if gl_in[] is indexed with a vertex index greater
    than or equal to the current patch size.  The members of each element of
    the gl_in[] array are gl_Position, gl_PointSize, gl_ClipDistance[],
    gl_ClipVertex, gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor,
    gl_BackSecondaryColor, gl_TexCoord[], and gl_FogFragCoord[].

    Tessellation control shaders have available several other special input
    variables not replicated per-vertex and not contained in gl_in[],
    including:

      * The variable gl_PatchVerticesIn holds the number of vertices in the
        input patch being processed by the tessellation control shader.

      * The variable gl_PrimitiveID 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.  Restarting a primitive topology using the primitive
        restart index has no effect on the primitive ID counter.

      * The variable gl_InvocationID holds an invocation number for the
        current tessellation control shader invocation.  Tessellation control
        shaders are invoked once per output patch vertex, and invocations are
        numbered beginning with zero.

    Similarly to the built-in varying variables, each user-defined input
    varying variable has a value for each vertex and thus needs to be declared
    as arrays or inside input blocks declared as arrays.  Declaring an array
    size is optional.  If no size is specified, it will be taken from the
    implementation-dependent maximum patch size (gl_MaxPatchVertices).  If a
    size is specified, it must match the maximum patch size; otherwise, a
    compile or link
    error will occur.  Since the array size may be larger than the number of
    vertices found in the input patch, behavior is undefined if a per-vertex
    input variable is accessed using an index greater than or equal to the
    number of vertices in the input patch.  The OpenGL Shading Language
    doesn't support multi-dimensional arrays; therefore, user-defined
    tessellation control shader inputs corresponding to vertex shader outputs
    declared as arrays must be declared as array members of an input block
    that is itself declared as an array.

    (Note:  minor restructuring in the following paragraph relative to the
    equivalent geometry shader language.)

    Similarly to the limit on vertex shader output components (see section
    2.14.6), there is a limit on the number of components of built-in and
    user-defined input varying variables that can be read by the tessellation
    control shader, given by the value of the implementation-dependent
    constant MAX_TESS_CONTROL_INPUT_COMPONENTS.  When a program is linked, all
    components of any varying and special variable read by a tessellation
    control shader will count against this limit.  A program whose
    tessellation control shader exceeds this limit may fail to link, unless
    device-dependent optimizations are able to make the program fit within
    available hardware resources.


    Tessellation Control Shader Outputs

    Section 7.1 of the OpenGL Shading Language Specification describes the
    built-in variable array gl_out[] available as an output for a tessellation
    control shader.  gl_out[] passes values to equivalent built-in input
    variables read by subsequent shader stages or to subsequent fixed
    functionality vertex processing pipeline stages.  Each array element of
    gl_out[] is a structure holding values for a specific vertex of the output
    patch. The length of gl_out[] is equal to the output patch size specified
    in the tessellation control shader output layout declaration
    (gl_VerticesOut).  The members of each element of the gl_out[] array are
    gl_Position, gl_PointSize, gl_ClipDistance[], gl_ClipVertex,
    gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor,
    gl_BackSecondaryColor, gl_TexCoord[], and gl_FogFragCoord[], and behave
    identically to equivalently named vertex shader outputs (section 2.14.7).

    Tessellation shaders additionally have two built-in per-patch output
    arrays, gl_TessLevelOuter[] and gl_TessLevelInner[].  These arrays are not
    replicated for each output patch vertices and are not members of gl_out[].
    gl_TessLevelOuter[] is an array of four floating-point values specifying
    the approximate number of segments that the tessellation primitive
    generator should use when subdividing each outer edge of the primitive it
    subdivides.  gl_TessLevelInner[] is an array of two floating-point values
    specifying the approximate number of segments used to produce a
    regularly-subdivided primitive interior.  The values written to
    gl_TessLevelOuter and gl_TessLevelInner need not be integers, and their
    interpretation depends on the type of primitive the tessellation primitive
    generator will subdivide and other tessellation parameters, as discussed
    in the following section.

    A tessellation control shader may also declare user-defined per-vertex
    output variables.  User-defined per-vertex output variables are declared
    with the qualifier "out" and have a value for each vertex in the output
    patch.  Such variables must be declared as arrays or inside output blocks
    declared as arrays.  Declaring an array size is optional.  If no size is
    specified, it will be taken from the output patch size (gl_VerticesOut)
    declared in the shader.  If a size is specified, it must match the maximum
    patch size; otherwise, a compile or link link error will occur.  The OpenGL Shading
    Language doesn't support multi-dimensional arrays; therefore, user-defined
    per-vertex tessellation control shader outputs with multiple elements per
    vertex must be declared as array members of an output block that is itself
    declared as an array.

    While per-vertex output variables are declared as arrays indexed by vertex
    number, each tessellation control shader invocation may write only to
    those outputs corresponding to its output patch vertex.  Tessellation
    control shaders must use the special variable gl_InvocationID as the
    vertex number index when writing to per-vertex output variables.

    Additionally, a tessellation control shader may declare per-patch output
    variables using the qualifier "patch out".  Unlike per-vertex outputs,
    per-patch outputs do not correspond to any specific vertex in the patch,
    and are not indexed by vertex number.  Per-patch outputs declared as
    arrays have multiple values for the output patch; similarly declared
    per-vertex outputs would indicate a single value for each vertex in the
    output patch.  User-defined per-patch outputs are not used by the
    tessellation primitive generator, but may be read by tessellation
    evaluation shaders.

    There are several limits on the number of components of built-in and
    user-defined output variables that can be written by the tessellation
    control shader.  The number of components of active per-vertex output
    variables may not exceed the value of MAX_TESS_CONTROL_OUTPUT_COMPONENTS.
    The number of components of active per-patch output variables may not
    exceed the value of MAX_TESS_PATCH_COMPONENTS.  The built-in outputs
    gl_TessLevelOuter[] and gl_TessLevelInner[] are not counted against the
    per-patch limit.  The total number of components of active per-vertex and
    per-patch outputs is derived by multiplying the per-vertex output
    component count by the output patch size and then adding the per-patch
    output component count.  The total component count may not exceed
    MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS.  When a program is linked, all
    components of any varying and special variables written by a tessellation
    control shader will count against this limit.  A program exceeding any of
    these limits may fail to link, unless device-dependent optimizations are
    able to make the program fit within available hardware resources.


    Tessellation Control Shader Execution Order

    For tessellation control shaders with a declared output patch size greater
    than one, the shader is invoked more than once for each input patch.  The
    order of execution of one tessellation control shader invocation relative
    to the other invocations for the same input patch is largely undefined.
    The built-in function barrier() provides some control over relative
    execution order.  When a tessellation control shader calls the barrier()
    function, its execution pauses until all other invocations have also
    called the same function.  Output variable assignments performed by any
    invocation executed prior to calling barrier() will be visible to any
    other invocation after the call to barrier() returns.  Shader output
    values read in one invocation but written by another may be undefined
    without proper use of barrier(); full rules are found in the OpenGL
    Shading Language Specification.

    The barrier() function may only be called inside the main entry point of
    the tessellation control shader and may not be called in potentially
    divergent flow control.  In particular, barrier() may not be called inside
    a switch statement, in either sub-statement of an if statement, inside a
    do, for, or while loop, or at any point after a return statement in the
    function main().


    Section 2.X.2, Tessellation Primitive Generation

    If a tessellation evaluation shader is present, the tessellation primitive
    generator consumes the input patch and produces a new set of basic
    primitives (points, lines, or triangles).  These primitives are produced
    by subdividing a geometric primitive (rectangle or triangle) according to
    the per-patch tessellation levels written by the tessellation control
    shader, if present, or taken from default patch parameter values.  This
    subdivision is performed in an implementation-dependent manner.  If no
    tessellation evaluation shader is present, the tessellation primitive
    generator passes incoming primitives through without modification.

    The type of subdivision performed by the tessellation primitive generator
    is specified by an input layout declaration in the tessellation evaluation
    shader using one of the identifiers "triangles", "quads", and "isolines".
    For "triangles", the primitive generator subdivides a triangle primitive
    into smaller triangles.  For "quads", the primitive generator subdivides a
    rectangle primitive into smaller triangles.  For "isolines", the primitive
    generator subdivides a rectangle primitive into a collection of line
    segments arranged in strips stretching horizontally across the rectangle.
    Each vertex produced by the primitive generator has an associated (u,v,w)
    or (u,v) position in a normalized parameter space, with parameter values
    in the range [0,1], as illustrated in Figure X.1.  For "triangles", the
    vertex position is a barycentric coordinate (u,v,w), where u+v+w==1, and
    indicates the relative influence of the three vertices of the triangle on
    the position of the vertex.  For "quads" and "isolines", the position is a
    (u,v) coordinate indicating the relative horizontal and vertical position
    of the vertex relative to the subdivided rectangle.  The subdivision
    process is explained in more detail in subsequent sections.

        (0,1)   OL3   (1,1)          (0,1,0)         (0,1)          (1,1)
         +--------------+              +             ^  +  <no edge>   +  
         |              |             / \            |                
         |  +--------+  |            /   \           |  +--------------+  
         |  |   IL0  |  |       OL0 /  +  \ OL2      |                  
      OL0|  |IL1     |  |OL2       /  / \  \         |  +--------------+  
         |  |        |  |         /  /IL0\  \       OL0                  
         |  +--------+  |        /  +-----+  \       |  +--------------+  
         |              |       /             \      |                 
         +--------------+      +---------------+     v  +--------------+  
        (0,0)   OL1   (1,0) (0,0,1)   OL1   (1,0,0)   (0,0)   OL1   (1,0)

              quads                triangles                isolines
           
      Figure X.1:  Domain parameterization for tessellation generator
      primitive modes (triangles, quads, or isolines).  The coordinates
      illustrate the value of gl_TessCoord at the corners of the domain.  The
      labels on the edges indicate the inner (IL0 and IL1) and outer (OL0
      through OL3) tessellation level values used to control the number of
      subdivisions along each edge of the domain.

    When no tessellation control shader is present, the tessellation levels
    are taken from default patch tessellation levels.  These default levels
    are set by calling

      void PatchParameterfv(enum pname, const float *values);

    If <pname> is PATCH_DEFAULT_OUTER_LEVEL, <values> specifies an array of
    four floating-point values corresponding to the four outer tessellation
    levels for each subsequent patch.  If <pname> is
    PATCH_DEFAULT_INNER_LEVEL, <values> specifies an array of two
    floating-point values corresponding to the two inner tessellation levels.

    A patch is discarded by the tessellation primitive generator if any
    relevant outer tessellation level is less than or equal to zero.  Patches
    will also be discarded if any outer tessellation level corresponds to a
    floating-point NaN (not a number) in implementations supporting NaN.
    When patches are discarded, no new primitives will be generated and the
    tessellation evaluation program will not be run.  For "quads", all four
    outer levels are relevant.  For "triangles" and "isolines", only the first
    three or two outer levels, respectively, are relevant.  Negative inner
    levels will not cause a patch to be discarded; they will be clamped as
    described below.

    Each of the tessellation levels is used to determine the number and
    spacing of segments used to subdivide a corresponding edge.  The method
    used to derive the number and spacing of segments is specified by an input
    layout declaration in the tessellation evaluation shader using one of the
    identifiers "equal_spacing", "fractional_even_spacing", or
    "fractional_odd_spacing".  If no spacing is specified in the tessellation
    evaluation shader, "equal_spacing" will be used.

    If "equal_spacing" is used, the floating-point tessellation level is first
    clamped to the range [1,<max>], where <max> is implementation-dependent
    maximum tessellation level (MAX_TESS_GEN_LEVEL).  The result is rounded up
    to the nearest integer <n>, and the corresponding edge is divided into <n>
    segments of equal length in (u,v) space.

    If "fractional_even_spacing" is used, the tessellation level is first
    clamped to the range [2,<max>] and then rounded up to the nearest even
    integer <n>.  If "fractional_odd_spacing" is used, the tessellation level
    is clamped to the range [1,<max>-1] and then rounded up to the nearest odd
    integer <n>.  If <n> is one, the edge will not be subdivided.  Otherwise,
    the corresponding edge will be divided into <n>-2 segments of equal
    length, and two additional segments of equal length that are typically
    shorter than the other segments.  The length of the two additional
    segments relative to the others will decrease monotonically with the value
    of <n>-<f>, where <f> is the clamped floating-point tessellation level.
    When <n>-<f> is zero, the additional segments will have equal length to
    the other segments.  As <n>-<f> approaches 2.0, the relative length of the
    additional segments approaches zero.  The two additional segments should
    be placed symmetrically on opposite sides of the subdivided edge.  The
    relative location of these two segments is undefined, but must be
    identical for any pair of subdivided edges with identical values of <f>.

    When the tessellation primitive generator produces triangles (in the
    "triangles" or "quads" modes), the orientation of all triangles can be
    specified by an input layout declaration in the tessellation evaluation
    shader using the identifiers "cw" and "ccw".  If the order is "cw", the
    vertices of all generated triangles will have a clockwise ordering in
    (u,v) or (u,v,w) space, as illustrated in Figure X.1.  If the order is
    "ccw", the vertices will be specified in counter-clockwise order.  If no
    layout is specified, "ccw" will be used.

    For all primitive modes, the tessellation primitive generator is capable
    of generating points instead of lines or triangles.  If an input layout
    declaration in the tessellation evaluation shader specifies the identifier
    "point_mode", the primitive generator will generate one point for each
    distinct vertex produced by tessellation.  Otherwise, the primitive
    generator will produce a collection of line segments or triangles
    according to the primitive mode.  When tessellating triangles or quads in
    point mode with fractional odd spacing, the tessellation primitive
    generator may produce "interior" vertices that are positioned on the edge
    of the patch if an inner tessellation level is less than or equal to one.
    Such vertices are considered distinct from vertices produced by
    subdividing the outer edge of the patch, even if there are pairs of
    vertices with identical coordinates.

    The points, lines, or triangles produced by the tessellation primitive
    generator are passed to subsequent pipeline stages in an
    implementation-dependent order.


    Section 2.X.2.1, Triangle Tessellation

    If the tessellation primitive mode is "triangles", an equilateral triangle
    is subdivided into a collection of triangles covering the area of the
    original triangle.  First, the original triangle is subdivided into a
    collection of concentric equilateral triangles.  The edges of each of
    these triangles are subdivided, and the area between each triangle pair is
    filled by triangles produced by joining the vertices on the subdivided
    edges.  The number of concentric triangles and the number of subdivisions
    along each triangle except the outermost is derived from the first inner
    tessellation level.  The edges of the outermost triangle are subdivided
    independently, using the first, second, and third outer tessellation
    levels to control the number of subdivisions of the u==0 (left), v==0
    (bottom), and w==0 (right) edges, respectively.  The second inner
    tessellation level and the fourth outer tessellation level have no effect
    in this mode.

    If the first inner tessellation level and all three outer tessellation
    levels are exactly one after clamping and rounding, only a single triangle
    with (u,v,w) coordinates of (0,0,1), (1,0,0), and (0,1,0) is generated.
    If the inner tessellation level is one and any of the outer tessellation
    levels is greater than one, the inner tessellation level is treated as
    though it were originally specified as 1+epsilon and will result in a two-
    or three-segment subdivision depending on the tessellation spacing.  When
    used with fractional odd spacing, the three-segment subdivision may
    produce "inner" vertices positioned on the edge of the triangle.

    If any tessellation level is greater than one, tessellation begins by
    producing a set of concentric inner triangles and subdividing their edges.
    First, the three outer edges are temporarily subdivided using the clamped
    and rounded first inner tessellation level and the specified tessellation
    spacing, generating <n> segments.  For the outermost inner triangle, the
    inner triangle is degenerate -- a single point at the center of the
    triangle -- if <n> is two.  Otherwise, for each corner of the outer
    triangle, an inner triangle corner is produced at the intersection of two
    lines extended perpendicular to the corner's two adjacent edges running
    through the vertex of the subdivided outer edge nearest that corner.  If
    <n> is three, the edges of the inner triangle are not subdivided and is
    the final triangle in the set of concentric triangles.  Otherwise, each
    edge of the inner triangle is divided into <n>-2 segments, with the <n>-1
    vertices of this subdivision produced by intersecting the inner edge with
    lines perpendicular to the edge running through the <n>-1 innermost
    vertices of the subdivision of the outer edge.  Once the outermost inner
    triangle is subdivided, the previous subdivision process repeats itself,
    using the generated triangle as an outer triangle.  This subdivision
    process is illustrated in Figure X.2.

                                                   (0,1,0)
                                                      +
                                                     / \
                 (0,1,0)                            O. .O
                    +                              /  +  \
                   / \                            O. / \ .O
                  O. .O                          /  O. .O  \
                 /  +  \                        /  /  +  \  \
                O. / \ .O                      /  /  / \  \  \
               /  O. .O  \                    O. /  /   \  \ .O
              /  /  O  \  \                  /  O. /     \ .O  \
             O. /   .   \ .O                /  /  O-------O  \  \
            /  O----O----O  \              O. /   .       .   \ .O
           /   .    .    .   \            /  O----O-------O----O  \
          O----O----O----O----O          /   .    .       .    .   \
       (0,0,1)             (1,0,0)      O----O----O-------O----O----O
                                     (0,0,1)                     (1,0,0)
        
      Figure X.2, Inner Triangle Tessellation with inner tessellation levels
      of four and five (not to scale).  This figure depicts the vertices along
      the bottom edge of the concentric triangles.  The edges of inner
      triangles are subdivided by intersecting the edge with segments
      perpendicular to the edge passing through each inner vertex of the
      subdivided outer edge.

    Once all the concentric triangles are produced and their edges are
    subdivided, the area between each pair of adjacent inner triangles is
    filled completely with a set of non-overlapping triangles.  In this
    subdivision, two of the three vertices of each triangle are taken from
    adjacent vertices on a subdivided edge of one triangle; the third is one
    of the vertices on the corresponding edge of the other triangle.  If the
    innermost triangle is degenerate (i.e., a point), the triangle containing
    it is subdivided into six triangles by connecting each of the six vertices
    on that triangle with the center point.  If the innermost triangle is not
    degenerate, that triangle is added to the set of generated triangles
    as-is.

    After the area corresponding to any inner triangles is filled, the
    primitive generator generates triangles to cover area between the
    outermost triangle and the outermost inner triangle.  To do this, the
    temporary subdivision of the outer triangle edge above is discarded.
    Instead, the u==0, v==0, and w==0 edges are subdivided according to the
    first, second, and third outer tessellation levels, respectively, and the
    tessellation spacing.  The original subdivision of the first inner
    triangle is retained.  The area between the outer and first inner
    triangles is completely filled by non-overlapping triangles as described
    above.  If the first (and only) inner triangle is degenerate, a set of
    triangles is produced by connecting each vertex on the outer triangle
    edges with the center point.

    After all triangles are generated, each vertex in the subdivided triangle
    is assigned a barycentric (u,v,w) coordinate based on its location
    relative to the three vertices of the outer triangle.

    The algorithm used to subdivide the triangular domain in (u,v,w) space
    into individual triangles is implementation-dependent.  However, the set
    of triangles produced will completely cover the domain, and no portion of
    the domain will be covered by multiple triangles.  The order in which the
    generated triangles passed to subsequent pipeline stages and the order of
    the vertices in those triangles are both implementation-dependent.
    However, when depicted in a manner similar to Figure X.2, the order of the
    vertices in the generated triangles will be either all clockwise or all
    counter-clockwise, according to the vertex order layout declaration.


    Section 2.X.2.2, Quad Tessellation

    If the tessellation primitive mode is "quads", a rectangle is subdivided
    into a collection of triangles covering the area of the original
    rectangle.  First, the original rectangle is subdivided into a regular
    mesh of rectangles, where the number of rectangles along the u==0 and u==1
    (vertical) and v==0 and v==1 (horizontal) edges are derived from the first
    and second inner tessellation levels, respectively.  All rectangles,
    except those adjacent to one of the outer rectangle edges, are decomposed
    into triangle pairs.  The outermost rectangle edges are subdivided
    independently, using the first, second, third, and fourth outer
    tessellation levels to control the number of subdivisions of the u==0
    (left), v==0 (bottom), u==1 (right), and v==1 (top) edges, respectively.
    The area between the inner rectangles of the mesh and the outer rectangle
    edges are filled by triangles produced by joining the vertices on the
    subdivided outer edges to the vertices on the edge of the inner rectangle
    mesh.

    If both clamped inner tessellation levels and all four clamped outer
    tessellation levels are exactly one, only a single triangle pair covering
    the outer rectangle is generated.  Otherwise, if either clamped inner
    tessellation level is one, that tessellation level is treated as though it
    were originally specified as 1+epsilon and will result in a two- or
    three-segment subdivision depending on the tessellation spacing.  When
    used with fractional odd spacing, the three-segment subdivision may
    produce "inner" vertices positioned on the edge of the rectangle.

    If any tessellation level is greater than one, tessellation begins by
    subdividing the u==0 and u==1 edges of the outer rectangle into <m>
    segments using the clamped and rounded first inner tessellation level and
    the tessellation spacing.  The v==0 and v==1 edges are subdivided into <n>
    segments using using the second inner tessellation level.  Each vertex on
    the u==0 and v==0 edges are joined with the corresponding vertex on the
    u==1 and v==1 edges to produce a set of vertical and horizontal lines that
    divide the rectangle into a grid of smaller rectangles.  The primitive
    generator emits a pair of non-overlapping triangles covering each such
    rectangle not adjacent to an edge of the outer rectangle.  The boundary of
    the region covered by these triangles forms an inner rectangle, the edges
    of which are subdivided by the grid vertices that lie on the edge.  If
    either <m> or <n> is two, the inner rectangle is degenerate, and one or
    both of the rectangle's "edges" consist of a single point.  This
    subdivision is illustrated in Figure X.3.

                                     (0,1)                (1,1)
                                       +--+--+--+--+--+--+--+
                                       |  .  .  .  .  .  .  |
              (0,1)       (1,1)        |  .  .  .  .  .  .  |
                +--+--+--+--+          +..O--O--O--O--O--O..+
                |  .  .  .  |          |  |**|**|**|**|**|  |
                |  .  .  .  |          |  |**|**|**|**|**|  |
                +..O--O--O..+          +..O--+--+--+--+--O..+
                |  .  .  .  |          |  |**|**|**|**|**|  |
                |  .  .  .  |          |  |**|**|**|**|**|  |
                +--+--+--+--+          +..O--O--O--O--O--O..+
              (0,0)       (1,0)        |  .  .  .  .  .  .  |
                                       |  .  .  .  .  .  .  |
                                       +--+--+--+--+--+--+--+
                                     (0,0)                (1,0)

      Figure X.3, Inner Quad Tessellation with inner tessellation levels of
      (4,2) and (7,4).  The areas labeled with "*" on the right depict the 10
      inner rectangles, each of which will be subdivided into two triangles.
      The points labeled "O" depict vertices on the boundary of the inner
      rectangle, where the inner rectangle on the left side is degenerate (a
      single line segment).  The dotted lines (".") depict the horizontal and
      vertical edges connecting corresponding points on the outer rectangle
      edge.

    After the area corresponding to the inner rectangle is filled, the
    primitive generator must produce triangles to cover area between the inner
    and outer rectangles.  To do this, the subdivision of the outer rectangle
    edge above is discarded.  Instead, the u==0, v==0, u==1, and v==1 edges
    are subdivided according to the first, second, third, and fourth outer
    tessellation levels, respectively, and the tessellation spacing.  The
    original subdivision of the inner rectangle is retained.  The area between
    the outer and inner rectangles is completely filled by non-overlapping
    triangles.  Two of the three vertices of each triangle are adjacent
    vertices on a subdivided edge of one rectangle; the third is one of the
    vertices on the corresponding edge of the other triangle.  If either edge
    of the innermost rectangle is degenerate, the area near the corresponding
    outer edges is filled by connecting each vertex on the outer edge with the
    single vertex making up the inner "edge".

    The algorithm used to subdivide the rectangular domain in (u,v) space into
    individual triangles is implementation-dependent.  However, the set of
    triangles produced will completely cover the domain, and no portion of the
    domain will be covered by multiple triangles.  The order in which the
    generated triangles passed to subsequent pipeline stages and the order of
    the vertices in those triangles are both implementation-dependent.
    However, when depicted in a manner similar to Figure X.3, the order of the
    vertices in the generated triangles will be either all clockwise or all
    counter-clockwise, according to the vertex order layout declaration.


    Isoline Tessellation

    If the tessellation primitive mode is "isolines", a set of independent
    horizontal line segments is drawn.  The segments are arranged into
    connected strips called "isolines", where the vertices of each isoline
    have a constant v coordinate and u coordinates covering the full range
    [0,1].  The number of isolines generated is derived from the first outer
    tessellation level; the number of segments in each isoline is derived from
    the second outer tessellation level.  Both inner tessellation levels and
    the third and fourth outer tessellation levels have no effect in this
    mode.

    As with quad tessellation above, isoline tessellation begins with a
    rectangle.  The u==0 and u==1 edges of the rectangle are subdivided
    according to the first outer tessellation level.  For the purposes of this
    subdivision, the tessellation spacing mode is ignored and treated as
    equal_spacing.  An isoline is drawn connecting each vertex on the u==0
    rectangle edge to the corresponding vertex on the u==1 rectangle edge,
    except that no line is drawn between (0,1) and (1,1).  If the number of
    isolines on the subdivided u==0 and u==1 edges is <n>, this process will
    result in <n> equally spaced lines with constant v coordinates of 0,
    1/<n>, 2/<n>, ..., and (<n>-1)/<n>.

    Each of the <n> isolines is then subdivided according to the second outer
    tessellation level and the tessellation spacing, resulting in <m> line
    segments.  Each segment of each line is emitted by the tessellation
    primitive generator, as illustrated in Figure X.4.

       (0,1)                   (1,1)
         +                       +          (0,1)             (1,1)
                                              +                 +
         O---O---O---O---O---O---O

         O---O---O---O---O---O---O

         O---O---O---O---O---O---O
                                              O-----O-----O-----O
         O---O---O---O---O---O---O          (0,0)             (1,0)
       (0,0)                   (1,0)

      Figure X.4, Isoline Tessellation with the first two outer tessellation
      levels of (4,6) and (1,3), respectively.  The lines connecting the
      vertices labeled "O" are emitted by the primitive generator.  The
      vertices labeled "+" correspond to (u,v) coordinates of (0,1) and (1,1),
      where no line segments are generated.

    The order in which the generated line segments are passed to subsequent
    pipeline stages and the order of the vertices in each generated line
    segment are both implementation-dependent.


    Section 2.X.3, Tessellation Evaluation Shaders

    If active, the tessellation evaluation shader takes the (u,v) or (u,v,w)
    location of each vertex in the primitive subdivided by the tessellation
    primitive generator, and generates a vertex with a position and associated
    attributes.  The tessellation evaluation shader can read any of the
    vertices of its input patch, which is the output patch produced by the
    tessellation control shader (if present) or provided by the application
    and transformed by the vertex shader (if no control shader is used).
    Evaluating the bivariate polynomials described in Section 5.1 (Evaluators)
    using the vertices of the provided patch as control points is one example
    of the type of computations that a tessellation evaluation shader might be
    expected to perform.  Tessellation evaluation shaders are created as
    described in section 2.14.1, using a <type> of TESS_EVALUATION_SHADER.

    Each invocation of the tessellation evaluation shader writes the
    attributes of exactly one vertex.  The number of vertices evaluated per
    patch depends on the tessellation level values computed by the
    tessellation control shaders (if present) or specified as patch
    parameters.  Tessellation evaluation shader invocations run independently,
    and no invocation can access the variables belonging to another
    invocation.  All invocations are capable of accessing all the vertices of
    their corresponding input patch.

    If a tessellation control shader is present, the number of the vertices in
    the input patch is fixed and is equal to the tessellation control shader
    output patch size parameter in effect when the program was last linked.
    If no tessellation control shader is present, the input patch is provided
    by the application can have a variable number of vertices, as specified by
    the PatchParameteri function.


    Section 2.X.3.1, Tessellation Evaluation Shader Variables

    Tessellation evaluation 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 tessellation
    evaluation shader is specified by the value of the
    implementation-dependent constant MAX_TESS_EVALUATION_UNIFORM_COMPONENTS.
    The total amount of combined storage available for uniform variables in
    all uniform blocks accessed by a tessellation evaluation shader (including
    the default uniform block) is specified by the value of the
    implementation-dependent constant
    MAX_COMBINED_TESS_EVALUATION_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 tessellation evaluation
    shader.  A link error is generated if an attempt is made to utilize more
    than the space available for tessellation evaluation shader uniform
    variables.  Uniforms are manipulated as described in section 2.14.4.
    Tessellation evaluation shaders also have access to samplers to perform
    texturing operations, as described in sections 2.14.5.

    Tessellation evaluation shaders can access the transformed attributes of
    all vertices for their input primitive using input variables.  If active,
    a tessellation control shader writing to output variables generates the
    values of these input varying variables, including values for built-in as
    well as user-defined varying variables.  If no tessellation control shader
    is active, input variables will be obtained from vertex shader outputs.
    Values for any varying variables that are not written by a vertex or
    tessellation control shader are undefined.

    Additionally, tessellation evaluation shaders can write to one or more
    built-in or user-defined output variables that will be passed to
    subsequent programmable shader stages or fixed functionality vertex
    pipeline stages.


    Section 2.X.3.2, Tessellation Evaluation Shader Execution Environment

    If a successfully linked program object that contains a tessellation
    evaluation shader is made current by calling UseProgram, the executable
    version of the tessellation evaluation shader is used to process vertices
    produced by the tessellation primitive generator.  During this processing,
    the shader may access the input patch processed by the primitive
    generator.  When tessellation evaluation shader execution completes, a new
    vertex is assembled from the output variables written by the shader and is
    passed to subsequent pipeline stages.

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

    Texture Access

    The Shader-Only Texturing subsection of section 2.14.7 describes texture
    lookup functionality accessible to a vertex shader.  The texel fetch and
    texture size query functionality described there also applies to
    tessellation evaluation shaders.

    Tessellation Evaluation Shader Inputs

    Section 7.1 of the OpenGL Shading Language Specification describes the
    built-in variable array gl_in[] available as input to a tessellation
    evaluation shader.  gl_in[] receives values from equivalent built-in
    output variables written by a previous shader (section 2.14.7).  If a
    tessellation control shader active, the values of gl_in[] will be taken
    from tessellation control shader outputs.  Otherwise, they will be taken
    from vertex shader outputs.  Each array element of gl_in[] is a structure
    holding values for a specific vertex of the input patch.  The length of
    gl_in[] is equal to the implementation-dependent maximum patch size
    (gl_MaxPatchVertices).  Behavior is undefined if gl_in[] is indexed with a
    vertex index greater than or equal to the current patch size.  The members
    of each element of the gl_in[] array are gl_Position, gl_PointSize,
    gl_ClipDistance[], gl_ClipVertex, gl_FrontColor, gl_BackColor,
    gl_FrontSecondaryColor, gl_BackSecondaryColor, gl_TexCoord[], and
    gl_FogFragCoord[].

    Tessellation evaluation shaders have available several other special input
    variables not replicated per-vertex and not contained in gl_in[],
    including:

      * The variables gl_PatchVerticesIn and gl_PrimitiveID are filled with
        the number of the vertices in the input patch and a primitive number,
        respectively.  They behave exactly as the identically named inputs for
        tessellation control shaders.

      * The variable gl_TessCoord is a three-component floating-point vector
        consisting of the (u,v,w) coordinate of the vertex being processed by
        the tessellation evaluation shader.  The values of u, v, and w are in
        the range [0,1], and vary linearly across the primitive being
        subdivided.  For tessellation primitive modes of "quads" or
        "isolines", the w value is always zero.  The (u,v,w) coordinates are
        generated by the tessellation primitive generator in a manner
        dependent on the primitive mode, as described in section 2.X.2.
        gl_TessCoord is not an array; it specifies the location of the vertex
        being processed by the tessellation evaluation shader, not of any
        vertex in the input patch.

      * The variables gl_TessLevelOuter[] and gl_TessLevelInner[] are arrays
        holding outer and inner tessellation levels of the patch, as used by
        the tessellation primitive generator.  If a tessellation control
        shader is active, the tessellation levels will be taken from the
        corresponding outputs of the tessellation control shader.  Otherwise,
        the default levels provided as patch parameters are used.
        Tessellation level values loaded in these variables will be prior to
        the clamping and rounding operations performed by the primitive
        generator as described in Section 2.X.2.  For triangular tessellation,
        gl_TessLevelOuter[3] and gl_TessLevelInner[1] will be undefined.  For
        isoline tessellation, gl_TessLevelOuter[2], gl_TessLevelOuter[3], and
        both values in gl_TessLevelInner[] are undefined.

    A tessellation evaluation shader may also declare user-defined per-vertex
    input variables.  User-defined per-vertex input variables are declared
    with the qualifier "in" and have a value for each vertex in the input
    patch.  User-defined per-vertex input varying variables have a value for
    each vertex and thus need to be declared as arrays or inside input blocks
    declared as arrays.  Declaring an array size is optional.  If no size is
    specified, it will be taken from the implementation-dependent maximum
    patch size (gl_MaxPatchVertices).  If a size is specified, it must match
    the maximum patch size; otherwise, a compile or link error will occur.  Since the
    array size may be larger than the number of vertices found in the input
    patch, behavior is undefined if a per-vertex input variable is accessed
    using an index greater than or equal to the number of vertices in the
    input patch.  The OpenGL Shading Language doesn't support
    multi-dimensional arrays; therefore, user-defined tessellation evaluation
    shader inputs corresponding to vertex shader outputs declared as arrays
    must be declared as array members of an input block that is itself
    declared as an array.

    Additionally, a tessellation evaluation shader may declare per-patch input
    variables using the qualifier "patch in".  Unlike per-vertex inputs,
    per-patch inputs do not correspond to any specific vertex in the patch,
    and are not indexed by vertex number.  Per-patch inputs declared as arrays
    have multiple values for the input patch; similarly declared per-vertex
    inputs would indicate a single value for each vertex in the output patch.
    User-defined per-patch input variables are filled with corresponding
    per-patch output values written by the tessellation control shader.  If no
    tessellation control shader is active, all such variables are undefined.

    (Note:  minor restructuring in the following paragraph relative to the
    equivalent geometry shader language.)

    Similarly to the limit on vertex shader output components (see section
    2.14.6), there is a limit on the number of components of built-in and
    user-defined per-vertex and per-patch input variables that can be read by
    the tessellation evaluation shader, given by the values of the
    implementation-dependent constants MAX_TESS_EVALUATION_INPUT_COMPONENTS
    and MAX_TESS_PATCH_COMPONENTS, respectively.  The built-in inputs
    gl_TessLevelOuter[] and gl_TessLevelInner[] are not counted against the
    per-patch limit.  When a program is linked, all components of any varying
    and special variable read by a tessellation evaluation shader will count
    against this limit.  A program whose tessellation evaluation shader
    exceeds this limit may fail to link, unless device-dependent optimizations
    are able to make the program fit within available hardware resources.


    Tessellation Evaluation Shader Outputs

    Tessellation evaluation shaders have a number of built-in output variables
    used to pass values to equivalent built-in input variables read by
    subsequent shader stages or to subsequent fixed functionality vertex
    processing pipeline stages.  These variables are gl_Position,
    gl_PointSize, gl_ClipDistance[], gl_ClipVertex, gl_FrontColor,
    gl_BackColor, gl_FrontSecondaryColor, gl_BackSecondaryColor,
    gl_TexCoord[], and gl_FogFragCoord[], and all behave identically to
    equivalently named vertex shader outputs (section 2.14.7).  A tessellation
    evaluation shader may also declare user-defined per-vertex output
    variables.

    (Note:  minor restructuring in the following paragraph relative to the
    equivalent geometry shader language.)

    Similarly to the limit on vertex shader output components (see section
    2.14.6), there is a limit on the number of components of built-in and
    user-defined output variables that can be written by the tessellation
    evaluation shader, given by the values of the implementation-dependent
    constant MAX_TESS_EVALUATION_OUTPUT_COMPONENTS.  When a program is linked,
    all components of any varying and special variable written by a
    tessellation evaluation shader will count against this limit.  A program
    whose tessellation evaluation shader exceeds this limit may fail to link,
    unless device-dependent optimizations are able to make the program fit
    within available hardware resources.


    Modify Section 2.19, Transform Feedback, p. 130

    (modify fourth paragraph, p. 131) When transform feedback is active, all
    geometric primitives generated must be compatible with the value of
    <primitiveMode> ...  If a tessellation evaluation or geometry shader is
    active, the type of primitive emitted by that shader is used instead of
    the <mode> parameter passed to drawing commands.  If tessellation
    evaluation and geometry shaders are both active, the output primitive type
    of the geometry shader will be used for the purposes of this error.


Additions to Chapter 3 of the OpenGL 3.2 (Compatibility Profile) Specification (Rasterization)

    None.


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

    None.


Additions to Chapter 5 of the OpenGL 3.2 (Compatibility Profile) Specification (Special Functions)

    None.


Additions to Chapter 6 of the OpenGL 3.2 (Compatibility Profile) Specification (State and State
Requests)

    Modify Section 6.1.16, Shader and Program Queries, p. 384

    (modify second paragraph, p. 385) If <pname> is SHADER TYPE, VERTEX
    SHADER, TESS_CONTROL_SHADER, TESS_EVALUATION_SHADER, GEOMETRY_SHADER, or
    FRAGMENT_SHADER is returned if <shader> is a vertex, tessellation control,
    tessellation evaluation, geometry, or fragment shader, respectively.  ...

    (modify the next-to-last paragraph, p. 385) The command

      void GetProgramiv(uint program, enum pname, int *params);

    returns integer-valued properties of the program object...

    (add two paragraphs after the first paragraph, p. 385) 

    If <pname> is TESS_CONTROL_OUTPUT_VERTICES, the number of vertices in the
    tessellation control shader output patch is returned.  If
    TESS_CONTROL_OUTPUT_VERTICES is queried for a program which has not been
    linked successfully, or which does not contain objects to form a
    tessellation control shader, then an INVALID_OPERATION error is generated.

    If <pname> is TESS_GEN_MODE, QUADS, TRIANGLES, or ISOLINES is returned,
    depending on the primitive mode declaration in the tessellation evaluation
    shader.  If <pname> is TESS_GEN_SPACING, EQUAL, FRACTIONAL_EVEN, or
    FRACTIONAL_ODD is returned, depending on the spacing declaration in the
    tessellation evaluation shader.  If <pname> is TESS_GEN_VERTEX_ORDER, CCW
    or CW is returned, depending on the vertex order declaration in the
    tessellation evaluation shader.  If <pname> is TESS_GEN_POINT_MODE, TRUE
    is returned if point mode is enabled in a tessellation evaluation shader
    declaration; FALSE is returned otherwise.  If any of the <pname> values in
    this paragraph are queried for a program which has not been linked
    successfully, or which does not contain objects to form a tessellation
    evaluation shader, then an INVALID_OPERATION error is generated.


Additions to Appendix A of the OpenGL 3.2 (Compatibility Profile) Specification (Invariance)

    Insert new section before Section A.4, What this All Means (p. 457)

    Section A.X, Tessellation Invariance

    When using a program containing tessellation evaluation shaders, the
    fixed-function tessellation primitive generator consumes the input patch
    specified by an application and emits a new set of primitives.  The
    following invariance rules are intended to provide repeatability
    guarantees.  Additionally, they are intended to allow an application with
    a carefully crafted tessellation evaluation shader to ensure that the sets
    of triangles generated for two adjacent patches have identical vertices
    along shared patch edges, avoiding "cracks" caused by minor differences in
    the positions of vertices along shared edges.

    Rule 1:  When processing two patches with identical outer and inner
    tessellation levels, the tessellation primitive generator will emit an
    identical set of point, line, or triangle primitives as long as the active
    program used to process the patch primitives has tessellation evaluation
    shaders specifying the same tessellation mode, spacing, vertex order, and
    point mode input layout qualifiers.  Two sets of primitives are considered
    identical if and only if they contain the same number and type of
    primitives and the generated tessellation coordinates for the vertex
    numbered <m> of the primitive numbered <n> are identical for all values of
    <m> and <n>.

    Rule 2:  The set of vertices generated along the outer edge of the
    subdivided primitive in triangle and quad tessellation, and the
    tessellation coordinates of each, depends only on the corresponding outer
    tessellation level and the spacing input layout qualifier in the
    tessellation evaluation shader of the active program.

    Rule 3:  The set of vertices generated when subdividing any outer
    primitive edge is always symmetric.  For triangle tessellation, if the
    subdivision generates a vertex with tessellation coordinates of the form
    (0,x,1-x), (x,0,1-x), or (x,1-x,0), it will also generate a vertex with
    coordinates of exactly (0,1-x,x), (1-x,0,x), or (1-x,x,0), respectively.
    For quad tessellation, if the subdivision generates a vertex with
    coordinates of (x,0) or (0,x), it will also generate a vertex with
    coordinates of exactly (1-x,0) or (0,1-x), respectively.  For isoline
    tessellation, if it generates vertices at (0,x) and (1,x) where <x> is
    not zero, it will also generate vertices at exactly (0,1-x) and (1,1-x),
    respectively.

    Rule 4:  The set of vertices generated when subdividing outer edges in
    triangular and quad tessellation must be independent of the specific edge
    subdivided, given identical outer tessellation levels and spacing.  For
    example, if vertices at (x,1-x,0) and (1-x,x,0) are generated when
    subdividing the w==0 edge in triangular tessellation, vertices must be
    generated at (x,0,1-x) and (1-x,0,x) when subdividing an otherwise
    identical v==0 edge.  For quad tessellation, if vertices at (x,0) and
    (1-x,0) are generated when subdividing the v==0 edge, vertices must be
    generated at (0,x) and (0,1-x) when subdividing an otherwise identical
    u==0 edge.

    Rule 5:  When processing two patches that are identical in all respects
    enumerated in rule 1 except for vertex order, the set of triangles
    generated for triangle and quad tessellation must be identical except for
    vertex and triangle order.  For each triangle <n1> produced by processing
    the first patch, there must be a triangle <n2> produced when processing
    the second patch each of whose vertices has the same tessellation
    coordinates as one of the vertices in <n1>.

    Rule 6:  When processing two patches that are identical in all respects
    enumerated in rule 1 other than matching outer tessellation levels and/or
    vertex order, the set of interior triangles generated for triangle and
    quad tessellation must be identical in all respects except for vertex and
    triangle order.  For each interior triangle <n1> produced by processing
    the first patch, there must be a triangle <n2> produced when processing
    the second patch each of whose vertices has the same tessellation
    coordinates as one of the vertices in <n1>.  A triangle produced by the
    tessellator is considered an interior triangle if none of its vertices lie
    on an outer edge of the subdivided primitive.

    Rule 7:  For quad and triangle tessellation, the set of triangles
    connecting an inner and outer edge depends only on the inner and outer
    tessellation levels corresponding to that edge and the spacing input
    layout qualifier.

    Rule 8:  The value of all defined components of gl_TessCoord will be in
    the range [0,1].  Additionally, for any defined component <x> of
    gl_TessCoord, the results of computing (1.0-<x>) in a tessellation
    evaluation shader will be exact.  Some floating-point values in the range
    [0,1] may fail to satisfy this property, but such values may never be used
    as tessellation coordinate components.


Additions to the AGL/GLX/WGL Specifications

    None.


Additions to the OpenGL Shading Language Specification, version 1.50 (Revision
09)

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

      #extension GL_ARB_tessellation_shader : <behavior>

    where <behavior> is as specified in section 3.3.

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

      #define GL_ARB_tessellation_shader 1


    Modify Chapter 2, Overview of OpenGL Shading, p. 5

    (modify first two introductory paragraphs)

    The OpenGL Shading Language is actually several closely related languages.
    These languages are used to create shaders for the programmable processors
    contained in the OpenGL processing pipeline.  Currently, these processors
    are the vertex, tessellation control, tessellation evaluation, geometry,
    and fragment processors.

    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, tessellation control, tessellation
    evalution, geometry, or fragment.

    (Insert two new sections after Section 2.1, Vertex Processor, p. 5.)


    Section 2.X, Tessellation Control Processor

    The tessellation control processor is a programmable unit that operates on
    a patch of incoming vertices and their associated data, emitting a new
    output patch.  Compilation units written in the OpenGL Shading Language to
    run on this processor are called tessellation control shaders.  When a
    complete set of tessellation control shaders are compiled and linked, they
    result in a tessellation control shader executable that runs on the
    tessellation control processor.

    The tessellation control processor spawns a separate shader invocation for
    each vertex of the output patch.  Each invocation can read the attributes
    of any vertex in the input or output patches, but can only write
    per-vertex attributes for the corresponding output patch vertex.  The
    shader invocations collectively produce a set of per-patch attributes for
    the output patch.  After all tessellation control shader invocations have
    completed, the output vertices and per-patch attributes are assembled to
    form a patch to be used by subsequent pipeline stages.

    Tessellation control shader invocations run mostly independently, with
    undefined relative execution order.  However, the built-in function
    barrier() can be used to control execution order by synchronizing
    invocations, effectively dividing tessellation control shader execution
    into a set of phases.  Tessellation control shaders will get undefined
    results if one invocation reads a per-vertex or per-patch attribute
    written by another invocation at any point during the same phase, or if
    two invocations attempt to write different values to the same per-patch
    output in a single phase.


    Section 2.Y, Tessellation Evaluation Processor

    The tessellation evaluation processor is a programmable unit that
    evaluates the position and other attributes of a vertex generated by the
    tessellation primitive generator, using a patch of incoming vertices and
    their associated data.  Compilation units written in the OpenGL Shading
    Language to run on this processor are called tessellation evaluation
    shaders.  When a complete set of tessellation evaluation shaders are
    compiled and linked, they result in a tessellation evaluation shader
    executable that runs on the tessellation evaluation processor.

    The tessellation evaluation processor operates to compute the position and
    attributes of a single vertex generated by the tessellation primitive
    generator.  The executable can read the attributes of any vertex in the
    input patch, plus the tessellation coordinate, which is the relative
    location of the vertex in the primitive being tessellated.  The executable
    writes the position and other attributes of the vertex.


    Modify Section 3.6, Keywords, p. 14

    (add the following to the keyword list)

      patch


    Modify Section 4.2, Scoping, p. 27

    (remove "(vertex, geometry, or fragment)" from the last paragraph of p. 28)


    Modify Section 4.3, Storage Qualifiers, p. 29

    (add two new qualifiers to the first table, p. 29)

    Qualifier   Meaning
    ---------   -------------------------------------------------------------
    patch in    linkage of per-patch attributes into a shader from a previous
                stage (tessellation evaluation shaders only)

    patch out   linkage out of a shader to a subsequent stage (tessellation 
                control shaders only)


    Modify Section 4.3.4, Inputs, p. 31

    (modify second paragraph, p. 31) Shader input variables are declared with
    the "in", "centroid in", or "patch in" storage qualifiers.  They form the
    input interface between previous stages of the OpenGL pipeline and the
    declaring shader.  ...

    (modify third paragraph, p. 31) Vertex shader input variables (or
    attributes) ... It is an error to use "centroid in" or "patch in" in a
    vertex shader. ...

    (modify next-to-last paragraph, p. 31, and subsequent paragraphs, making
    geometry shader language apply to tessellation control and evaluation
    shaders as well)

    Tessellation control, evaluation, and geometry shader input variables get
    the per-vertex values written out to output variables of the same names in
    the previous active shader stage.  They are typically declared with the
    "in" or "centroid in" storage qualifier.  For these inputs, "centroid in"
    and interpolation qualifiers are allowed, but have no effect.  Since
    tessellation control, tessellation evaluation, and geometry shaders
    operate on a primitive comprising multiple vertices, each input varying
    variable (or input block, see interface blocks below) needs to be declared
    as an array. For example,

      in float foo[]; // input for previous-stage output "out float foo"

    Each element of such an array corresponds to one vertex of the primitive
    being processed. Each array can optionally have a size declared. The array
    size will be set by, (or if provided must be consistent with) the input
    layout declaration(s) establishing the type of input primitive, as
    described later in section 4.3.8.1 Input Layout Qualifiers.

    For the interface from a previous shader stage to a tessellation control,
    tessellation evaluation, or geometry shader, output variables from the
    previous stage must match input variables of the same name in type and
    qualification, except perhaps that the inputs must be declared as an array
    indexed by vertex number.  If any variables fail to match, a link error
    will occur.

    If the output of the previous shader is itself an array with multiple
    values per vertex, it must appear in an output block (see interface blocks
    below) in the previous shader and in an input block in the tessellation
    control, evaluation, or geometry shader with a block instance name
    declared as an array.  Use of blocks are required because two-dimensional
    arrays are not supported.

    Additionally, tessellation evaluation shaders support per-patch input
    variables declared with the "patch in" qualifier.  Per-patch input
    variables are filled with the values of per-patch output variables written
    by the tessellation control shader.  Per-patch inputs may be declared as
    one-dimensional arrays, but are not indexed by vertex number.  Input
    variables may not be declared using the "patch in" qualifier in
    tessellation control or geometry shaders.  As with other input variables,
    per-patch inputs must be declared using the same type and qualifiers as
    per-patch outputs from the previous (tessellation control) shader stage.

    (modify third paragraph, p. 32) Fragment shader ... deprecated "varying"
    and "centroid varying" modifiers.  It is an error to use "patch in" in a
    fragment shader. ...

    (modify last paragraph of the section) The fragment shader inputs form an
    interface with the last active shader in the vertex processing pipeline.
    For this interface, the prior stage shader output variables and fragment
    shader input variables of the same name must match in type and
    qualification (other than out matching to in).


    Modify Section 4.3.6, Outputs, p. 33

    (modify first paragraph of the section, p. 33) Shader output variables are
    declared with the "out", "centroid out", or "patch out" storage
    qualifiers. ...

    (modify third paragraph of the section, p. 33) Vertex, tessellation
    evaluation, and geometry shader output variables output per-vertex data
    ...  deprecated varying storage qualifier.  It is an error to use "patch
    out" in a vertex, tessellation evaluation, or geometry shader. ...

    (modify the fourth paragraph of the section, p. 33)  Individual vertex,
    tessellation evaluation, and geometry outputs are ...

    (insert prior to the last paragraph, p. 33)

    Tessellation control shader output variables may be used to output
    per-vertex and per-patch data.  Per-vertex output variables are declared
    using the "out" or "centroid out" storage qualifiers; per-patch output
    variables are declared using the "patch out" storage qualifier.
    Per-vertex and per-patch output variables can only be float,
    floating-point vectors, matrices, signed or unsigned integers or integer
    vectors, or arrays or structures of any these.  Since tessellation control
    shaders produce a primitive comprising multiple vertices, each per-vertex
    output variable (or output block, see interface blocks below) needs to be
    declared as an array. For example,

      out float foo[]; // feeds next-stage input "in float foo[]"

    Each element of such an array corresponds to one vertex of the primitive
    being produced.  Each array can optionally have a size declared.  The
    array size will be set by (or if provided must be consistent with) the
    output layout declaration(s) establishing the number of vertices in the
    output patch, as described later in section 4.3.8.2, Output Layout
    Qualifiers.

    If a per-vertex output of the tessellation control shader is itself an
    array with multiple values per vertex, it must appear in an output block
    (see interface blocks below) in the tessellation control shader with a
    block instance name declared as an array.  Use of blocks are required
    because two-dimensional arrays are not supported.

    Each tessellation control shader invocation has a corresponding output
    patch vertex, and may assign values to per-vertex outputs only if they
    belong to that corresponding vertex.  If a per-vertex output variable is
    used as an l-value, it is an error if the expression indicating the vertex
    number is not the identifier "gl_InvocationID".

    The order of execution of a tessellation control shader invocation
    relative to the other invocations for the same input patch is undefined
    unless the built-in function barrier() is used.  This provides some
    control over relative execution order.  When a shader invocation calls the
    barrier() function, its execution pauses until all other invocations have
    called the same function.  Output variable assignments performed by any
    invocation executed prior to calling barrier() will be visible to any
    other invocation after the call to barrier() returns.

    Because tessellation control shader invocations may execute in undefined
    order between barriers, the values of per-vertex or per-patch output
    variables will sometimes be undefined.  If the beginning and end of shader
    execution and each call to barrier() are considered synchronization
    points, the value of an output variable will be undefined in any of the
    three following cases:

      (1) at the beginning of execution;

      (2) at each synchronization point, unless:

          * the value was well-defined after the previous synchronization
            point and was not written by any invocation since;

          * the value was written by exactly one shader invocation since the
            previous synchronization point; or

          * the value was written by multiple shader invocations since the
            previous synchronization point, and the last write performed by
            all such invocations wrote the same value; or

      (3) when read by a shader invocation, if:

          * the value was undefined at the previous synchronization point and
            has not been writen by the same shader invocation since; or

          * the output variable is written to by any other shader invocation
            between the previous and next synchronization points, even if that
            assignment occurs in code following the read.

    If the value of an output variable is undefined at the end of shader
    execution, the value passed to subsequent pipeline stages will be likewise
    undefined.


    (modify last paragraph, p. 33) Fragment outputs ... "out" storage
    qualifier.  It is an error to use "centroid out" or "patch out" in a
    fragment shader. ...


    Modify Section 4.3.8.1, Input Layout Qualifiers, p. 37

    (modify first paragraph of the section) Vertex and tessellation control
    shaders do not have any input layout qualifiers.

    (insert after first paragraph of the section)
    
    Tessellation evaluation shaders allow input layout qualifiers only on the
    interface qualifier in, not on an input block, block member, or variable
    declarations.  The input layout qualifier identifiers allowed for
    tessellation evaluation shaders are:

      layout-qualifier-id
        triangles
        quads
        isolines
        equal_spacing
        fractional_even_spacing
        fractional_odd_spacing
        cw
        ccw
        point_mode

    One group of identifiers is used to specify a tessellation primitive mode
    to be used by the tessellation primitive generator.  To specify a
    primitive mode, the identifier must be one of "triangles", "quads", or
    "isolines", which specify that the tessellation primitive generator should
    subdivide a triangle into smaller triangles, a quad into triangles, or a
    quad into a collection of lines, respectively.

    A second group of identifiers is used to specify the vertex spacing used
    by the tessellation primitive generator when subdividing an edge.  To
    specify vertex spacing, the identifier must be one of:

      * "equal_spacing", signifying that edges should be divided into a
         collection of <N> equal-sized segments;

      * "fractional_even_spacing", signifying that edges should be divided
        into an even number of equal-length segments plus two additional
        shorter "fractional" segments; or

      * "fractional_odd_spacing", signifying that edges should be divided into
        an odd number of equal-length segments plus two additional shorter
        "fractional" segments.

    A third group of identifiers specifies whether the tessellation primitive
    generator produces triangles in clockwise or counter-clockwise order,
    according to the coordinate system depicted in the OpenGL specification.
    The identifiers "cw" and "ccw" indicate clockwise and counter-clockwise
    triangles, respectively.  If the tessellation primitive generator does not
    produce triangles, the order is ignored.

    The identifier "point_mode" specifies that the tessellation primitive
    generator should produce one point for each distinct vertex in the
    subdivided primitive, rather than generating lines or triangles.

    Any or all of these identifiers may be specified one or more times in a
    single input layout declaration.

    At least one tessellation evaluation shader (compilation unit) in a
    program must declare a primitive mode in its input layout; declarations
    spacing, vertex order, and point mode qualifiers are optional.  It is not
    required that all tessellation evaluation shaders in a program declare a
    primitive mode.  If spacing or vertex order declarations are omitted, the
    tessellation primitive generator will use equal spacing or
    counter-clockwise vertex ordering, respectively.  If a point mode
    declaration is omitted, the tessellation primitive generator will produce
    lines or triangles according to the primitive mode.  If primitive mode,
    spacing, or vertex order is declared more than once in the tessellation
    evaluation shaders of a program, all such declarations must use the same
    identifier.

    (modify third paragraph, p. 38)  All unsized tessellation control and
    evaluation shader input array declations will be sized to match the
    implementation-dependent maximum patch size (gl_MaxPatchVertices).  All
    unsized geometry shader input declarations ...

    (modify fourth paragraph, p. 38) The intrinsically declared input array
    gl_in[] will also be sized according to the maximum patch size or a
    geometry shader input layout declaration.  Hence, the expression

      gl_in.length()

    will return the maximum patch size or a value from the table above.


    Modify Section 4.3.8.2, Output Layout Qualifiers, p. 40

    (modify first paragraph, p. 40) Vertex, tessellation evaluation, and
    fragment shaders cannot have output layout qualifiers.

    (insert after first paragraph of the section)
    
    Tessellation control shaders allow output layout qualifiers only on the
    interface qualifier out, not on an output block, block member, or variable
    declarations.  The output layout qualifier identifiers allowed for
    tessellation control shaders are:

      layout-qualifier-id
        vertices = integer-constant

    The identifier "vertices" specifies the number of vertices in the output
    patch produced by the tessellation control shader, which also specifies
    the number of times the tessellation control shader is invoked.  It is an
    error for the output vertex count to be less than or equal to zero, or
    greater than the implementation-dependent maximum patch size.

    The intrinsically declared tessellation control output array gl_out[] will
    also be sized by any output layout declaration. Hence, the expression

      gl_out.length()

    will return the output patch vertex count specified in a previous output
    layout qualifier.  For outputs declared without an array size, including
    intrinsically declared outputs (i.e., gl_out), a layout must be declared
    before any use of the method length() or other array use that requires its
    size to be known.

    It is a compile-time error if the output patch vertex count specified in
    an output layout qualifier does not match the array size specified in any
    output variable declaration in the same shader.

    All tessellation control shader layout declarations in a program must
    specify the same output patch vertex count.  There must be at least one
    layout qualifier specifying an output patch vertex count in any program
    containing tessellation control shaders; however, such a declaration is
    not required in all tessellation control shader compilation units.
    

    (Coalesce Sections 7.1., 7.2, and 7.6 into a single section, as described
     below.)

    Section 7.1, Built-In Shader Special Inputs and Outputs

    Some OpenGL operations occur in fixed functionality and need to provide
    values to or receive values from shader executables.  Shaders communicate
    with fixed-function OpenGL pipeline stages, and optionally with other
    shaders, through the use of built-in input and output variables.


    In the vertex language, built-in input and output variables are
    intrinsically declared as:

      in int gl_VertexID;
      in int gl_InstanceID;

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      };

    The variable gl_VertexID is a vertex shader input variable that holds an
    integer index for the vertex, as defined under Shader Inputs in section
    2.11.7 in the OpenGL Graphics System Specification. While the variable
    gl_VertexID is always present, its value is not always defined.

    The variable gl_InstanceID is a vertex shader input variable that holds
    the integer index of the current primitive in an instanced draw call (see
    Shader Inputs in section 2.11.7 in the OpenGL Graphics System
    Specification). If the current primitive does not come from an instanced
    draw call, the value of gl_InstanceID is zero.

    The variable gl_Position is intended for writing the homogeneous vertex
    position. It can be written at any time during shader execution. This
    value will be used by primitive assembly, clipping, culling, and other
    fixed functionality operations, if present, that operate on primitives
    after vertex processing has occurred.  Its value is undefined after the
    vertex processing stage if the vertex shader executable does not write
    gl_Position, and it is undefined after geometry processing if the geometry
    executable calls EmitVertex() without having written gl_Position since the
    last EmitVertex() (or hasn't written it at all).

    The variable gl_PointSize is intended for a shader to write the size of
    the point to be rasterized. It is measured in pixels. If gl_PointSize is
    not written to, its value is undefined in subsequent pipe stages.

    (note:  Changed the wording of this a bit from 1.50, to remove the mention
     of maintaining clip planes and computing distances, which isn't required
     to use the feature.  Also tweaked a reference to gl_MaxVaryingComponents
     in the following paragraph.)

    The variable gl_ClipDistance provides the forward compatible mechanism for
    controlling user clipping.  gl_ClipDistance[i] specifies a clip distance
    for each plane i. A distance of 0 means the vertex is on the plane, a
    positive distance means the vertex is inside the clip plane, and a
    negative distance means the point is outside the clip plane. The clip
    distances will be linearly interpolated across the primitive and the
    portion of the primitive with interpolated distances less than 0 will be
    clipped.

    The gl_ClipDistance array is predeclared as unsized and must be sized by
    the shader either redeclaring it with a size or indexing it only with
    integral constant expressions. This needs to size the array to include all
    the clip planes that are enabled via the OpenGL API; if the size does not
    include all enabled planes, results are undefined. The size can be at most
    gl_MaxClipDistances. The number of input or output components consumed by
    gl_ClipDistance will match the size of the array, no matter how many
    planes are enabled. The shader must also set all values in gl_ClipDistance
    that have been enabled via the OpenGL API, or results are
    undefined. Values written into gl_ClipDistance for planes that are not
    enabled have no effect.


    In the tessellation control language, built-in input and output variables
    are intrinsically declared as:

      in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_in[gl_MaxPatchVertices];
      in int gl_PatchVerticesIn;
      in int gl_PrimitiveID;
      in int gl_InvocationID;

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_out[gl_VerticesOut];

      patch out float gl_TessLevelOuter[4];
      patch out float gl_TessLevelInner[2];

    The input variables gl_Position, gl_PointSize, and gl_ClipDistance read
    corresponding outputs written by the vertex shader.  The output variables
    of the same names behave as described for the identical vertex shader
    outputs.

    The variable gl_PatchVerticesIn is available only in the tessellation
    control and evaluation languages.  It is an integer specifying the number
    of vertices in the input patch being processed by the shader.  A single
    tessellation control or evaluation shader can read patches of differening
    sizes, so the value of gl_PatchVerticesIn may differ between patches.

    The input variable gl_PrimitiveID is available only in the tessellation
    control, tessellation evaluation, and fragment languages.  For
    tessellation control and evaluation shaders, it is filled with the number
    of primitives processed by the shader since the current set of rendering
    primitives was started.  For fragment shaders, it is filled with the value
    written to the gl_PrimitiveID geometry shader output if a geometry shader
    is present.  Otherwise, it is assigned in the same manner as with
    tessellation control and evaluation shaders.

    The input variable gl_InvocationID is available only in the tessellation
    control and geometry language.  In the tessellation control shader, it
    identifies the number of the output patch vertex assigned to the
    tessellation control shader invocation.  In the geometry shader, it
    identifies the invocation number assigned to the geometry shader
    invocation.  In both cases, gl_InvocationID is assigned integer values in
    the range [0, <N>-1], where <N> is the number of output patch vertices or
    geometry shader invocations per primitive.

    The output variables gl_TessLevelOuter[] and gl_TessLevelInner[] are
    available only in the tessellation control language.  The values written
    to these variables are assigned to the corresponding outer and inner
    tessellation levels of the output patch.  They are used by the
    tessellation primitive generator to control primitive tessellation and may
    be read by tessellation evaluation shaders.


    In the tessellation evaluation language, built-in input and output
    variables are intrinsically declared as:

      in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_in[gl_MaxPatchVertices];
      in int gl_PatchVerticesIn;
      in int gl_PrimitiveID;
      in vec3 gl_TessCoord;
      patch in float gl_TessLevelOuter[4];
      patch in float gl_TessLevelInner[2];

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      };

    The input variables gl_Position, gl_PointSize, gl_ClipDistance read
    corresponding outputs written by the previous shader (vertex or
    tessellation control).  The output variables of the same names behave as
    described for the identical vertex shader outputs.

    The input variables gl_PatchVerticesIn and gl_PrimitiveID behave as in the
    identically-named tessellation control shader inputs.

    The variable gl_TessCoord is available only in the tessellation evaluation
    language.  It specifies a three-component (u,v,w) vector identifying the
    position of the vertex being processed by the shader relative to the
    primitive being tessellated.

    The input variables gl_TessLevelOuter[] and gl_TessLevelInner[] are
    available only in the tessellation evaluation shader.  If a tessellation
    control shader is active, these variables are filled with corresponding
    outputs written by the tessellation control shader.  Otherwise, they are
    assigned with default tessellation levels specified in the OpenGL API.


    In the geometry language, built-in input and output variables are
    intrinsically declared as:

      in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      } gl_in[];
      in int gl_PrimitiveIDIn;

      out gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[];
      };
      out int gl_PrimitiveID;
      out int gl_Layer;

    The input variables gl_Position, gl_PointSize, gl_ClipDistance read
    corresponding outputs written by the previous shader (vertex or
    tessellation control).  The output variables of the same names behave as
    described for the identical vertex shader outputs.

    The input variable gl_PrimitiveIDIn behaves identically to the
    tessellation control and evaluation shader input variable gl_PrimitiveID.

    The output variable gl_PrimitiveID is available only in the geometry
    language and provides a single integer that serves as a primitive
    identifier. This is then available to fragment shaders as the fragment
    input gl_PrimitiveID, which will select the written primitive ID from the
    provoking vertex in the primitive being shaded. If a fragment shader using
    gl_PrimitiveID is active and a geometry shader is also active, the
    geometry shader must write to gl_PrimitiveID or the fragment shader input
    gl_PrimitiveID is undefined. See section 2.12.4 (under Geometry Shader
    Outputs) and section 3.9.2 (under Shader Inputs) of the OpenGL Graphics
    System Specification for more information.

    The output variable gl_Layer is available only in the geometry language,
    and is used to select a specific layer of a multi-layer framebuffer
    attachment. The actual layer used will come from one of vertices in the
    primitive being shaded. Which vertex the layer comes from is undefined, so
    it is best to write the same layer value for all vertices of a
    primitive. If a shader statically assigns a value to gl_Layer, layered
    rendering mode is enabled. See section 2.12.4 (under Geometry Shader
    Outputs) and section 4.4.7 Layered Framebuffers of the OpenGL Graphics
    System Specification for more information. 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 is undefined for
    executions of the shader that take that path.


    In the fragment language, built-in input and output variables are
    intrinsically declared as:

      in vec4 gl_FragCoord;
      in bool gl_FrontFacing;
      in float gl_ClipDistance[];
      in vec2 gl_PointCoord;
      in int gl_PrimitiveID;

      out vec4 gl_FragColor;                    // deprecated
      out vec4 gl_FragData[gl_MaxDrawBuffers];  // deprecated
      out float gl_FragDepth;

    (copy the variable descriptions verbatim from Section 7.2)


    Section 7.1.1, Compatibility Profile Built-In Shader Special Variables

    When using the compatibility profile, the GL can provide fixed
    functionality behavior for the vertex and fragment programmable pipeline
    stages. For example, mixing a fixed functionality vertex stage with a
    programmable fragment stage.

    The following built-in vertex, tessellation control, tessellation
    evaluation, and geometry output variables are available to specify inputs
    for the subsequent programmable shader stage or the fixed functionality
    fragment stage.  A particular one should be written to if any
    functionality in a corresponding shader or fixed pipeline uses it or state
    derived from it.  Otherwise, behavior is undefined.  The following members
    are added to the output gl_PerVertex block in these languages:

      out gl_PerVertex {
        // in addition to other gl_PerVertex members...
        vec4 gl_ClipVertex;
        vec4 gl_FrontColor;
        vec4 gl_BackColor;
        vec4 gl_FrontSecondaryColor;
        vec4 gl_BackSecondaryColor;
        vec4 gl_TexCoord[];
        float gl_FogFragCoord;
      };

    The variable gl_ClipVertex provides a place for vertex and geometry
    shaders to write the coordinate to be used with the user clipping planes.
    
    The user must ensure the clip vertex and user clipping planes are defined
    in the same coordinate space.  User clip planes work properly only under
    linear transform. It is undefined what happens under nonlinear transform.

    If a linked set of shaders forming a program contains no static write to
    gl_ClipVertex or gl_ClipDistance, but the application has requested
    clipping against user clip planes through the API, then the coordinate
    written to gl_Position is used for comparison against the user clip
    planes.  Writing to gl_ClipDistance is the preferred method for user
    clipping. It is an error for the set of shaders forming a program to
    statically read or write both gl_ClipVertex and gl_ClipDistance.

    gl_FrontColor, glFrontSecondaryColor, gl_BackColor, and
    glBackSecondaryColor assigns primary and secondary colors for front and
    back faces of primitives containing the vertex being processed.
    gl_TexCoord assigns texture coordinates for the vertex being processed.

    For gl_FogFragCoord, the value written will be used as the "c" value in
    section 3.11 of the OpenGL Graphics System 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 shader
    executable should write into gl_FogFragCoord.

    As with all arrays, 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.

    In the tessellation control, evaluation, and geometry shaders, the outputs
    of the previous stage described above are also available in the input
    gl_PerVertex block in these languages.

      in gl_PerVertex {
        // in addition to other gl_PerVertex members...
        vec4 gl_ClipVertex;
        vec4 gl_FrontColor;
        vec4 gl_BackColor;
        vec4 gl_FrontSecondaryColor;
        vec4 gl_BackSecondaryColor;
        vec4 gl_TexCoord[];
        float gl_FogFragCoord;
      } gl_in[];

    The following fragment inputs are also available in a fragment shader when
    using the compatibility profile:

      in vec4 gl_Color;
      in vec4 gl_SecondaryColor;
      in vec4 gl_TexCoord[];
      in 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 based on which face is visible in the primitive
    producing the fragment.  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.11 of the OpenGL Graphics System Specification. The
    gl_TexCoord[] values are the interpolated gl_TexCoord[] values from a
    vertex 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 shader text.


    Modify Section 7.4, Built-In Constants, p. 74

    (add to the list of constants at the bottom of p. 74)

      const int gl_MaxTessControlInputComponents = 128;
      const int gl_MaxTessControlOutputComponents = 128;
      const int gl_MaxTessControlTextureImageUnits = 16;
      const int gl_MaxTessControlUniformComponents = 1024;
      const int gl_MaxTessControlTotalOutputComponents = 4096;

      const int gl_MaxTessEvaluationInputComponents = 128;
      const int gl_MaxTessEvaluationOutputComponents = 128;
      const int gl_MaxTessEvaluationTextureImageUnits = 16;
      const int gl_MaxTessEvaluationUniformComponents = 1024;

      const int gl_MaxTessPatchComponents = 120;

      const int gl_MaxPatchVertices = 32;
      const int gl_MaxTessGenLevel = 64;

    (modify the minimum value for one other constant)

      const int gl_MaxCombinedTextureImageUnits = 80;


    Modify Section 8.7, Texture Lookup Functions, p. 90

    (modify first paragraph, accounting for all the new shader types) Texture
    lookup functions are available to all shaders.  However, automatic level
    of detail computations are only performed for fragment shaders; other
    shaders operate as though the base level of detail were computed as zero.
    The functions in the table below ...

    (modify first paragraph, p. 91) In all functions below, the bias parameter
    is optional for fragment shaders.  The bias parameter is not accepted in
    any other shader type.  For ...

    (Also, make miscellaneous modifications elsewhere in the spec to account
    for the fact that vertex and fragment shaders are not the only two
    supported shader types.)


    Insert a new section after Section 8.10, Geometry Shader Functions,
    p. 103.
    
    Section 8.X, Shader Invocation Control Functions

    Shader invocation control functions are available only in tessellation
    control shaders.  These functions are used to control the relative
    execution order of the multiple shader invocations used to process a
    patch, which are otherwise executed with an undefined relative order.

    The function barrier() provides a partially defined order of execution
    between shader invocations.  This ensures that values written by one
    invocation prior to the call to barrier() can be safely read by other
    invocations after the call to barrier().  Because invocations may execute
    in undefined order between barriers, the values of a per-vertex or
    per-patch output variable will be undefined in a number of cases
    enumerated in Section 4.3.6.

    The barrier() function may only be called inside the main entry point of
    the tessellation control shader and may not be called within any control
    flow.  Barriers are also disallowed after a return statement in function
    main().

      Syntax              Description
      -------------       --------------------------------------------------
      void barrier(void)  For any given static instance of barrier(), all
                          tessellation control shader invocations for a single
                          input patch must enter it before any will be allowed
                          to continue beyond it.

    Modify Section 9, Shading Language Grammar, p. 105

    !!! TBD


GLX Protocol

    None.


Errors

    The error INVALID_VALUE is generated by PatchParameteri if <pname> is
    PATCH_VERTICES and <value> is less than or equal to zero or is greater
    than the implementation-dependent maximum patch size.

    The error INVALID_OPERATION is generated by Begin (or vertex array
    commands that implicitly call Begin) if the active program contains a
    tessellation control or evaluation shader and the primitive mode is not
    PATCHES.

    The error INVALID_OPERATION is generated by Begin (or vertex array
    commands that implicitly call Begin) if the primitive mode is PATCHES if
    either:

      *  the active program contains no tessellation evaluation shader, or
      *  no program is active.

    The error INVALID_OPERATION is generated by GetProgramiv if <pname>
    identifies a tessellation control or evaluation shader-specific property
    and <program> has not been linked successfully, or does not contain
    objects to form a shader whose type corresponds to <pname>.


Dependencies on OpenGL 3.2 (Core Profile)

    If only the core profile of OpenGL 3.2 is supported, references to
    functionality deprecated by OpenGL 3.0 (built-in input/output variables
    corresponding to fixed-function vertex attributes, glBegin, fixed-function
    vertex processing) should be removed and/or replaced with functionality
    supported in the core profile.  In such an environment, the PATCHES
    primitive type is not supported by the deleted Begin() function but will
    still be supported by vertex array draw calls such as DrawArrays() and
    DrawElements().

Dependencies on ARB_gpu_shader5

    If ARB_gpu_shader5 is not supported, references to the input variable
    gl_InvocationID in the geometry shader language should be deleted.  This
    spec references gl_InvocationID in order to provide a complete set of
    language for implementations supporting GLSL 1.50 and both extensions.

Dependencies on ARB_gpu_shader_fp64

    If ARB_gpu_shader_fp64 is supported, discussion of the maximum number of
    input, output, and uniform components supported by the implementation for
    tessellation control and evaluation shaders should note each
    double-precision floating-point value is counted as two components.

Dependencies on NV_gpu_shader5

    If NV_gpu_shader5 is supported, discussion of the maximum number of input,
    output, and uniform components supported by the implementation for
    tessellation control and evaluation shaders should note each 64-bit
    integer value is counted as two components.

Dependencies on NV_primitive_restart

    If primitive restart is enabled, sending a vertex with the restart index
    will start a new patch at the beginning.  Any vertices specified prior to
    the restart index that form a partial patch will be discarded.

New State

    Add the following state to Table 6.5, Current Values and Associated Data,
    p. 343

                                                   Default
    Get Value                Type  Get Command     Value     Description                Sec.    Attr.
    ------------------------ ----  --------------  --------- ------------------------   ------  -------
    PATCH_VERTICES           Z+    GetIntegerv     3         Number of vertices in      2.6.1   current
                                                             input patch         
    PATCH_DEFAULT_OUTER_     4xR   GetFloatv       4 x 1.0   Default outer tessellation 2.X.2    -
      LEVEL                                                  level w/o control shader
    PATCH_DEFAULT_INNER_     2xR   GetFloatv       2 x 1.0   Default outer tessellation 2.X.2    -
      LEVEL                                                  level w/o control shader

    Add the following state to Table 6.40, Program Object State, p. 378

                                                   Default
    Get Value                Type  Get Command     Value     Description                Sec.    Attr.
    ------------------------ ----  --------------  --------- ------------------------   ------  -----
    TESS_CONTROL_OUTPUT_     Z+    GetProgramiv      0       Output patch size          2.X.1    -
      VERTICES                                               for tess. control shader
    TESS_GEN_MODE            Z+    GetProgramiv     QUADS    Base primitive type for    2.X.2    -
                                                             tess. prim. generator
    TESS_GEN_SPACING         Z+    GetProgramiv     EQUAL    Spacing of tess. prim.     2.X.2    -
                                                             generator edge subdivision
    TESS_GEN_VERTEX_ORDER    Z+    GetProgramiv     CCW      Order of vertices in       2.X.2    -
                                                             primitives generated by
                                                             tess. prim generator
    TESS_GEN_POINT_MODE      Z+    GetProgramiv     FALSE    Tess prim. generator       2.X.2    -
                                                             emits points?
    UNIFORM_BLOCK_REF-       B     GetActive-       0        True if uniform block is   
      ERENCED_BY_TESS_              UniformBlockiv           actively referenced by     2.14.4   -
      CONTROL_SHADER                                         tess. control stage
    UNIFORM_BLOCK_REF-       B     GetActive-       0        True if uniform block is   2.14.4   -
      ERENCED_BY_TESS_              UniformBlockiv           actively referenced by
      EVALUTION_SHADER                                       tess evaluation stage

New Implementation Dependent State

                                                 Minimum
    Get Value                  Type  Get Command  Value  Description                  Sec.
    -------------------------  ----  ----------- ------- --------------------------   ------
    MAX_TESS_GEN_LEVEL         Z+    GetIntegerv   64    maximum tessellation level   2.X.2
                                                         supported by tessellation
                                                         primitive generator
    MAX_PATCH_VERTICES         Z+    GetIntegerv   32    maximum patch size           2.6.1
    MAX_TESS_CONTROL_          Z+    GetIntegerv   1024  number of words for tess.    2.X.1.1
      UNIFORM_COMPONENTS                                 control shader uniforms
    MAX_TESS_EVALUATION_       Z+    GetIntegerv   1024  number of words for tess.    2.X.3.1
      UNIFORM_COMPONENTS                                 evaluation shader uniforms
    MAX_TESS_CONTROL_TEXTURE_  Z+    GetIntegerv   16    number of tex. image units   2.14.7
      IMAGE_UNITS                                        for tess. control shaders
    MAX_TESS_EVALUATION_       Z+    GetIntegerv   16    number of tex. image units   2.14.7
      TEXTURE_IMAGE_UNITS                                for tess. eval. shaders
    MAX_TESS_CONTROL_          Z+    GetIntegerv   128   num. components for per-     2.X.1.2
      OUTPUT_COMPONENTS                                  vertex outputs in tess. 
                                                         control shaders
    MAX_TESS_PATCH_            Z+    GetIntegerv   120   num. components for per-     2.X.1.2
      COMPONENTS                                         patch output varyings
                                                         for tess. control shaders
    MAX_TESS_CONTROL_TOTAL_    Z+    GetIntegerv   4096  Total num components for     2.X.1.2
      OUTPUT_COMPONENTS                                  tess. control shader
                                                         outputs
    MAX_TESS_EVALUATION_       Z+    GetIntegerv   128   num. components for per-     2.X.3.2
      OUTPUT_COMPONENTS                                  vertex outputs in tess. 
                                                         evaluation shaders
    MAX_TESS_CONTROL_          Z+    GetIntegerv   128   num. components for per-     2.X.1.2
      INPUT_COMPONENTS                                   vertex inputs in tess.
                                                         control shaders
    MAX_TESS_EVALUATION_       Z+    GetIntegerv   128   num. components for per-     2.X.3.2
      INPUT_COMPONENTS                                   vertex inputs in tess.
                                                         evaluation shaders
    MAX_TESS_CONTROL_          Z+    GetIntegerv   12    num. of supported uniform    2.14.4
      UNIFORM_BLOCKS                                     blocks for tess. control
                                                         shaders
    MAX_TESS_EVALUATION_       Z+    GetIntegerv   12    num. of supported uniform    2.14.4
      UNIFORM_BLOCKS                                     blocks for tess. evaluation
                                                         shaders
    MAX_COMBINED_TESS_         Z+    GetIntegerv   *     number of words for tess.    2.X.1.1
      CONTROL_UNIFORM_                                   control uniform variables
      COMPONENTS                                         in all uniform blocks
                                                         (including default) 
    MAX_COMBINED_TESS_         Z+    GetIntegerv   *     number of words for tess.    2.X.3.1
      EVALUATION_UNIFORM_                                evaluation uniform vari-
      COMPONENTS                                         ables in all uniform
                                                         blocks (including default) 

    The minimum values for MAX_COMBINED_*_UNIFORM_COMPONENTS by computing the
    value of:

      MAX_*_UNIFORM_COMPONENTS + MAX_*_UNIFORM_BLOCKS * (MAX_UNIFORM_BLOCK_SIZE/4)

    using the minimum values of the corresponding terms.

    Also, increase the minimum for MAX_COMBINED_UNIFORM_BLOCKS to 60 (12
    blocks per stage, five stages) and MAX_COMBINED_TEXTURE_IMAGE_UNITS to 80
    (16 image units per stage, five stages).


Issues

    (1) How does tessellation fit into the existing GL pipeline?

      RESOLVED:  The following diagram illustrates how tessellation shaders
      fit into the "vertex processing" portion of the GL (Chapter 2 of the
      OpenGL 3.2 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,
      polygons, lines or triangles with adjacency, or patches.  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, patch primitives are processed by the
      tessellation control shader, if present.  The tessellation control
      shader reads the vertices of the incoming patch and generates a new
      patch, consisting of a set of vertices and per-patch data.  The
      tessellation control shader runs with multiple invocations, one per
      vertex in the output patch.  Each invocation computes the properties of
      its own vertex; the invocations collectively compute any per-patch data.
      The vertices and per-patch data are then assembled into a new patch
      primitive.

      If a tessellation evaluation shader is present, the tessellation
      primitive generator and the tessellation evaluation shader will convert
      an incoming patch into a new set of point, line, or triangle primitives.
      The tessellation primitive generator uses the per-patch tessellation
      levels and output layout qualifiers to appropriately subdivide a
      triangle or quadrilateral into point, line, or triangle primitives.  For
      each vertex in the subdivided surface, the tessellation evaluation
      shader is run to compute its position and other attributes, given a
      (u,v) or (u,v,w) location within the subdivided primitive, the vertices
      of the patch, and any per-patch data produced by the tessellation
      control shader.  The results are assembled into primitives for
      processing by subsequent stages.

      After vertex transformation and tessellation, a geometry shader is
      executed on each individual point, line, triangle, or patch primitive,
      if one is active.  It can read the attributes of each transformed vertex
      in the primitive, 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, tessellation and geometry shaders are never run on the raster
      position.


                        |generic              |conventional
                        |vertex               |vertex
                        |attributes           |attributes
                        |                     |
                        | +-------------------+
                        | |                   |
                        V V                   V
                      vertex            fixed-function
                      shader              vertex
                         |               processing
                         |                    |
                         |                    |
                         +<-------------------+                
                         |
                         |position, color,
                         |other vertex data
                         |
                         V
         Begin/      primitive   patch    tessellation      (control point,
          End -----> assembly ----------->  control          parallel patch,
         State           |                  shaders          final patch)
                         |                   |  |
                         |           vertices|  |per-patch
                         |                   |  |data
                         |                   |  |
                         |                   |  |
                         V    patch          V  V
                         +<-------------  primitive
                         |                assembly
                         |
                         |     patch
                         +-------+-+---------------+            output
                         |       | |               |tess        layout
                         |  vert-| |per-patch      |levels     qualifiers
                         |  ices | |data           |               |
                         |       | |               V               |
                         |       | | (u,v,w)  tessellation         |
                         |       | |  +------  primitive  <--------+
                         |       | |  |        generator
                         |       V V  V             |
                         |      tessellation        |
                         |       evaluation         |connectivity
                         |         shader           |
                         |           |              V
                         |           +--------> primitive
                         |            vertex    assembly
                         V                          |
                         +<-------------------------+
                         |                                     Output
                         |position, color,                   Primitive
                         |other vertex data                     Type
                         |                                       |
                         |            geometry       primitive   |
                         +----------> shader ------> assembly  <-+
                         |                               |
                         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) Should we introduce new "patch" primitive types, or should
        tessellation be allowed to operate on patches assembled from a point
        list or other primitive types?

      RESOLVED:  Provide new patch primitives.

    (3) Unlike other primitive types, patches don't have a definite number of
        vertices.  How should the number of vertices in a patch be specified?

      RESOLVED:  Use a piece of "patch parameter" context state specified by
      the PatchParameteri entry point to indicate a patch size.

      Several other options were considered, including creating a new set of
      APIs to draw patches, having the input patch size be a (GLSL) program
      parameter, or providing a separate "patch" enum for each supported patch
      size (e.g., "PATCH16" for a 16-vertex patch).  The new API was rejected
      because the new calls may need to interact with a wide variety of vertex
      APIs (e.g., multi-draw array calls, instancing, ranged element arrays);
      a patch size parameter is orthogonal to all of these.  Having a fixed
      input patch size in a GLSL program may be fine in some cases.  We expect
      that some tessellation control shaders may want handle input patches
      with a variable number of extraordinary vertices, which would be
      incompatible with a fixed patch size in the program.  Handling many
      different "patch" enums in a frequently invoked draw calls didn't seem
      to make sense, either.

    (4) Should we support "overlap" of patches -- strips where some points in
        one patch are reused in neighboring ones?  If so, how should the
        overlap be specified?  Using a separate GL call?  Using a parameter in
        the program specifying a strip?  Using an overlap parameter that says
        how many vertices from one patch are carried over to the next one?
        Something else?

      RESOLVED:  We will not support patch strips in this extension.  Regular
      strips of patches can be drawn efficiently using DrawElements and an
      index buffer.

    (5) May patches be specified in immediate mode, and if so, how?

      RESOLVED:  Yes; this support falls out of the API definition.  Immediate
      mode may be useful in the compatibility profile to allow Begin/End-based
      applications to use tessellation without changing the way they specify
      vertices.

      For the core profile, immediate mode is not supported for any primitive
      type, including patches.

    (6) How are the vertices of patch primitives interpreted when compiled
        into display lists (compatibility profile)?

      RESOLVED:  During compilation, the vertices are simply stored into the
      display list as-is.  During execution, they are interpreted according to
      the current patch size values specified by PatchParameteri.  To
      interpret patches according to values determined at display list compile
      time, compile PatchParameteri calls to set the size and stride into the
      display list.

      One downside of this choice is that making the interpretation of patch
      vertices dependent on run-time state means that the display list
      compiler may not be able to determine the number of vertices in a patch
      primitive, and would be unable to perform any operations that require
      knowing the patch structure.

    (7) What should these shaders be called?

      RESOLVED:  The shader that converts an input patch to an output patch is
      called a "tessellation control shader" (TCS).  The use of "control" has
      several connotations -- the vertices of the input and output patches are
      often called "control points" and the tessellation levels computed are
      used to control the tessellation primitive generator.  The shader that
      takes the (u,v,w) or (u,v) points generated by the tessellation
      primitive generator are called tessellation evaluation shaders (TES), as
      they evaluate the position and other attributes of all the vertices of
      the tessellated primitive.

      Other options considered for TCS include "patch shaders" or "primitive
      shaders".  These choices seemed too general; the existing geometry
      shaders are arguably already primitive shaders.  The term "tessellation
      shader" was also considered for TES, but that choice also seemed too
      general -- TCS is strongly related to tessellation as well.

      Other APIs may refer to the tessellation control and evaluation shaders
      as "hull shaders" and "domain shaders", respectively.

    (8) Should coupling of tessellation control and evaluation shaders be
        required?

      RESOLVED:  No.  A tessellation control shader without an evaluation
      shader might be used in conjunction with transform feedback to generate
      regular transformed patches.  Also, if the set of patches provided by
      the application is already in a form usable by the tessellator, the
      tessellation control shader may be bypassed.  In this use case, the
      application would be required to provide default tessellation levels via
      the PatchParameterfv API, since no shader would be available to compute
      them.

      It may be useful to have a patch produced by a tessellation control
      shader to be fed directly to a geometry shader that performs some
      operation on full patches, rather than individual triangles of a
      tessellated patch.  However, such capability is not provided in this
      extension.

    (9) What measures are provided to ensure crack-free tessellation, where
        the results of tessellating multiple adjacent meshes produce the same
        vertices along the edges?

      RESOLVED:  The most likely cause of cracking is due to shared patch
      edges being subdivided differently.  In order to get consistent
      tessellation along shared edges, the tessellation control shaders (or
      default levels) must be constructed so that outer tessellation level
      corresponding to the shared edge must be exactly the same in both
      patches.

      Hardware implementations should guarantee that the same set of vertices
      is produced when subdividing a shared patch edge where the corresponding
      outer tessellation level matches.  Hardware implementations of this
      extension should also guarantee that the (u,v,w) parameters generated
      are complementary.  Walking along a shared patch edge may take you from
      a u/v/w coordinate of 0.0 to 1.0 in one patch, and from 1.0 to 0.0.  In
      this case, the u/v/w coordinates generated for any given vertex along
      this edge should sum to *exactly* 1.0.  

      Even with proper hardware support, tessellation evaluation shaders need
      to be crafted carefully to avoid arithmetic errors caused by the order
      of operations.  For example, errors in floating-point math mean that
      it's not always the case that:

        ((A + B) + C) + D = A + (B + (C + D))

      An evaluation shader walking a shared edge in opposite directions
      could easily run into errors such as this.

      The "precise" qualifier provided by the ARB_gpu_shader5 extension can be
      used to reduce the risk of cracking due to compiler optimizations.

      The full details of how to guarantee crack-free tessellation are beyond
      the scope of this specification.

    (10) Should we provide special built-ins or other mechanisms to assist in
         crack-free tessellation or other common tessellation shader usages?
         If so, what should be provided?

      RESOLVED:  Options considered include:

        * a test if a vertex is at the edge of a patch (for some common patch
          topologies);

        * a special directive to ensure that certain math operations requiring
          precise results are not adversely affected by compiler optimizations
          (e.g, reordering of operations, using asymmetric floating-point
          multiply-add operations);

        * special "lerp" intrinsics to ensure exact results for
          "complementary" weights; and

        * special built-ins for commonly used attribute evaluations (e.g.,
          linear, bicubic, and other polynomial evaluations)

      This extension doesn't provide any such mechanisms; however, the
      "precise" qualifier in ARB_gpu_shader5 addresses the second issue.

    (11) Should we provide specific invariance guarantees to ensure crack-free
         tessellation?  If so, what would they be?

      RESOLVED:  Formulating guarantees of this sort is difficult.  The
      "precise" qualifier can be used to guarantee that expressions are
      evaluated in the manner specified in the shader code.

    (12) In what domain should position parameters for tessellation shaders be
         provided?

      RESOLVED:  We will provide tessellation coordinates in a standard [0,1]
      parameterization.  Two-dimensional (u,v) coordinates with components in
      [0,1] is a standard parameterization; for example, it is what is used
      for OpenGL evaluators.

      A [-1,+1] parameterization has some advantages; in particular, the
      equivalent of "1-u" in this scheme is simply "-u".  Floating-point
      calculations involving these terms would result in values of identical
      magnitude, but opposite sign.  This advantage is not particularly
      important if the [0,1] parameterization is computed in a way that
      ensures that u+(1-u) == 1.0, with no floating-point rounding error.

      Three-dimensional barycentric coordinates are provided for triangular
      patches, where each coordinate is a linear weight for one of the corners
      of the subdivided primitive.  Four-dimensional barycentric coordinates
      may be useful quad patches, but can be computed easily enough by a
      tessellation evaluation shader if required.

    (13) What type of patches are supported by the tessellation primitive
    generator?

      RESOLVED:  The primitive generator will subdivide triangular and
      rectangular patches into triangles, and will also subdivide a
      rectangular patch into line strips (called "isolines").  Triangular and
      rectangular patches are useful for direct rendering of higher-order
      surfaces; isolines are useful for a number of things, including
      realistic hair rendering.

      Note that the notion of a patch in the tessellation API is simply an
      ordered collection of vertices of a fixed size.  There is no requirement
      that the vertices of the patch be arranged in a triangular or
      rectangular pattern at all.  Even for "normal" patches, there is no
      required vertex ordering.  Applications should be careful that the
      vertices of the patches they provide are ordered in the manner expected
      by the tessellation shaders they use.

    (14) Should the tessellation control and evaluation shaders be provided in
         a single compliation unit, or in multiple units?

      RESOLVED:  Separate units.  While tessellation control and evaluation
      shaders might often be tightly coupled, they can exist separately.  With
      the current GLSL program object API, all shader types are linked
      together into a single "program" unit, regardless.  A future API may
      allow decoupled shaders, in which case the tessellation control and
      evaluation shaders may want to be packaged separately.

    (15) Should the tessellation control shader be provided in a single
         compilation unit with a single entry point, a single compilation unit
         with multiple entry points, or in multiple compilation units?

      RESOLVED:  The extension packages the tessellation control shader into a
      single entry point that is run once per output vertex.  The barrier()
      function is provided to divide the tessellation control shader into
      execution phases that allow the separate threads to communicate via
      shared output variables.

      We considered an approach that explicitly packages the different phases
      of execution into separate functions.  Such a shader might have a
      "control point entrypoint" run independently in parallel and would be
      responsible for computing per-vertex attributes for each control point
      of the output patch.  The shader might also have one or more "patch
      entrypoints" run independently that would be responsible for per-patch
      attributes.  Restrictions on the capabilities might also be provided to
      limit the communication between threads and entrypoints to specific
      well-defined points.  For example, the control point entrypoint might be
      allowed to write per-vertex outputs, but could be forbidden to read
      outputs written by other threads.  Patch entrypoints could be guaranteed
      to run after control point entrypoints, forbidden from writing
      per-vertex outputs, and restricted to reading and writing disjoint
      per-patch outputs.  Because shader outputs are defined at global scope
      in GLSL, enforcing such restrictions in a single shader executable would
      be difficult.  For example, the compiler might be required to forbid
      calls to utility functions reading/writing global outputs in a specific
      manner.  Such a restriction might need to apply to a lengthy call chain
      (i.e., an entrypoint calls function A, which calls function B, which
      calls function C, which performs specific operations on an output).

      We also considered an approach with completely separate shader types in
      separate compilation units.  For example, we might provide separate
      "tessellation control point shaders" and one or more types of
      "tessellation control patch shaders".  The linker would build a single
      tessellation control executable from one or more of these shaders.  The
      languages for these different shader types could be constrained to
      enforce restrictions.  For example, tessellation control point shaders
      could be forbidden from declaring per-patch outputs, and per-vertex
      outputs would be non-arrays to prevent threads from reading the outputs
      of other control point shaders.  Per-vertex attributes of the output
      patch could be declared as inputs to the tessellation control patch
      shaders to forbid writes.

      Another option considered provided a single shader entry point called
      once per patch and have an optimizing compiler extract the same sort of
      parallel execution units provided by the explicitly parallel shader
      model.  However, we didn't want to depend on "compiler magic" to get
      acceptable performance.

    (17) Tessellation control shaders have a shared output patch, where
         individual threads can read and write these shared outputs.  Should
         we do anything to prevent multiple theads from reading and writing
         the same output?  If not, what should happen if they do?

      RESOLVED:  We are currently enforcing no compile-time restrictions on
      these cases.  The built-in function barrier() can be used by the shader
      writer to segregate shader execution into phases.  No problems should
      arise as long as no two threads access the same shared output in the
      same phase.  Reading outputs written by other threads would not be a
      problem as long as the output was written in a previous phase.

      The relative execution order of the shader threads within a single phase
      is undefined; a single phase may be run fully in parallel or fully
      serially.  If multiple threads write different values to the same output
      in the same phase, the thread that "wins" is undefined -- and for
      vectors, different components may have a different "winning thread".  If
      one thread reads an output written by another thread in the same phase,
      the newly written value may or may not be available at the time the read
      is executed.

      In some of the alternate programming models considered in the discussion
      of the previous issue, it might be possible for the compiler to avoid
      read/write and write/write hazards.  For example, the compiler might
      allow an output variable to be written by only a single entrypoint, and
      could allow only those entrypoints logically "after" the entry point to
      read it.  Such enforcement would prevent undefined behavior, but would
      have some drawbacks of its own.  In particular, it doesn't solve the
      problem of multiple threads computing a single per-patch attribute.  One
      very natural use would be to use a patch entrypoint to compute the four
      outer tessellation levels in parallel.  If all threads only write to
      gl_TessLevelOuter[gl_InvocationID], there are no hazards.  However,
      detecting and preventing hazards are problematic if more complicated
      array indexing is used.  Also, there would be a problem if a parallel
      shader was structured in such a way that one output might be written by
      exactly one thread, but it wasn't obvious to the compiler which thread
      actually would write it.

    (19) How should we name the parameters that control the degree of
        tessellation along edges of a given patch and the (u,v) or (u,v,w)
        parameter driving the tessellation shader evaluation?

      RESOLVED:  The parameters controlling subdivision are called
      "tessellation levels".  The ones controlling subdivision of the outer
      edges of the patch are called "outer tessellation levels"; the ones
      controlling the interior are called "inner tessellation levels".  The
      built-in variables are called "gl_TessLevelOuter[]" and
      "gl_TessLevelInner[]".  Both are declared as arrays of floating-point
      scalars, rather than vectors, so they can be accessed with indexing.
      The (u,v) or (u,v,w) coordinate used by the tessellation evaluation
      shader is referred to as the "tessellation coordinate", giving the
      relative coordinates of the vertex in the primitive being tessellated.
      The built-in input variable holding this value is called "gl_TessCoord".

    (20) How would applications handle attributes that may want to be sampled
         with different frequency?  For example, OpenGL evaluators can specify
         evaluator maps of different order for different attributes?  For
         example, evaluating (u,v) with a cubic 2D map (order == 4) requires
         16 control points, while a linear map (order == 2) only requires 4.

      RESOLVED:  Tessellation evaluation shaders can read from any vertex or
      per-patch attribute, so they can read whatever the tessellation control
      shader throws at them.  Tessellation control shaders may choose to
      compute attributes sampled at a different frequency than per-control
      point in one of several ways:

        * Compute and output the attribute in only a subset of the
          tessellation control shader threads; for example, only compute the
          "linear" attributes in threads 0-3.

        * Encode the attribute across multiple control points.  For example,
          four vec4 values could be passed out as a float for each vertex if
          16 control point shader threads were used.  Doing this may be tricky
          in some cases.

        * Compute the "linear" attributes as four-element per-patch outputs.
          If using this technique, it would be desirable to compute these
          independently in the tessellation control shader, if possible.

    (21) To what level should we enforce that different shader types in a
         program match exactly, and to what level does the current program
         need to match the topology enums (e.g., GL_POINTS) provided by the
         application?

      RESOLVED:  If the tessellator is being used, we will require a patch
      primitive as input and throw an INVALID_OPERATION error if any other
      primitive type is provided.  This is consistent with geometry shaders
      requiring primitives consistent with their input topology.  

      If no tessellation evaluation shader is present, a patch primitive would
      need to be passed through to the geometry shader, or potentially
      transform feedback and rasterization.  That capability will not be
      provided by this extension, but may be provided in the future or in a
      vendor-specific extension.

    (22) If we have a notion of a "patch" as a random (though possibly
         fixed-size) blob of vertices, should we extend this concept to
         encompass geometry shaders as well?

      RESOLVED:  No, we will not allow geometry shaders to receive patches in
      this extension.  That limitation may be relaxed in a future extension.

      Such a mechanism would allow patches to be used by geometry shaders in
      settings other than tessellation.  For example, QUADS primitives are
      subdivided into two triangles when passed to geometry shaders.  However,
      this mechanism allows applications to pass 4-vertex PATCHES primitives
      to geometry shaders, which can treat the four vertices as a quad.  Note
      also that the only way one could get patches to geometry shaders is if
      no tessellation evaluation shader is present, because the tessellation
      primitive generator will consume an input patch.

    (23) Should we support a programming model where the tessellation control
         shader can be written serially rather than explicitly requiring
         parallel execution?

      RESOLVED:  Not in this extension.  The parallel programming model allows
      for improved efficiency.  While an optimizing compiler could refactor
      the code to execute in parallel, depending on this refactoring would run
      the risk of major performance pitfalls.

    (24) Should the use of tessellation shaders be allowed with fixed-function
         vertex processing, or should we require the use of a vertex shader?

      RESOLVED:  When using tessellation control or evaluation shaders,
      programmable vertex shaders will be required.  This follows the
      precedent established by EXT_geometry_shader4 that requires that if you
      use a programmable shader for any stage prior to rasterization, you
      can't mix that with fixed-function vertex processing.

    (25) Should we support variable-size input patches in the tessellation
         control or evaluation shaders?  If so, how can one get at the number
         of vertices in the input patch?

      RESOLVED:  Yes, variable-size input patches are supported, though the
      input size can not be changed within a single draw call or Begin/End
      pair.  The vertex count for a specific input patch can be obtained in a
      shader using the input variable "gl_PatchVerticesIn".  Additionally, the
      maximum patch size supported by the implementation, used for sizing
      unsigned per-vertex input arrays, is given by the constant
      "gl_MaxPatchVertices".

      The EXT_geometry_shader4 provided a constant "gl_VerticesIn"
      corresponding to the fixed input primitive size set by the input
      primitive type.  This variable was dropped when geometry shaders were
      included in GLSL 1.50 because the value of this constant couldn't be
      known at CompileShader() time.  Using GLSL 1.50, a shader could extract
      the same value using "gl_in.length()" as long as the input primitive
      type was declared prior to the use of "length()".

      This spec initially repurposed "gl_VerticesIn" for tessellation shaders
      to refer to the input "gl_PatchVerticesIn", but having a variable that
      was a constant in some shaders/#extension configurations and an input in
      others was confusing.

    (26) Must per-vertex input variables be declared as arrays indexed by
         vertex number?  What syntax should be used in the declaration?

      RESOLVED:  Yes, they must be declared as arrays or members of blocks
      declared as arrays.  We strongly recommend that shaders simply omit the
      vertex size; a default size will be injected automatically by the
      compiler.  For example, if each input patch vertex a vec3 named position
      an array of four vec2 values called "texcoords" and the implementation's
      maximum patch size is 32, any of the following declarations are legal.

            in vec3 position[];
            in vec3 position[gl_MaxPatchVertices];
            in vec3 position[32];
            in TexCoords {
              vec2 coords[4];
            } tex[];
            in TexCoords {
              vec2 coords[4];
            } tex[gl_MaxPatchVertices];
            in TexCoords {
              vec2 coords[4];
            } tex[32];

      Shaders using the "32" form won't be portable; they will break when run
      on any implementation that has a different patch size limit.  Shaders
      using "gl_MaxPatchVertices" will be portable, but there's no point in
      specifying a vertex count.  Just say no.

    (27) Can tessellation shaders be run on primitives such as triangles or
         triangle strips?

      RESOLVED:  Not directly.  However, if an application is drawing
      independent triangles using DrawElements, it can pass the same set of
      indices using PATCHES and a patch size of 3 vertices and use the
      tessellator normally.

    (29) How does tessellation interact with PolygonMode?  Edge flags?

      RESOLVED:  When the tessellation primitive generator decomposes a patch
      and emits triangles, each triangle will be drawn with all edge flags set
      to TRUE (as with regular TRIANGLE_STRIP primitives).  If the polygon
      mode is not FILL, each triangle will be drawn using points or lines, as
      with any other primitive.  PolygonMode and edge flags have no effect on
      point or line primitives, and will thus have no effect if a patch is
      used to generate points or isolines, or if the patch makes it to the
      rasterizer.

    (30) Are any of the clamped/filtered gl_TessLevel values computed by the
         tessellation primitive generator available to tessellation evaluation
         shaders?

      RESOLVED:  No, the only tessellation levels directly available to the
      tessellation evaluation shaders will be the raw values written by the
      tessellation control shaders or taken from default tessellation
      levels.  

      If a tessellation evaluation shader requires clamped or rounded levels,
      it can perform the clamping itself.  Alternately, the clamped levels can
      be computed in the tessellation control patch shaders and passed to the
      evaluation shader using a per-patch output declared as "patch out".

    (31) Should any of the patch parameters or the maximum input patch size
         parameter have a "TESS_" prefix?  

      RESOLVED:  No.  These are properties of patches, not any tessellation
      units.  While patches may be commonly used for tessellation, they might
      also be used in the future by geometry shaders or transform feedback
      with no tessellation shaders present.

    (32) How are primitives generated by the tessellator wound in (u,v) space?
         Can we wind in either direction, or is only one way supported?  At
         the very least, we should guarantee that the winding is internally
         consistent.

      RESOLVED:  We will support both clockwise and counter-clockwise winding
      in the normalized (u,v) space, where the winding can be specified using
      a layout qualifier.  Note that the final position of the vertices are
      computed in the tessellation evaluation shader, and a triangle that is
      counter-clockwise in (u,v) space may end up clockwise in screen space.

    (35) Tessellation evaluation shaders have a fixed input patch size if a
         tessellation control shader is present, but a variable input patch
         size otherwise.  Is that a problem?

      RESOLVED:  No, we don't think so.

    (36) How do patches interact with primitive restart indices?

      RESOLVED:  Primitive restart terminates the existing patch and start a
      new one, just like any other primitive.  Since we only support
      independent patch primitives, primtive restart with patches is every bit
      as pointless as it is with independent point, line, triangle, and quad
      primitives.

    (37) Should the default tessellation levels be used automatically if they
         are not written by the tessellation control shader?

      RESOLVED:  No.  If you don't write tessellation levels in a tessellation
      control patch shader, they will be undefined.  If an application really
      want a "default" tessellation level in conjunction with the tessellation
      control shader, it can simply copy one from a uniform.

    (40) How does tessellation interact with rasterization features such as
         flat shading and stippled lines?  How are the vertices produced by
         the tessellator presented to the geometry shader, if one is present?

      RESOLVED:  For quad and triangle tessellation, a set of independent
      triangles is generated by the tessellation primitive generator.  For
      isoline tessellation, a set of independent lines is generated.  In both
      cases, the order in which the triangles or lines are drawn is undefined.
      Additionally, the order of vertices in the triangles or lines are also
      undefined.  The only thing that is defined is that when triangles are
      generated, their winding will be consistent with the "cw" or "ccw"
      layout qualifer.

      As a result, using flat shading and line stipple with tessellation
      shaders may not produce regular results given that the first vertex
      (resetting stipple) and last vertex (provoking vertex for flat shading)
      of each primitive are undefined.  Additionally, the order of vertices
      presented to a geometry shader will not be predictable.  All of these
      features will work with tessellation; they just won't produce results
      that are as regular as what you'd get decomposing a patch into a set of
      triangle strips.

      Note that for the isoline tessellation, while the line segments appear
      to be arranged in strips, they are rendered as independent segments and
      have their stipple reset at the beginning of each segment.

    (41) Tessellation control shaders declare per-vertex outputs as arrays or
         members of block arrays indexed by vertex number.  However, we only
         allow each thread to write per-vertex outputs for its own vertex.
         How should we impose this restriction?

       RESOLVED:  The current specification requires that the value of the
       expression used as a vertex input must be the identifier
       "gl_InvocationID".  This does mean that even trivially equivalent
       expressions such as "(gl_InvocationID)" or "glInvocationID + 0" should
       not be accepted by the compiler.

       We considered allowing compilers to accept equivalent expressions like
       "(gl_InvocationID)", "(gl_InvocationID + 0)", or a temporary variable
       assigned the value of "gl_InvocationID".  We also considered allowing
       any expression, with undefined behavior if the value of the index
       turned out to not be equal to "gl_InvocationID".  We chose to have a
       stronger restriction to avoid undefined behavior and errors that
       depending on specific compiler behavior.

       Applications not wishing to use the string "gl_InvocationID" can use
       the #define preprocessor feature to define an alternate name.

    (42) What restrictions should apply to the barrier() built-in?

      RESOLVED:  Given that the barrier() function must be reached by all
      threads before any thread continues, it would be possible for shader
      thread groups to hang if any thread in the group never reaches the
      barrier because of conditional flow control.

      We would prefer not to provide a mechanism allowing improperly-coded
      shaders to hang, so it would be necessary to rely on compiler analysis
      to prevent the use of barrier() in places where it isn't safe, which
      would include:

        * calls within "if" or "else" substatements of an if statement,

        * calls within "do", "for", or "while" loops if the number of loop
          iterations is not known to be uniform, or if any thread may execute
          a "continue" or "break" statement,

        * calls within functions called directly or indirectly by main() in
          cases any call in the chain is in conditional code, and

        * calls within the main() entrypoint issued after one or more threads
          have executed a "return" statement.

      Relying on such analysis on fully general shader code may be fragile and
      difficult to replicate uniformly across all compiler implementations.
      As a result, we choose a heavy-handed approach in which we only allow
      calls to barrier() inside main().  Even within main, barrier() calls are
      forbidden inside loops (even those that turn out to have constant loop
      counts and don't execute "break" or "continue" statements), if
      statements, or after a return statement.

    (43) Why provide a limit on the maximum number of components (both
         per-vertex and per-patch) emitted by a tessellation control shader,
         i.e.  MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS?

      RESOLVED:  We expect that some implementations of this extension might
      have a fixed limit on output buffering that may not not allow the
      combined use of a maximum number of per-patch and per-vertex attributes.

    (44) What is the meaning of a "vertex shader" inside a pipeline with
         tessellation enabled?

      RESOLVED:  There are two different types of "vertex" when tessellation
      is involved.  We have the vertices of the input patch, and we have the
      vertices generated by the tessellation primitive generator.  If one
      considers "vertices" to be points used to control rasterized primitives,
      the former may be more reasonably considered "control points", since
      they typically won't be used as-in in primitives sent to the rasterizer.
      Additionally, operations typically performed in a vertex shader
      (lighting, texture coordinate generation) may instead be performed by a
      after evaluating the position and normal in the tessellation evaluation
      shader.  In such a world view, one might rename the pipeline stage
      typically called "vertex shader" when tessellation is disabled to be a
      "control point shader" stage.  A logically separate pipeline stage with
      a lot in common with existing vertex shaders would be run after the
      tessellation evaluation shader.

      This extension chooses not to adopt the above approach, however.  While
      a post-tessellation vertex shader may have a lot in common with the
      vertex shader used without tessellation, it's not likely that the shader
      code used in these two cases will be completely identical.  In
      particular, the vertex positions and normals computed by the
      tessellation coordinate shader will likely be in a different coordinate
      system than the "object space" positions and normals used for vanilla
      vertex shaders.  The linkage between the two types of vertex shader and
      the previous stage are also very different -- post-tessellation vertex
      shaders would get their inputs from the outputs of the tessellation
      evaluation shader; "normal" vertex shaders get their inputs from vertex
      attribute arrays specified with the OpenGL API.  Additionally, allowing
      a vertex shader to live at the beginning or middle of the pipeline would
      have problems if/when OpenGL releases the monolithic single program
      model in the current GLSL API.  In such an API, it would be necessary to
      generate code for a vertex shader without knowledge of whether it would
      be run with or without tessellation.  

      In the model we do expose, developers need to keep in mind that with
      tessellation:

        * vertex shaders are run on control points, not post-tessellation
          vertices, and

        * many of the vertex processing operations typically performed by the
          vertex shader will be performed by the tessellation evaluation
          shader.

      It may be possible to share some or all portions of existing vertex
      shader code verbatim with the tessellation evaluation shaders via clever
      use of #ifdefs or multiple shader objects.  Additionally, higher-level
      shader or effects libraries may be able to expose a different pipeline
      configuration as long as they generate code and shader/program objects
      that fit the existing pipeline.

    (45) Should we provide the ability for the implementation to automatically
         generate a "pass-through" vertex shader, effectively making vertex
         shaders optional when tessellating.  In some tessellation algorithms,
         the bulk of the work will be done in the tessellation control and
         evaluation shaders, and the vertex shader will have little or no
         interesting work to do.

      RESOLVED:  Not in this extension.  This functionality might be useful,
      but making such a change would have significant impact.  First, there
      would be quite a bit of text to rewrite regarding vertex attributes, all
      of which is now in the "vertex shader" section but might want to be done
      more neutrally.  Additionally, the input variables for
      tessellation/geometry shaders would presumably now receive vertex
      attributes.  However, TCS/TES/GS can have inputs that are not supported
      as equivalent vertex shader inputs.  In particular, structures are
      allowed as inputs in TCS/TES/GS, but not in VS.  This probably has
      further impact on the vertex attribute language.  We chose to leave out
      this functionality for simplicity.

    (46) Should we reserve "patch" as a keyword for per-patch input
         qualifiers, or use something more obscure, such as "per_patch"?
         Whatever keyword we choose, should it be reserved in all languages or
         just tessellation control and evaluation?

      RESOLVED:  This extension uses "patch".

    (47) Should we allow tessellation control or evaluation inputs and outputs
         to be declared as "centroid in" or "centroid out", or with
         interpolation modifiers, even if those variables aren't being
         interpolated?

      RESOLVED:  Yes.  This allows for mix-and-match linkage where you can
      feed an output from a single vertex shader to a fragment shader in one
      program and a tessellation/geometry shader in another.  The shading
      language requires that variables on each interface match in type and
      qualification.  Therefore, if a fragment shader input is declared as
      "centroid in", the vertex shader output must be declared similarly.
      When used on inputs in tessellation control, tessellation evaluation,
      and geometry shaders, "centroid" and any other interpolation modifiers
      have no effect.

    (48) Should we provide a tessellation spacing mode where the tessellation
         levels are snapped to powers of two?

      RESOLVED:  No.  Such a mode would be useful to avoid motion of generated
      vertices as the tessellation levels change.  When using a power of two,
      an increasing tessellation level snaps from 2 to 4 to 8 to 16.  In each
      transition, the <n> existing points generated by the tessellator on each
      edge don't move -- new vertices are introduced at the midpoint of each
      old edge in the subdivision.

      Applications can implement this behavior themselves by manually snapping
      the levels of detail they compute in the tessellation control shader.

    (49) Should we make clockwise/counter-clockwise winding of tessellation
         output program state or context state?

      RESOLVED:  Program state, for simplicity.  Making it program state means
      that if an application wants to use the same tessellation evaluation
      shader with different winding orders, it would need to generate two
      separate programs/tessellation evaluation shaders.  This doesn't seem to
      be a significant enough usage case to justify the overhead of having to
      program a separate piece of tessellation state.

      Note that applications that want to use the same program with different
      windings can work around this limitation by toggling the FrontFace API
      state as required.  Counter-clockwise primitives with FrontFace set to
      CCW will generally be indistinguishable from clockwise primitives with
      FrontFace set to CW.  The only limitation of this approach is that it
      doesn't affect the winding of primitives captured by transform feedback.

   (50) Tessellation using "point_mode" is supposed to emit each distinct
        vertex produced by the tessellation primitive generator exactly once.
        Are there cases where this can produce multiple vertices with the same
        position?

      RESOLVED:  Yes.  If fractional odd spacing is used, we have outer
      tessellation levels that are greater than 1.0, and inner tessellation
      levels less than or equal to 1.0, this can occur.  If any outer level is
      greater than 1.0, we will subdivide the outer edges of the patch, and
      will need a subdivided patch interior to connect to.  We handle this by
      treating inner levels less than or equal to 1.0 as though they were
      slightly greater than 1.0 ("1+epsilon").

      With fractional odd spacing, inner levels between 1.0 and 3.0 will
      produce a three-segment subdivision, with one full-size interior segment
      and two smaller ones on the outside.  The following figure illustrates
      what happens to quad tessellation if the horizontal inner LOD (IL0) goes
      from 3.0 toward 1.0 in fractional odd mode:

             IL0==3         IL0==2         IL0=1.5       IL0=1.2
          +-----------+  +-----------+  +-----------+  +-----------+
          |           |  |           |  |           |  |           |
          |   +---+   |  |  +-----+  |  | +-------+ |  |+---------+|
          |   |   |   |  |  |     |  |  | |       | |  ||         ||
          |   |   |   |  |  |     |  |  | |       | |  ||         ||
          |   +---+   |  |  +-----+  |  | +-------+ |  |+---------+|
          |           |  |           |  |           |  |           |
          +-----------+  +-----------+  +-----------+  +-----------+

      As the inner level approaches 1.0, the vertical inner edges in this
      example get closer and closer to the outer edge.  The distance between
      the inner and outer vertical edges approaches zero for an inner level of
      1+epsilon, and the positions of vertices produced by subdividing such
      edges may be numerically indistinguishable.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------- -----------------------------------------
     22   04/21/15  Jon Leech Allow user-defined TCS input and output,
                              and TES input variable array size mismatches
                              to be detected at compile as well as link time
                              (Bug 12185).

     21   04/20/15  Jon Leech Remove "per-patch" part of description of
                              MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS
                              (Bug 13765).

     20   04/25/14  pbrown    Clarify that the tessellation primitive
                              generator may produce multiple vertices with 
                              the same gl_TessCoord values in point mode when
                              fractional odd spacing is used with an inner
                              tessellation level less than or equal to 1.0
                              (bug 11979).

     19   10/25/12  pbrown    Update spec language describing tessellation of
                              isolines.  Fix the inconsistent/incorrect
                              language describing the handling of tessellation
                              levels -- outer level 0 controls the number of
                              isolines generated and outer level 1 controls
                              the number of segements in each isoline (bug
                              9195/9607).  Minor isoline tessellation wording
                              fixes for improved clarity.

     18   03/29/10  pbrown    Update issues (42), (46), and (47).

     17   03/22/10  pbrown    Minor corrections to the Dependencies section.

     16   01/29/10  pbrown    Updates from ARB review (bug 5905).  In
                              particular, we again allow only the token
                              "gl_Invocation" for indexing TCS outputs,
                              reversing changes in version 7.  Added some
                              clarifications to barrier().  Increased minimum
                              value of gl_MaxCombinedTextureImageUnits.

     15   01/26/10  pbrown    Reflow some ragged paragraphs.

     14   01/20/10  Jon Leech Make behavior, not just results undefined
                              when reading gl_in beyond the number of
                              vertices in the input patch (Bug 5880).

     13   01/20/10  pbrown    Clarify the required minimum values for
                              MAX_COMBINED_*_UNIFORM_COMPONENTS (bug 5919).

     12   01/14/10  Jon Leech Remove erroneous reference to triangles from
                              tesselation control shader input language
                              (Bug 5881).

     11   01/14/10  pbrown    Minor clarifications from spec reviews.  Add
                              missing edits for gl_InvocationID changes from
                              version 7.

     10   12/14/09  pbrown    Rename "gl_VerticesIn" to "gl_PatchVerticesIn"
                              to avoid collision with the EXT_geometry_shader4
                              variable of the same name.  Add language
                              clarifying the size applied to unsized input
                              arrays for tessellation control and evaluation
                              shaders.

      9   12/10/09  pbrown    Rename the layout qualifiers for vertex order to 
                              "cw" and "ccw".  Minor changes to invariance
                              rules, including addition of a rule guaranteeing
                              that <x> + (1-<x>) is exactly 1.0 for
                              gl_TessCoord components.

      8   12/10/09  pbrown    Convert from EXT to ARB.

      7   12/09/09  pbrown    Miscellaneous fixes from spec review:  Added a
                              new invariance section describing a set of
                              hopefully useful rules for tessellation.
                              Slightly relaxed the rules requiring
                              gl_InvocationID for TCS per-vertex outputs.
                              Cleaned up language on primitive generation and
                              when outputs are defined in TCS w.r.t. barrier.
                              General typo fixes and language clarifications.

      6   11/02/09  pbrown    Fix cut-and-paste error in the definition of
                              gl_PrimitiveID.

      5   10/23/09  pbrown    Change the name of one GLSL constant to
                              gl_MaxTessPatchComponents (was "TessControl")
                              to match the API constant name.  This limit
                              also applies to evaluation shaders.

      4   10/13/09  pbrown    Minor typo fixes.

      3   10/01/09  pbrown    Renamed some of the tessellation evaluation
                              shader input layout qualifiers to more closely
                              match geometry shader conventions.  Renamed
                              gl_ThreadID to gl_InvocationID.  Fixed one 
                              reference to an old layout qualifier name.

      2   09/28/09  pbrown    Typo fix.

      1             pbrown    Internal revisions.

