Name

    OES_tessellation_shader

Name Strings

    GL_OES_tessellation_shader
    GL_OES_tessellation_point_size

Contact

    Jon Leech (oddhack 'at' sonic.net)
    Daniel Koch, NVIDIA (dkoch 'at' nvidia.com)

Contributors

    Daniel Koch, NVIDIA (dkoch 'at' nvidia.com)
    Pat Brown, NVIDIA (pbrown 'at' nvidia.com)
    Bill Licea-Kane, Qualcomm (billl 'at' qti.qualcomm.com)
    Jesse Hall, Google (jessehall 'at' google.com)
    Dominik Witczak, Mobica
    Jan-Harald Fredriksen, ARM
    Maurice Ribble, Qualcomm
    Vineet Goel, Qualcomm
    Alex Chalfin, ARM
    Graham Connor, Imagination
    Ben Bowman, Imagination
    Jonathan Putsman, Imagination
    Slawomir Grajewski, Intel
    Contributors to ARB_tessellation_shader

Notice

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

    Portions Copyright (c) 2013-2014 NVIDIA Corporation.

Status

    Approved by the OpenGL ES Working Group
    Ratified by the Khronos Board of Promoters on November 7, 2014

Version

    Last Modified Date: December 10, 2018
    Revision: 7

Number

    OpenGL ES Extension #214

Dependencies

    OpenGL ES 3.1 and OpenGL ES Shading Language 3.10 are required.

    This specification is written against the OpenGL ES 3.1 (March 17, 2014)
    and OpenGL ES 3.10 Shading Language (March 17, 2014) Specifications.

    OES_geometry_shader is required in order to share language modifying the
    OpenGL ES 3.1 specifications, which would otherwise have to be repeated
    here.

    OES_shader_io_blocks or EXT_shader_io_blocks is required.

    OES_gpu_shader5 or EXT_gpu_shader5 is required.

    This extension interacts with OES_shader_multisample_interpolation.

Overview

    This extension introduces new tessellation stages and two new shader types
    to the OpenGL ES 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 ES 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.
    However, if either a tessellation control or a tessellation evaluation
    shader is present, the other must also be present.

    Not all tessellation shader implementations have the ability to write the
    point size from a tessellation shader. Thus a second extension string and
    shading language enable are provided for implementations which do
    support tessellation shader point size.

    This extension relies on the OES_shader_io_blocks or EXT_shader_io_blocks
    extension to provide the required functionality for declaring input and
    output blocks and interfacing between shaders.

    This extension relies on the OES_gpu_shader5 or EXT_gpu_shader5 extension
    to provide the 'precise' and 'fma' functionality which are necessary to
    ensure crack-free tessellation.

IP Status

    No known IP claims.

New Procedures and Functions

      void PatchParameteriOES(enum pname, int value);

New Tokens

    Accepted by the <mode> parameter of DrawArrays, DrawElements,
    and other commands which draw primitives:

        PATCHES_OES                                         0xE

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

        PATCH_VERTICES_OES                                  0x8E72

    Accepted by the <pname> parameter of GetProgramiv:

        TESS_CONTROL_OUTPUT_VERTICES_OES                    0x8E75
        TESS_GEN_MODE_OES                                   0x8E76
        TESS_GEN_SPACING_OES                                0x8E77
        TESS_GEN_VERTEX_ORDER_OES                           0x8E78
        TESS_GEN_POINT_MODE_OES                             0x8E79

    Returned by GetProgramiv when <pname> is TESS_GEN_MODE_OES:

        TRIANGLES
        ISOLINES_OES                                        0x8E7A
        QUADS_OES                                           0x0007

    Returned by GetProgramiv when <pname> is TESS_GEN_SPACING_OES:

        EQUAL
        FRACTIONAL_ODD_OES                                  0x8E7B
        FRACTIONAL_EVEN_OES                                 0x8E7C

    Returned by GetProgramiv when <pname> is TESS_GEN_VERTEX_ORDER_OES:

        CCW
        CW

    Returned by GetProgramiv when <pname> is TESS_GEN_POINT_MODE_OES:

        FALSE
        TRUE

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

        MAX_PATCH_VERTICES_OES                              0x8E7D
        MAX_TESS_GEN_LEVEL_OES                              0x8E7E
        MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES             0x8E7F
        MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES          0x8E80
        MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES            0x8E81
        MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES         0x8E82
        MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES              0x8E83
        MAX_TESS_PATCH_COMPONENTS_OES                       0x8E84
        MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES        0x8E85
        MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES           0x8E86
        MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES                 0x8E89
        MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES              0x8E8A
        MAX_TESS_CONTROL_INPUT_COMPONENTS_OES               0x886C
        MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES            0x886D
        MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES    0x8E1E
        MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F
        MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES         0x92CD
        MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES      0x92CE
        MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES                0x92D3
        MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES             0x92D4
        MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES                 0x90CB
        MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES              0x90CC
        MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES          0x90D8
        MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES       0x90D9
        PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES         0x8221

    Accepted by the <props> parameter of
    GetProgramResourceiv:

        IS_PER_PATCH_OES                                    0x92E7
        REFERENCED_BY_TESS_CONTROL_SHADER_OES               0x9307
        REFERENCED_BY_TESS_EVALUATION_SHADER_OES            0x9308

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

        TESS_EVALUATION_SHADER_OES                          0x8E87
        TESS_CONTROL_SHADER_OES                             0x8E88

    Accepted by the <stages> parameter of UseProgramStages:

        TESS_CONTROL_SHADER_BIT_OES                     0x00000008
        TESS_EVALUATION_SHADER_BIT_OES                  0x00000010

Additions to the OpenGL ES 3.1 Specification

    Modify chapter 3 "Dataflow Model"

    Change the second paragraph, on p. 28:

    ... In the next stage vertices may be transformed, followed by assembly
    into geometric primitives. Tessellation and geometry shaders may then
    optionally generate multiple new primitives from single input
    primitives. Optionally, the results ...


    Modify figure 3.1 "Block diagram of the OpenGL ES pipeline" as modified
    by OES_geometry_shader to insert new boxes "Tessellation Control
    Shader", "Tessellation Primitive Generation", and "Tessellation
    Evaluation Shader" in sequence following "Vertex Shader" and preceding
    "Geometry Shader". Extend the arrows from the boxes "Image Load/Store"
    .. "Uniform Block" to the right of "Vertex Shader" to connect to the new
    "Control" and "Evaluation" boxes.


    Replace the two paragraphs of chapter 7, "Programs and Shaders" on p. 64
    starting "Shader stages including ..." with:

    Shader stages including vertex, tessellation control, tessellation
    evaluation, geometry, fragment, and compute shaders can be created,
    compiled, and linked into program objects.

    Vertex shaders describe the operations that occur on vertex attributes.
    Tessellation control and evaluation shaders are used to control
    the operation of the tessellator (see section 11.1ts). Geometry shaders
    affect the processing of primitives assembled from vertices (see section
    11.1gs). Fragment shaders affect the processing of fragments during
    rasterization (see chapter 14). A single program object can contain all
    of these shaders, or any subset thereof.

    Compute shaders ...


    Add to table 7.1 "CreateShader <type> values" on p. 65:

        <type>                     Shader Stage
        -------------------------- ------------------------------
        TESS_CONTROL_SHADER_OES    Tessellation control shader
        TESS_EVALUATION_SHADER_OES Tessellation evaluation shader


    Add to the bullet list describing reasons for link failure below the
    LinkProgram command on p. 70, as modified by OES_geometry_shader:

    * The program object contains an object to form a tessellation control
      shader (see section 11.1ts.1), and
      - the program is not separable and contains no object to form a
        vertex shader; or
      - the program is not separable and contains no object to form a
        tessellation evaluation shader; or
      - the output patch vertex count is not specified in the compiled
        tessellation control shader object.
    * The program object contains an object to form a tessellation
      evaluation shader (see section 11.1ts.3), and
      - the program is not separable and contains no object to form a
        vertex shader; or
      - the program is not separable and contains no object to form a
        tessellation control shader; or
      - the tessellation primitive mode is not specified in the compiled
        tessellation evaluation shader object.


    Modify section 7.3, "Program Objects", as modified by
    OES_geometry_shader:

    Add to the second paragraph after UseProgram on p. 71:

    The executable code ... the results of vertex and/or fragment processing
    will be undefined. However, this is not an error. If there is no active
    program for the tessellation control, tessellation evaluation, or
    geometry shader stages, those stages are ignored. If there is no active
    program for the compute shader stage ...


    Modify section 7.3.1, Program Interfaces:

    Modify table 7.2 "GetProgramResourceiv properties and supported
    interfaces" on p. 81 to add "REFERENCED_BY_TESS_CONTROL_SHADER_OES" and
    "REFERENCED_BY_TESS_EVALUATION_SHADER_OES" to the "Property" cell
    already containing REFERENCED_BY_<stage>_SHADER for VERTEX, GEOMETRY,
    FRAGMENT, and COMPUTE stages, with the same supported interfaces.

    Add to table 7.2:

      Property                                 Supported Interfaces
      ---------------------------------------- -----------------------------
      IS_PER_PATCH_OES                         PROGRAM_INPUT, PROGRAM_OUTPUT

    Add a new paragraph preceding the paragraph "For property IS_ROW_MAJOR"
    on p. 83:

    For the property IS_PER_PATCH_OES, a single integer identifying whether
    the input or output is a per-patch attribute is written to <params>. If
    the active variable is a per-patch attribute (declared with the "patch"
    qualifier), the value one is written to <params>; otherwise the value
    zero is written to <params>.


    Add tessellation shaders to the paragraph describing the REFERENCED_BY
    properties, on p. 83:

    For the properties REFERENCED_BY_VERTEX_SHADER,
    REFERENCED_BY_TESS_CONTROL_SHADER_OES,
    REFERENCED_BY_TESS_EVALUATION_SHADER_OES,
    REFERENCED_BY_GEOMETRY_SHADER_OES, REFERENCED_BY_FRAGMENT_SHADER, and
    REFERENCED_BY_COMPUTE_SHADER, a single integer is written to <params>,
    identifying whether the active resource is referenced by the vertex,
    tessellation control, tessellation evaluation, geometry, fragment, or
    compute shaders, respectively, in the program object. ...


    Modify section 7.4, "Program Pipeline Objects" in the first
    paragraph after UseProgramStages on p. 89:

    ... These stages may include vertex, tessellation control, tessellation
    evaluation, geometry, fragment, or compute, indicated respectively by
    VERTEX_SHADER_BIT, TESS_CONTROL_SHADER_BIT_OES, TESS_EVALUATION_BIT_OES,
    GEOMETRY_SHADER_BIT_OES, FRAGMENT_SHADER_BIT, or COMPUTE_SHADER_BIT. ...


    Modify section 7.4.1, "Shader Interface Matching" on p. 91, changing the
    new paragraph starting "Geometry shader per-vertex ...":

    Tessellation control shader per-vertex output variables and blocks and
    tessellation control, tessellation evaluation, and geometry shader
    per-vertex input variables are required to be declared as arrays...


    Modify section 7.4.2 "Program Pipeline Object State" on p. 92,
    replacing the first bullet point:

    * Unsigned integers are required to hold the names of the active program
      and each of the current vertex, tessellation control, tessellation
      evaluation, geometry, fragment, and compute stage programs. Each
      integer is initially zero.


    Modify section 7.6, "Uniform Variables"

    Add to table 7.4 "Query targets for default uniform block storage ..."
    on p. 96:

    Shader Stage                        <pname> for querying default uniform block
                                        storage, in components
    ----------------------------------  -------------------------------------------
    Tess. control (see sec. 11.1ts.1.1) MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES
    Tess. eval (see sec. 11.1ts.3.1)    MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES


    Add to table 7.5 "Query targets for combined uniform block storage ..."
    on p. 96:


    Shader Stage                        <pname> for querying combined uniform block
                                        storage, in components
    ----------------------------------  ---------------------------------------------------
    Tess. control                       MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES
    Tess. eval                          MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES


    Modify section 7.6.2, "Uniform Blocks" on p. 104, changing the second
    paragraph of the section:

    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, fragment, and
    compute shaders can be obtained by calling GetIntegerv with <pname>
    values of MAX_VERTEX_UNIFORM_BLOCKS,
    MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES,
    MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES, MAX_GEOMETRY_UNIFORM_BLOCKS_OES,
    MAX_FRAGMENT_UNIFORM_BLOCKS, and MAX_COMPUTE_UNIFORM_BLOCKS,
    respectively.


    Modify section 7.7, "Atomic Counter Buffers" on p. 108, changing the
    second paragraph of the section:

    There is a set of implementation-dependent maximums for the number of
    active atomic counter buffers referenced by each shader. If the number
    of atomic counter buffers referenced 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, fragment, and compute shaders can be obtained by calling
    GetIntegerv with <pname> values of MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,
    MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES,
    MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES,
    MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES,
    MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, or
    MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, respectively.


    Modify section 7.8, "Shader Buffer Variables and Shader Storage Blocks"
    on p. 110, changing the fourth paragraph:

    If the number of active shader storage blocks referenced by the shaders
    in a program exceeds implementation-dependent limits, the program will
    fail to link. The limits for vertex, tessellation control, tessellation
    evaluation, geometry, fragment, and compute shaders can be obtained by
    calling GetIntegerv with pname values of
    MAX_VERTEX_SHADER_STORAGE_BLOCKS,
    MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES,
    MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES,
    MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES,
    MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, and
    MAX_COMPUTE_SHADER_STORAGE_BLOCKS, respectively. ...


    Modify Section 7.11.1, "Shader Memory Access Ordering":

    The order in which texture or buffer object memory is read or written by
    shaders is largely undefined. For some shader types (vertex,
    tessellation evaluation, and in some cases, fragment), even the number
    of shader invocations that might perform loads and stores is undefined.

    In particular, the following rules apply:

    * While a vertex or tessellation evaluation shader will be executed at
      least once for each unique vertex specified by the application (vertex
      shaders) or generated by the tessellation primitive genertor
      (tessellation evaluation shaders), it may be executed more than once
      for implementation-dependent reasons. Additionally, ...


    Modify section 7.12, "Shader, Program, and Program Pipeline Queries"
    to add to the list of valid <pname>s for GetProgramiv on p. 120:

    If <pname> is TESS_CONTROL_OUTPUT_VERTICES_OES, the number of vertices
    in the tessellation control shader output patch is returned.

    If <pname> is TESS_GEN_MODE_OES, QUADS_OES, TRIANGLES, or ISOLINES_OES
    is returned, depending on the primitive mode declaration in the
    tessellation evaluation shader. If <pname> is TESS_GEN_SPACING_OES,
    EQUAL, FRACTIONAL_EVEN_OES, or FRACTIONAL_ODD_OES is returned, depending
    on the spacing declaration in the tessellation evaluation shader. If
    <pname> is TESS_GEN_VERTEX_ORDER_OES, CCW or CW is returned, depending
    on the vertex order declaration in the tessellation evaluation shader.
    If <pname> is TESS_GEN_POINT_MODE_OES, TRUE is returned if point mode is
    enabled in a tessellation evaluation shader declaration; FALSE is
    returned otherwise.


    Add to the Errors for GetProgramiv on p. 121:

    An INVALID_OPERATION error is generated 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.

    An INVALID_OPERATION error is generated if TESS_GEN_MODE,
    TESS_GEN_SPACING, TESS_GEN_VERTEX_ORDER, or TESS_GEN_POINT_MODE are
    queried for a program which has not been linked successfully, or which
    does not contain objects to form a tessellation evaluation shader,


    Add new section 10.1.7sp following section 10.1.7, "Separate Triangles",
    on p. 234:

    Section 10.1.7sp, Separate Patches

    Separate patches are specified with mode PATCHES_OES. A patch is an
    ordered collection of vertices used for primitive tessellation (see
    section 11.1ts). The vertices comprising a patch have no implied
    geometric ordering. The vertices of a patch are used by tessellation
    shaders and the 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 PatchParameteriOES(enum pname, int value);

    with <pname> set to PATCH_VERTICES_OES.

    Errors

    An INVALID_ENUM error is generated if <pname> is not PATCH_VERTICES_OES.

    An INVALID_VALUE error is generated if <value> is less than or equal to
    zero, or is greater than the implementation-dependent maximum patch size
    (the value of MAX_PATCH_VERTICES_OES). 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.


    Add to the end of section 10.3.4, "Primitive Restart" on p. 243:

    Implementations are not required to support primitive restart for
    separate patch primitives (primitive type PATCHES_OES). Support can be
    queried by calling GetBooleanv with the symbolic constant
    PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES. A value of FALSE indicates
    that primitive restart is treated as disabled when drawing patches, no
    matter the value of the enable. A value of TRUE indicates that primitive
    restart behaves normally for patches.


    Modify section 11.1.2.1, "Output Variables" on p. 262, starting with the
    second paragraph of the section:

    ... These output variables are used to communicate values to the next
    active stage in the vertex processing pipeline; either the tessellation
    control or geometry shader, or the fixed-function vertex processing
    stages leading to rasterization.

    ...

    The number of components (individual scalar numeric values) of output
    variables that can be written by the vertex shader, whether or not a
    tessellation control or geometry shader is active, is given by the value
    of the implementation-dependent constant MAX_VERTEX_OUTPUT_COMPONENTS.
    For the purposes of counting ...

    ...

    Each program object can specify a set of output variables from one
    shader to be recorded in transform feedback mode (see section 2.14). The
    variables that can be recorded are those emitted by the first active
    shader, in order, from the following list:

    * geometry shader
    * tessellation evaluation shader
    * vertex shader

    The set of variables to record is specified with the command

    void TransformFeedbackVaryings ...


    Modify the bullet point starting "the <count> specified" in the list of
    TransformFeedbackVaryings link failures on p. 263:

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


    Modify Section 11.1.3, Shader Execution

    Change the first paragraph and bullet list on p. 264:

    If there is an active program object present for the vertex,
    tessellation control, tessellation evaluation, or geometry shader
    stages, the executable code for those active programs is used to process
    incoming vertex values. The following sequence of operations is
    performed:

    * Vertices are processed by the vertex shader (see section 11.1) and
      assembled into primitives as described in sections 10.1 through 10.3.
    * If the current program contains a tessellation control shader, each
      individual patch primitive is processed by the tessellation control
      shader (section 11.1ts.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 11.1ts.2) and tessellation evaluation shader (see
      section 11.1ts.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, ...


    Modify the bullet list in section 11.1.3.5 "Texture Access" on p. 266 to
    add limits for tessellation shaders:

    * MAX_VERTEX_TEXTURE_IMAGE_UNITS (for vertex shaders),
    * MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES (for tessellation control
      shaders),
    * MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES (for tessellation
      evaluation shaders),
    * MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES (for geometry shaders), and
    * MAX_TEXTURE_IMAGE_UNITS (for fragment shaders).


    Modify the bullet list in section 11.1.3.6 "Atomic Counter Access" on p.
    268 to add a limit for geometry shaders:

    * MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES (for tessellation control
      shaders),
    * MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES (for tessellation evaluation
      shaders),


    Modify the bullet list in section 11.1.3.7 "Image Access" on p. 268 to
    add a limit for geometry shaders:

    * MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES (for tessellation control
      shaders),
    * MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES (for tessellation evaluation
      shaders),


    Modify the bullet list in section 11.1.3.8 "Shader Storage Buffer
    Access" on p. 268 to add a limit for geometry shaders:

    * MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES (for tessellation control
      shaders),
    * MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES (for tessellation
      evaluation shaders),


    Modify section 11.1.3.11, "Validation" to replace the bullet point
    starting "There is an active program for the geometry stage ..." on p.
    270:

    * There is an active program for tessellation control, tessellation
      evaluation, or geometry stages with corresponding executable shader,
      but there is no active program with an executable vertex shader.


    Add a new bullet point in the same section:

    * One but not both of the tessellation control and tessellation
      evaluation stages have an active program with corresponding executable
      shader.


    Insert new section 11.1ts, "Tessellation", between section 11.1 "Vertex
    Shaders" and section 11.1gs "Geometry Shaders":

    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 the active
    program object or program pipeline object includes both a tessellation
    control shader and a tessellation 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, patch primitives
    may not be provided by the application.

    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.

    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.

    Patch primitives are not supported by pipeline stages below the
    tessellation evaluation shader.

    A non-separable program object or program pipeline object that includes
    a tessellation shader of any kind must also include a vertex shader.


    Errors

    An INVALID_OPERATION error is generated by any command that transfers
    vertices to the GL if the current program state has one but not both of
    a tessellation control shader and tessellation evaluation shader.

    An INVALID_OPERATION error is generated by any command that transfers
    vertices to the GL if tessellation is active and the primitive mode is
    not PATCHES_OES.

    An INVALID_OPERATION error is generated by any command that transfers
    vertices to the GL if tessellation is not active and the primitive mode
    is PATCHES_OES.

    An INVALID_OPERATION error is generated by any command that transfers
    vertices to the GL if the current program state has a tessellation
    shader but no vertex shader.


    Section 11.1ts.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
    ES Shading Language Specification. A program will fail to link if the
    output patch vertex count is not specified by the tessellation control
    shader object attached to the program, 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_OES.

    Tessellation control shaders are created as described in section 7.1,
    using a <type> of TESS_CONTROL_SHADER_OES. 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 11.1ts.1.1, Tessellation Control Shader Variables

    Tessellation control shaders can access uniforms belonging to the
    current program object. Limits on uniform storage and methods for
    manipulating uniforms are described in section 7.6.

    Tessellation control shaders also have access to samplers to perform
    texturing operations, as described in section 7.9.

    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
    variables. Values for any inputs 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 ES Shading Language. The
    per-vertex and per-patch attributes of the output patch are used by the
    tessellation primitive generator (section 11.1ts.2) and may be read by
    tessellation evaluation shader (section 11.1ts.3).


    Section 11.1ts.1.2, Tessellation Control Shader Execution Environment

    If there is an active program for the tessellation control stage, the
    executable version of the program's 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.


    Section 11.1ts.1.2.1, Texture Access

    Section 11.1.3.1 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.


    Section 11.1ts.1.2.2, Tessellation Control Shader Inputs

    Section 7.1 ("Built-In Variables") of the OpenGL ES 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. 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
        [[ If OES_tessellation_point_size is supported: ]]
        and gl_PointSize.

    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 by the drawing command which generated the input vertices.
        The first primitive generated by a drawing command is numbered zero,
        and the primitive ID counter is incremented after every individual
        point, line, or triangle primitive is processed. The counter is
        reset to zero between each instance drawn. 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 inputs, each user-defined input 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 ES Shading Language doesn't
    support multi-dimensional arrays as shader inputs or outputs; 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.

    Similarly to the limit on vertex shader output components (see section
    11.1.2.1), there is a limit on the number of components of input
    variables that can be read by the tessellation control shader, given by
    the value of the implementation-dependent constant
    MAX_TESS_CONTROL_INPUT_COMPONENTS_OES.

    When a program is linked, all components of any input 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.

    Component counting rules for different variable types and variable
    declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS (see
    section 11.1.2.1).


    Section 11.1ts.1.2.3, Tessellation Control Shader Outputs

    Section 7.1 ("Built-In Variables") of the OpenGL ES 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. The members of each element of the gl_out[]
    array are gl_Position
        [[ If OES_tessellation_point_size is supported: ]]
        and gl_PointSize.
    They behave identically to equivalently named vertex shader outputs
    (see section 11.1.2.1).

    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 output patch size declared in the
    shader. If a size is specified, it must match the maximum patch size;
    otherwise, a compile or link error will occur. The OpenGL ES Shading
    Language doesn't support multi-dimensional arrays as shader inputs or
    outputs; 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_OES. The number of components of
    active per-patch output variables may not exceed the value of
    MAX_TESS_PATCH_COMPONENTS_OES. 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_OES.

    When a program is linked, all components of any output variable 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.

    Component counting rules for different variable types and variable
    declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS. (see
    section 11.1.2.1).


    Section 11.1ts.1.2.4, 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 ES 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 11.1ts.2, Tessellation Primitive Generation

    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. This subdivision is
    performed in an implementation- dependent manner.

    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 11.X1. 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 11.X1: 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.

    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 relevant 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 the
    implementation-dependent maximum tessellation level (the value of
    MAX_TESS_GEN_LEVEL_OES). 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 11.X1. 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 11.1ts.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 be
    rounded up to result in a two- or three-segment subdivision according to
    the tessellation spacing.

    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 11.X2.

                                                   (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 11.X2, 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 11.X2, 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 11.1ts.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
    11.X3.

                                     (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 11.X3, 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 11.X3, 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". A line 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
    segments 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>, ..., (<n>-1)/<n>.

    Each of the <n> lines 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 11.X4.

       (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 11.X4, 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 11.1ts.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. Tessellation evaluation shaders are
    created as described in section 7.1, using a <type> of
    TESS_EVALUATION_SHADER_OES.

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

    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.


    Section 11.1ts.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, except for atomic counters, 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_OES. 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_OES. 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 uniform matrix in the default uniform
    block with single-precision components will consume no more than 4 x
    min(r,c) uniform components. 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.11.6. Tessellation evaluation shaders also have
    access to samplers to perform texturing operations, as described in
    section 2.11.7.

    Tessellation evaluation shaders can access the transformed attributes of
    all vertices for their input primitive using input variables. 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. Values for any varying
    variables that are not written by a tessellation control shader are
    undefined.

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


    Section 11.1ts.3.2, Tessellation Evaluation Shader Execution Environment

    If there is an active program for the tessellation evaluation stage, the
    executable version of the program's 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.


    Section 11.1ts.3.2.1, Texture Access

    Section 11.1.3.1 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.


    Section 11.1ts.3.3, Tessellation Evaluation Shader Inputs

    Section 7.1 ("Built-In Variables") of the OpenGL ES 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 11.1.3). 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
        [[ If OES_tessellation_point_size is supported: ]]
        and gl_PointSize.

    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 11.1ts.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. 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 11.1ts.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 ES Shading Language doesn't
    support multi-dimensional arrays as shader inputs or outputs; therefore,
    user-defined tessellation evaluation shader inputs corresponding to
    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.

    Similarly to the limit on vertex shader output components (see section
    11.1.2.1), there is a limit on the number of components of 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_OES and
    MAX_TESS_PATCH_COMPONENTS_OES, 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 input 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.

    Component counting rules for different variable types and variable
    declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS (see
    section 11.1.2.1).


    Section 11.1ts.3.4, 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
        [[ If OES_tessellation_point_size is supported: ]]
        and gl_PointSize,
    and behave identically to equivalently named vertex shader outputs (see
    section 11.1.3). A tessellation evaluation shader may also declare
    user-defined per-vertex output variables.

    Similarly to the limit on vertex shader output components (see section
    11.1.2.1), 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_OES.

    When a program is linked, all components of any output 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.

    Component counting rules for different variable types and variable
    declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS. (see
    section 11.1.2.1).


    Modify section 12.1, "Transform Feedback"

    Replace the second paragraph of the section on p. 274 (as modified
    by OES_geometry_shader):

    The data captured in transform feedback mode depends on the active
    programs on each of the shader stages. If a program is active for the
    geometry shader stage, transform feedback captures the vertices of each
    primitive emitted by the geometry shader. Otherwise, if a program is
    active for the tessellation evaluation shader stage, transform feedback
    captures each primitive produced by the tessellation primitive generator,
    whose vertices are processed by the tessellation evaluation shader.
    Otherwise, transform feedback captures each primitive processed by the
    vertex shader.

    Modify the second paragraph following ResumeTransformFeedback on p. 277
    (as modified by OES_geometry_shader):

    When transform feedback is active and not paused ... 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 for the purposes of this error check. 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.
    Any primitive type may be used while transform feedback is paused.


    Modify the second paragraph of section 12.2, "Primitive Queries" on p.
    281:

    When BeginQuery is called with a target of PRIMITIVES_GENERATED_OES, ...
    This counter counts the number of primitives emitted by a geometry
    shader, if active, possibly further tessellated into separate primitives
    during the transform feedback stage, if active.


    Modify section 13.3, "Points"

    Replace the text starting "The point size is determined ..." on p. 290:

    The point size is determined by the last active stage before the
    rasterizer:

    * the geometry shader, if active; or
    * the tessellation evaluation shader, if active and no geometry shader
      is active;
    * the vertex shader, otherwise.

    If the last active stage is not a vertex shader and does not statically
    assign a value to gl_PointSize, the point size is 1.0. Otherwise, the
    point size is taken from the shader built-in gl_PointSize written by
    that stage.
      [[ Note that it is impossible to assign a value to gl_PointSize
         if OES_geometry_point_size or OES_tessellation_point_size is not
         supported and enabled in the relevant shader stages. ]]

    If the last active stage is a vertex shader, the point size is taken
    from the shader built-in gl_PointSize written by the vertex shader.

    In all cases, the point size is clamped to the implementation-dependent
    point size range. If the value written to gl_PointSize is less than or
    equal to zero, or if no value is written to gl_PointSize (except as
    noted above) the point size is undefined. The supported range ...


    Add new section A.3ts in Appendix A before section A.4, "Atomic Counter
    Invariance" on p. 405:

    Section A.3ts, 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.


Dependencies on OES_shader_multisample_interpolation

    If OES_shader_multisample_interpolation is not supported ignore all
    references to the "sample in" and "sample out" qualifiers.

New State

    Add new table 20.1ts "Current Values and Associated Data" preceding table
    20.2 on p. 354:

                                                            Default
    Get Value                         Type  Get Command     Value     Description              Sec.
    ------------------------          ----  --------------  --------- ------------------------ ------------
    PATCH_VERTICES_OES                Z+    GetIntegerv     3         Number of vertices in    10.1.7sp
                                                                      input patch

    Add to table 20.19, "Program Pipeline Object State":

                                                         Initial
    Get Value                  Type Get Command          Value    Description                      Sec
    -------------------------- ---- -------------------- -------  -------------------------------- ---
    TESS_CONTROL_SHADER_OES    Z+   GetProgramPipelineiv 0        Name of current tess. control    7.4
                                                                  shader program object
    TESS_EVALUATION_SHADER_OES Z+   GetProgramPipelineiv 0        Name of current tess. evaluation 7.4
                                                                  shader program object

    Add new table 20.25ts, "Program Object State (cont.)":

                                                         Default
    Get Value                        Type  Get Command   Value      Description                Sec.
    -------------------------------- ----  ------------  ---------  ------------------------   --------
    TESS_CONTROL_OUTPUT_VERTICES_OES Z+    GetProgramiv  0          Output patch size          11.1ts.1
                                                                    for tess. control shader
    TESS_GEN_MODE_OES                E     GetProgramiv  QUADS_OES  Base primitive type for    11.1ts.2
                                                                    tess. prim. generator
    TESS_GEN_SPACING_OES             E     GetProgramiv  EQUAL      Spacing of tess. prim.     11.1ts.2
                                                                    generator edge subdivision
    TESS_GEN_VERTEX_ORDER_OES        E     GetProgramiv  CCW        Order of vertices in       11.1ts.2
                                                                    primitives generated by
                                                                    tess. prim generator
    TESS_GEN_POINT_MODE_OES          B     GetProgramiv  FALSE      Tess prim. generator       11.1ts.2
                                                                    emits points?

    Add to table 20.28, "Program Object Resource State (cont.)":

                                                                        Initial
    Get Value                                Type  Get Command          Value   Description             Sec.
    ---------------------------------------- ----  -------------------- ------- ----------------------- -----
    REFERENCED_BY_TESS_CONTROL_SHADER_OES    Z+    GetProgramResourceiv -       Active resource used by 7.3.1
                                                                                tess. control shader?
    REFERENCED_BY_TESS_EVALUATION_SHADER_OES Z+    GetProgramResourceiv -       Active resource used by 7.3.1
                                                                                tess. eval. shader?

New Implementation Dependent State

    Add to table 20.39 "Implementation Dependent Values":

                                                                  Minimum
    Get Value                                   Type  Get Command  Value  Description                  Sec.
    ------------------------------------------- ----  ----------- ------- ---------------------------- ------
    PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES B     GetBooleanv   -     True if primitive restart is 10.3.4
                                                                          supported for patches

    Add new table 20.43ts "Implementation Dependent Tessellation Shader Limits"
    following table 6.31 "Implementation Dependent Vertex Shader Limits":

                                                                          Minimum
    Get Value                                           Type  Get Command  Value  Description                     Sec.
    -------------------------                           ----  ----------- ------- ------------------------------- ------
    MAX_TESS_GEN_LEVEL_OES                              Z+    GetIntegerv   64    Max. level supported by         11.1ts.2
                                                                                  tess. primitive generator
    MAX_PATCH_VERTICES_OES                              Z+    GetIntegerv   32    Maximum patch size              10.1
    MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES             Z+    GetIntegerv   1024  No. of words for TCS uniforms   11.1ts.1.1
    MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES          Z+    GetIntegerv   1024  No. of words for TES uniforms   11.1ts.3.1
    MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES            Z+    GetIntegerv   16    No. of tex. image units for TCS 11.1.3.5
    MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES         Z+    GetIntegerv   16    No. of tex. image units for TES 11.1.3.5
    MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES              Z+    GetIntegerv   64    No. components for per-patch    11.1ts.1.2
                                                                                  vertex outputs in TCS
    MAX_TESS_PATCH_COMPONENTS_OES                       Z+    GetIntegerv   120   No. components for per-patch    11.1ts.1.2
                                                                                  output varyings for TCS
    MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES        Z+    GetIntegerv   2048  Total no. components for TCS    11.1ts.1.2
                                                                                  outputs
    MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES           Z+    GetIntegerv   64    No. components for per-vertex   11.1ts.3.2
                                                                                  outputs in TES
    MAX_TESS_CONTROL_INPUT_COMPONENTS_OES               Z+    GetIntegerv   64    No. components for per-vertex   11.1ts.1.2
                                                                                  inputs in TCS
    MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES            Z+    GetIntegerv   64    No. components for per-vertex   11.1ts.3.2
                                                                                  inputs in TES
    MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES                 Z+    GetIntegerv   12    No. of supported uniform        7.6.2
                                                                                  blocks for TCS
    MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES              Z+    GetIntegerv   12    No. of supported uniform        7.6.2
                                                                                  blocks for TES
    MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES         Z+    GetIntegerv   0     No. of AC (atomic counter)      7.7
                                                                                  buffers accessed by a TCS
    MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES      Z+    GetIntegerv   0     No. of AC (atomic counter)      7.7
                                                                                  buffers accessed by a TES
    MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES                Z+    GetIntegerv   0     Number of ACs accessed by a TCS 11.1.3.6
    MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES             Z+    GetIntegerv   0     Number of ACs accessed by a TES 11.1.3.6
    MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES          Z+    GetIntegerv   0     No. of shader storage blocks    7.8
                                                                                  accessed by a TCS
    MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES       Z+    GetIntegerv   0     No. of shader storage blocks    7.8
                                                                                  accessed by a TES


    Add to table 20.46 "Implementation Dependent Aggregate Shader Limits"
    ([fn] is a dagger mark referring to existing text in the table caption):


                                                                          Minimum
    Get Value                                           Type  Get Command Value   Description                   Sec.
    --------------------------------------------------- ----  ----------- ------- ----------------------------- ----------
    MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES                 Z+    GetIntegerv 0       No. of image variables in TCS 11.1.3.7
                                                                                  in TCS
    MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES              Z+    GetIntegerv 0       No. of image variables in TES 11.1.3.7
    MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES    Z+    GetIntegerv [fn]    No. of words for TCS uniform  11.1ts.1.1
                                                                                  variables in all uniform
                                                                                  blocks (including default)
    MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES Z+    GetIntegerv [fn]    No. of words for TES uniform  11.1ts.3.1
                                                                                  variables in all uniform
                                                                                  blocks (including default)

    Modify existing entries in table 20.46:

                                                                          Minimum
    Get Value                                           Type  Get Command Value   Description                Sec.
    --------------------------------------------        ----  ----------- ------- -------------------------- -------
    MAX_UNIFORM_BUFFER_BINDINGS                         Z+    GetIntegerv 72      Max. no. of uniform buffer 7.6.2
                                                                                  binding points
    MAX_COMBINED_UNIFORM_BLOCKS                         Z+    GetIntegerv 60      Max. no. of uniform        7.6.2
                                                                                  buffers per program
    MAX_COMBINED_TEXTURE_IMAGE_UNITS                    Z+    GetIntegerv 96      Total no. of tex. units    11.1.3.5
                                                                                  accessible by the GL

Additions to the OpenGL ES Shading Language 3.10 Specification

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

      #extension GL_OES_tessellation_shader : <behavior>
      #extension GL_OES_tessellation_point_size : <behavior>

    where <behavior> is as specified in section 3.4.

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

      #define GL_OES_tessellation_shader 1
      #define GL_OES_tessellation_point_size 1

    If the OES_tessellation_shader extension is enabled, the
    OES_shader_io_blocks extension is also implicitly enabled.


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

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

    Unless otherwise noted in this Specification, 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: compute, vertex, tessellation control,
    tessellation evalution, geometry, or fragment.


    Add new subsections 2.ts1 and 2.ts2 preceding subsection 2.gs "Geometry
    Processor":

    Section 2.ts1, 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 ES
    Shading Language to run on this processor are called tessellation
    control shaders. When a tessellation control shader is compiled and
    linked, it results in a tessellation control shader executable that runs
    on the tessellation control processor.

    The tessellation control processor is invoked for each 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.ts2, 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 ES
    Shading Language to run on this processor are called tessellation
    evaluation shaders. When a tessellation evaluation shader is compiled
    and linked, it results in a tessellation evaluation shader executable
    that runs on the tessellation evaluation processor.

    Each invocation of the tessellation evaluation executable computes 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.


    Modifications to Section 3.7 (Keywords)

    Remove "patch" from the list of reserved keywords and add it to the list
    of keywords.


    Modify Section 4.3, Storage Qualifiers

    Add two new qualifiers to the storage qualifier table on p. 38:

    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, Input Variables

    Replace the paragraphs starting with "Geometry shader input variables
    get ..." and ending with "Fragment shader inputs get ..." on p. 40:

    Tessellation control, evaluation, and geometry shader input variables
    get the per-vertex values written out by output variables of the same
    names in the previous active (vertex) shader stage. For these inputs,
    "centroid in", "sample in", and interpolation qualifiers are allowed,
    but are equivalent to "in". Since these shader stages operate on a set
    of vertices, each input variable or input block (see section 4.3.9
    "Interface Blocks") needs to be declared as an array. For example,

       in float foo[];    // geometry shader input for vertex "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.4.1 "Input Layout Qualifiers".

    Some inputs and outputs are <arrayed>, meaning that for an interface
    between two shader stages either the input or output declaration
    requires an extra level of array indexing for the declarations to match.
    For example, with the interface between a vertex shader and a geometry
    shader, vertex shader output variables and geometry shader input
    variables of the same name must match in type and qualification (other
    than precision and "out" matching to "in"), except that the geometry
    shader will have one more array dimension than the vertex shader, to
    allow for vertex indexing. If such an arrayed interface variable is not
    declared with the necessary additional input or output array dimension,
    a link-time error will result.

    For non-arrayed interfaces (meaning array dimensionally stays the same
    between stages), it is a link-time error if the input variable is not
    declared with the same type, including array dimensionality, and
    qualification (other than precision and "out" matching to "in") as the
    matching output variable.

    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. Applying the "patch in" qualifier to inputs can only be done in
    tessellation evaluation shaders. As with other input variables,
    per-patch inputs must be declared using the same type and qualification
    (other than precision and "out" matching to "in") as per-patch outputs
    from the previous (tessellation control) shader stage.

    It is a compile-time error to use the "patch in" qualifier with inputs
    in any type of shader other than tessellation evaluation.

    Fragment shader inputs get ...


    Modify section 4.3.6 "Output Variables" starting with the third
    paragraph of the section, on p. 42:

    Vertex, tessellation evaluation, and geometry output variables output
    per-vertex data and are declared using the "out", "centroid out", or
    "sample out" storage qualifiers. Applying the "patch out" qualifier to
    an output can only be done in tessellation control shaders. Output
    variables can only be floating-point scalars, floating-point vectors,
    matrices, signed or unsigned integers or integer vectors, or arrays or
    structures of any of these.

    It is a compile-time error to use the "patch out" qualifier with outputs
    in any other type of shader other than tessellation control.

    Individual vertex, tessellation control, tessellation evaluation, and
    geometry outputs are declared as in the following examples: ...


    Following this modified language and leading into the last paragraph of
    section 4.3.6 on p. 37 (starting "Fragment outputs output
    per-fragment"), add:

    Tessellation control shader output variables are used to output
    per-vertex and per-patch data. Per-vertex output variables are arrayed
    (see "arrayed" in section 4.3.4, "Inputs") and declared using the "out",
    "centroid out", or "sample out" qualifiers; the "patch out" qualifier is
    not allowed. Per-patch output variables must be declared using the
    "patch out" qualifier. Per-vertex and per-patch output variables can
    only be floating-point scalars, vectors, or matrices, signed or unsigned
    integers or integer vectors, or arrays or structures of these. Since
    tessellation control shaders produce an arrayed 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.4.2.ts "Tessellation
    Control Outputs".

    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 a compile- or link-time error if the expression
    indicating the vertex index 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
    barrier(), its execution pauses until all other invocations have reached
    the same point of execution. 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 execute in undefined
    order between barriers, the values of per-vertex or per-patch output
    variables will sometimes be undefined. Consider the beginning and end of
    shader execution and each call to barrier() as 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, or
      * 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.
    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.

    Fragment outputs output per-fragment data and are declared ...


    Modify section 4.4.1 "Input Layout Qualifiers" to add new subsections
    4.4.1.ts and 4.4.2.ts, preceding the new subsection 4.4.1.gs "Geometry
    Shader Inputs":

    Section 4.4.1.ts, Tessellation Evaluation Inputs

    Additional 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 these identifiers, <primitive mode>, 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 these identifiers, <vertex spacing>, is used to
    specify the 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 subset of these identifiers, <ordering>, specifies whether the
    tessellation primitive generator produces triangles in clockwise or
    counter-clockwise order, according to the coordinate system depicted in
    the OpenGL ES 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.

    Finally, <point mode> is specified with the identifier "point_mode"
    indicating 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.

    The tessellation evaluation shader object in a program must declare a
    primitive mode in its input layout. Declaring vertex spacing, ordering,
    or point mode identifiers is optional. 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.


    Section 4.4.2.ts, Tessellation Control Outputs

    Other than for the transform feedback layout qualifiers, tessellation
    control shaders allow output layout qualifiers only on the interface
    qualifier "out", not on an output block, block member, or variable
    declaration. 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 a
    compile- or link-time 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 a tessellation control shader.


    Modify section 7 to add new subsections 7.1ts1 and 7.1ts2 following
    section 7.1.1 "Vertex Shader Special Variables":

    Section 7.1ts1, Tessellation Control Special Variables

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

        [[ If OES_tessellation_point_size is supported and enabled: ]]
      in gl_PerVertex {
          highp vec4 gl_Position;
          hihgp float gl_PointSize;
      } gl_in[gl_MaxPatchVertices];

        [[ Otherwise: ]]
      in gl_PerVertex {
          highp vec4 gl_Position;
      } gl_in[gl_MaxPatchVertices];

      in highp int gl_PatchVerticesIn;
      in highp int gl_PrimitiveID;
      in highp int gl_InvocationID;

        [[ If OES_tessellation_point_size is supported and enabled: ]]
      out gl_PerVertex {
          highp vec4 gl_Position;
          highp float gl_PointSize;
      } gl_out[];

        [[ Otherwise: ]]
      out gl_PerVertex {
          highp vec4 gl_Position;
      } gl_out[];

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


    Section 7.1ts1.1, Tessellation Control Input Variables

    gl_Position contains the output written in the previous shader stage to
    gl_Position.

      [[ If OES_tessellation_point_size is supported: ]]
    gl_PointSize contains the output written in the previous shader stage to
    gl_PointSize.

    gl_PatchVerticesIn contains the number of vertices in the input patch
    being processed by the shader. A single shader can read patches of
    differing sizes, so the value of gl_PatchVerticesIn may differ between
    patches.

    gl_PrimitiveID contains the number of primitives processed by the
    shader since the current set of rendering primitives was started.

    gl_InvocationID contains the number of the output patch vertex assigned
    to the tessellation control shader invocation. It is assigned integer
    values in the range [0, N-1], where N is the number of output patch
    vertices per primitive.


    Section 7.1ts1.2, Tessellation Control Output Variables

    gl_Position is used in the same fashion as the
    corresponding output variable in the vertex shader.

      [[ If OES_tessellation_point_size is supported: ]]
    gl_PointSize is used in the same fashion as the corresponding output
    variable in the vertex shader.

    The values written to gl_TessLevelOuter and gl_TessLevelInner 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.


    Section 7.1ts2, Tessellation Evaluation Special Variables

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

        [[ If OES_tessellation_point_size is supported and enabled: ]]
      in gl_PerVertex {
          highp vec4 gl_Position;
          highp float gl_PointSize;
      } gl_in[gl_MaxPatchVertices];

        [[ Otherwise: ]]
      in gl_PerVertex {
          highp vec4 gl_Position;
      } gl_in[gl_MaxPatchVertices];

      in highp int gl_PatchVerticesIn;
      in highp int gl_PrimitiveID;
      in highp vec3 gl_TessCoord;
      patch in highp float gl_TessLevelOuter[4];
      patch in highp float gl_TessLevelInner[2];

        [[ If OES_tessellation_point_size is supported and enabled: ]]
      out gl_PerVertex {
          highp vec4 gl_Position;
          hihgp float gl_PointSize;
      };

        [[ Otherwise: ]]
      out gl_PerVertex {
          highp vec4 gl_Position;
      };

    Section 7.1ts2.1, Tessellation Evaluation Input Variables

    gl_Position contains the output written in the previous shader stage to
    gl_Position.

      [[ If OES_tessellation_point_size is supported: ]]
    gl_PointSize contains the output written in the previous shader stage to
    gl_PointSize.

    gl_PatchVerticesIn and gl_PrimitiveID are defined in the same fashion as
    the corresponding input variables in the tessellation control shader.

    gl_TessCoord 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. Its values will obey the properties

      gl_TessCoord.x == 1.0 - (1.0 - gl_TessCoord.x) // two operations performed
      gl_TessCoord.y == 1.0 - (1.0 - gl_TessCoord.y) // two operations performed
      gl_TessCoord.z == 1.0 - (1.0 - gl_TessCoord.z) // two operations performed

    gl_TessLevelOuter and gl_TessLevelInner are filled with the corresponding
    output variables written by the active tessellation control shader.


    Section 7.1ts2.2, Tessellation Evaluation Output Variables

    gl_Position is used in the same fashion as the
    corresponding output variable in the vertex shader.

      [[ If OES_tessellation_point_size is supported: ]]
    gl_PointSize is used in the same fashion as the corresponding output
    variable in the vertex shader.


    Add to Section 7.2 "Built-In Constants", matching the
    corresponding API implementation-dependent limits:

      const mediump int gl_MaxTessControlInputComponents = 64;
      const mediump int gl_MaxTessControlOutputComponents = 64;
      const mediump int gl_MaxTessControlTextureImageUnits = 16;
      const mediump int gl_MaxTessControlUniformComponents = 1024;
      const mediump int gl_MaxTessControlTotalOutputComponents = 2048;

      const mediump int gl_MaxTessEvaluationInputComponents = 64;
      const mediump int gl_MaxTessEvaluationOutputComponents = 64;
      const mediump int gl_MaxTessEvaluationTextureImageUnits = 16;
      const mediump int gl_MaxTessEvaluationUniformComponents = 1024;

      const mediump int gl_MaxTessPatchComponents = 120;

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

    Modify gl_MaxCombinedTextureImageUnits to match the API:

      const mediump int gl_MaxCombinedTextureImageUnits = 96;


    Modify section 8.15 "Shader Invocation Control Functions":

    The shader invocation control function is only available in tessellation
    control and compute shaders. It is used to control the relative
    execution order of multiple shader invocations used to process a patch
    (in the case of tessellation control shaders) or a workgroup (in
    the case of compute shaders), which are otherwise executed with an
    undefined order.

    +------------------+---------------------------------------------------------------+
    | Syntax           | Description                                                   |
    +------------------+---------------------------------------------------------------+
    | void             | For any given static instance of barrier(), all               |
    | barrier(void)    | tessellation control shader invocations for a single input    |
    |                  | patch, or all compute shader invocations for a single work    |
    |                  | group must enter it before any will continue beyond it.       |
    +------------------+---------------------------------------------------------------+

    The function barrier() provides a partially defined order of execution
    between shader invocations. This ensures that values written by one
    invocation prior to a given static instance of barrier() can be safely
    read by other invocations after their call to the same static instance
    barrier(). Because invocations may execute in an undefined order between
    these barrier calls, the values of a per-vertex or per-patch output
    variable for tessellation control shaders, or the values of shared
    variables for compute shaders will be undefined in a number of cases
    enumerated in section 4.3.6 "Output Variables" (for tessellation control
    shaders) and section 4.3.7 "Shared Variables" (for compute shaders).

    For tessellation control shaders, the barrier() function may only be
    placed inside the function main() of the shader and may not be called
    within any control flow. Barriers are also disallowed after a return
    statement in the function main(). Any such misplaced barriers result in
    a compile-time error.

    For compute shaders, the barrier() function ...


Issues

    Note: These issues apply specifically to the definition of the
    OES_tessellation_shader specification, which is based on the OpenGL
    extension ARB_tessellation_shader as updated in OpenGL 4.x. Resolved
    issues from ARB_tessellation_shader have been removed, but remain
    largely applicable to this extension. ARB_tessellation_shader can be
    found in the OpenGL Registry.

    (1) What functionality was removed from ARB_tessellation_shader?

        Very little. Tessellation shaders are largely self-contained
        functionality and the only removed interactions with features not
        supported by the underlying OpenGL ES 3.1 API and Shading Language
        were:
          * Fixed-function inputs and outputs present only in the GL
            compatibility profile.
          * gl_ClipDistance shader inputs and outputs.
          * While multi-dimensional arrays are supported by GLSL-ES 3.10,
            they are explicitly not supported
            as shader inputs and outputs, and that decision is respected
            here.
          * Using a tessellation evaluation shader without a tessellation
            control shader is not allowed. See issue 13.
          * PATCH_DEFAULT_*_LEVEL parameters (issue 13).

    (2) What functionality was changed and added relative to
        ARB_tessellation_shader?

      - OES_tessellation_shader closely matches OpenGL 4.4 tessellation
        shader language, rather than ARB_tessellation_shader language.
      - Spec language is now based off of changes introduced by
        OES_geometry_shader, especially with regard to input and output
        blocks.
      - Note that although this spec mentions quad primitives repeatedly,
        this is not inconsistent with the lack of support for QUADS drawing
        primitives in OpenGL ES. The quad primitives discussed here occur
        only during patch tessellation and are emitted as triangles to later
        stages of the pipeline.
      - Writing point size from tessellation shaders is optional functionality.
        If it's not supported or written, the point size of 1.0 is used.
      - Added precision qualifiers to builtins.
      - ARB_tessellation_shader required that the tessellation primitive
        generator reject a patch when any outer tessellation level contained a
        NaN, even if the outer tessellation level is irrelevant for the
        primitive type. As that was likely unintended (see Khronos bug 11484),
        OES_tessellation_shader only rejects patches if relevant outer
        tessellation levels contain NaN.
      - Added program interface query properties relevant to tessellation
        shaders.

    (3) Are any grammar additions required in chapter 9?

    Probably, but such changes are not included in the original
    ARB_tessellation_shader extension, either. TBD.

    (4) Should GetActiveUniformBlockiv
        support queries for uniform blocks and atomic counter buffers
        referenced by tessellation shaders?

    RESOLVED: No. Use the new generic query interface supported by
    OpenGL ES 3.1, following the resolution for other features such as
    compute shaders, which also dropped these legacy tokens / queries.

    (5) How are aggregate shader limits computed?

    RESOLVED: Following the GL 4.4 model, but we restrict uniform
    buffer bindings to 12/stage instead of 14, this results in

        MAX_UNIFORM_BUFFER_BINDINGS = 72
            This is 12 bindings/stage * 6 shader stages, allowing a static
            partitioning of the bindings even though at most 5 stages can
            appear in a program object).
        MAX_COMBINED_UNIFORM_BLOCKS = 60
            This is 12 blocks/stage * 5 stages, since compute shaders can't
            be mixed with other stages.
        MAX_COMBINED_TEXTURE_IMAGE_UNITS = 96
            This is 16 textures/stage * 6 stages.

    Khronos internal bugs 5870, 8891, and 9424 cover the ARB's thinking on
    these limits for GL 4.0 and beyond.

    (6) Are arrays supported as shader inputs and outputs?

    RESOLVED: No. In several places in the tessellation and geometry API
    language based on GL 4.4, it says that "the OpenGL ES Shading Language
    doesn't support multi-dimensional arrays" and restricts declarations of
    inputs and outputs which are array members to blocks themselves declared
    as arrays.

    Strictly speaking this is no longer true. GLSL-ES 3.10 supports
    multi-dimensional arrays, but also notes in issue 0 that "arrays of
    arrays are not allowed as shader inputs or outputs."

    Given this constraint, and since the same constraint is in OpenGL 4.4, I
    propose we resolve this by continuing to limit array inputs and outputs
    in this fashion, and change the language to "...doesn't support
    multi-dimensional arrays as shader inputs or outputs".

    (7) What component counting rules are used for inputs and outputs?

    RESOLVED: In several places I've inserted language from OpenGL 4.4 to
    the effect of

       "Component counting rules for different variable types and variable
        declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS (see
        section 11.1.2.1)."

    I think this is essentially cleaning up an oversight in the earlier ARB
    extension language but it is a bit orthogonal to the extension
    functionality and I'm bringing it up in case this is a potential issue.

    (8) What component counting rules are used for the default
    uniform block?

    RESOLVED: In several places I've inserted language from OpenGL 4.2 to
    the effect of

       "A uniform matrix in the default uniform block with single-precision
        components will consume no more than 4 x min(r,c) uniform
        components."

    This is based on bug 5432 and is language that was later expanded in
    OpenGL 4.4 and refactored into the generic "Uniform Variables" section,
    which is something we should consider in the OES extensions as well to
    avoid duplication. I believe it is what we want but am noting it for the
    same reason as the language in issue (8). I'm hoping to be able to
    include this refactored language into the OpenGL ES 3.1 Specification,
    so we can refer to it more easily here. Tracking bug 11192 has been
    opened for this and this language was approved there.

    (9) The edits on section 4.4.1.ts (Tessellation Evaluation Inputs)
    says that "Any or all of these identifiers may be specified one or more
    times in a single input layout declaration." Do we need to add in the
    language from GLSL 4.40 Section 4.4 "Layout Qualifiers" that defines this?

    RESOLVED: ES 3.1 will be picking up the relaxed qualifier ordering
    and it is presumed that this language will be coming along with it.
    In any case, the OES_shader_io_blocks extension clarifies this.

    (10) Due to HW limitations, some vendors may not be able
    to support writing gl_PointSize from tessellation shaders, how should we
    accomodate this?

    RESOLVED: There are two extensions described in this document. The
    base extension does not support writing to gl_PointSize from tessellation
    shaders and the gl_PerVertex block does not include gl_PointSize.
    Additionally there is a layered extension which provides the ability
    to write to gl_PointSize from tessellation shaders.  When this extension
    is enabled, the gl_PerVertex block does include gl_PointSize and it
    can be written from a tessellation control or evaluation shader as normal.

    If the point-size extension is not supported, all points written
    from a tessellation shader will have size of one. If the point-size
    extension is supported but not enabled, or if it's enabled but
    gl_PointSize is not written, it as if a point size of one was written.
    Otherwise, if you statically assign gl_PointSize in the last stage
    before the rasterizer, the (potentially clamped) value written will
    determine the size of the point for rasterization.

    (11) Do we need a separate point_size extension from the one included
    in OES_geometry_shader or can we use the some one?

    RESOLVED. We will use a separate extension to allow for maximum
    implementation flexibility.

    (12) Can a tessellation evaluation shader be used without a tessellation
    control shader?

    RESULT: No. This isn't allowed in other graphics APIs, and some vendors
    designed hardware based on those APIs. Attempts to draw with only one of the
    two tessellation shaders active results in an INVALID_OPERATION error.
    Vendors that designed hardware for ARB_tessellation_shader or versions of
    OpenGL that included it may choose to relax this restriction via extension.
    One implication of this is that the default tessellation levels are useless,
    since an active tessellation control shader always overrides them, so they
    are not included in this spec.

    (13) What happens if you use "patch out" in a tessellation evaluation
    shader or "patch in" in a tessellation control shader?

    RESOLVED.  GLSL 4.40 spec only says "Applying the patch qualifier to
    inputs can only be done in tessellation evaluation shaders." and
    "Applying patch to an output can only be done in a tessellation control
    shader."  There is also a statement that says "It is a compile-time error
    to use patch in a fragment shader."  In Bug 11527 the ARB decided this
    should be a compile-time error as this can be determined by solely by
    looking at variable declaration.

    (14) Do we need to make accommodations for tile-based implementations?

    RESOLVED.  Yes, but it will be done as a separate extension as it is
    applicable to more than just tessellation shaders.

    (15) Can inputs and outputs from tessellation shaders be arrays of
    structures?

    RESOLVED. Yes they can.  OpenGL ES 3.1 disallows passing arrays of
    structures between stages. However, since vertex shader outputs
    can be structures we need to add the extra level of
    array-ness when these are accessed from a tessellation control shader.
    Similarly this applies to outputs from a tessellation control shader
    and inputs to a tessellation evaluation shader. However as in GL,
    arrays of arrays are not supported.

    (16) 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
    ----  ----------  --------- -------------------------------------------------
     7    12/10/2018  Jon Leech Use 'workgroup' consistently throughout (Bug
                                11723, internal API issue 87).

     6    05/31/2016  Jon Leech Note that primitive ID counters are reset to zero
                                after each instance drawn (Bug 14024).

     5    04/29/2016  Jon Leech Fix GLSL-ES built-in constants to match API
                                limits (Bug 12823).

     4    04/27/2016  Jon Leech Reduce minimum value of
                                MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS
                                from 4096 to 2048 (Bug 12823).

     3    07/23/2015  Jon Leech Reduce minimum value of
                                MAX_TESS_{CONTROL,EVALUATION}_{IN,OUT}PUT_COMPONENTS
                                to 64 (Bug 12823)

     2    05/05/2015  dkoch     Remove "per-patch" part of description of
                                MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS
                                (Bug 13765).
                                Allow arrays for both per-patch and per-vertex
                                TCS outputs (Bug 13658).
                                Fix typo in issue 15 suggesting that VS outputs
                                could be an array of structures (Bug 13824).

     1    06/18/2014  dkoch     Initial OES version based on EXT.
                                No functional changes.
