Loading [MathJax]/extensions/tex2jax.js
  • <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • NVIDIA DRIVE OS Linux SDK API Reference

    6.0.4 Release
    All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
    GL_EXT_geometry_shader
    Name
    
        EXT_geometry_shader
    
    Name String
    
        GL_EXT_geometry_shader
        GL_EXT_geometry_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)
        Slawomir Grajewski, Intel
        Dominik Witczak, Mobica
        Jesse Hall, Google
        Maurice Ribble, Qualcomm
        Bill Licea-Kane, Qualcomm
        Graham Connor, Imagination
        Ben Bowman, Imagination
        Jonathan Putsman, Imagination
        Contributors to ARB_geometry_shader4
    
    Notice
    
        Copyright (c) 2008-2016 The Khronos Group Inc. Copyright terms at
            http://www.khronos.org/registry/speccopyright.html
    
        Portions Copyright (c) 2013-2014 NVIDIA Corporation.
    
    Status
    
        Complete.
    
    Version
    
        Last Modified Date: May 31, 2016
        Revision: 21
    
    Number
    
        OpenGL ES Extension #177
    
    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.
    
        EXT_shader_io_blocks is required.
    
        OES_sample_variables trivially affects the definition of this extension.
    
        OES_texture_storage_multisample_2d_array affects the definition of this
        extension.
    
        OES_shader_multisample_interpolation trivially affects the definition of
        this extension.
    
        EXT_texture_buffer trivially affects the definition of this extension.
    
    Overview
    
        EXT_geometry_shader defines a new shader type available to be run on the
        GPU, called a geometry shader. Geometry shaders are run after vertices are
        transformed, but prior to color clamping, flatshading and clipping.
    
        A geometry shader begins with a single primitive (point, line,
        triangle). It can read the attributes of any of the vertices in the
        primitive and use them to generate new primitives. A geometry shader has a
        fixed output primitive type (point, line strip, or triangle strip) and
        emits vertices to define a new primitive. A geometry shader can emit
        multiple disconnected primitives. The primitives emitted by the geometry
        shader are clipped and then processed like an equivalent primitive
        specified by the application.
    
        Furthermore, EXT_geometry_shader provides four additional primitive
        types: lines with adjacency, line strips with adjacency, separate
        triangles with adjacency, and triangle strips with adjacency.  Some of the
        vertices specified in these new primitive types are not part of the
        ordinary primitives, instead they represent neighboring vertices that are
        adjacent to the two line segment end points (lines/strips) or the three
        triangle edges (triangles/tstrips). These vertices can be accessed by
        geometry shaders and used to match up the vertices emitted by the geometry
        shader with those of neighboring primitives.
    
        Since geometry shaders expect a specific input primitive type, an error
        will occur if the application presents primitives of a different type.
        For example, if a geometry shader expects points, an error will occur at
        drawing time if a primitive mode of TRIANGLES is specified.
    
        This extension also adds the notion of layered framebuffer attachments
        and framebuffers that can be used in conjunction with geometry shaders
        to allow programs to direct primitives to a face of a cube map or layer
        of a three-dimensional texture or two-dimensional array texture. The
        layer used for rendering can be selected by the geometry shader at run
        time. The framebuffer layer count present in GL 4.x and removed from
        ES 3.1 is restored.
    
        Not all geometry shader implementations have the ability to write the
        point size from a geometry shader. Thus a second extension string and
        shading language enable are provided for implementations which do
        support geometry shader point size.
    
        This extension relies on the EXT_shader_io_blocks extension to provide
        the required functionality for declaring input and output blocks and
        interfacing between shaders.
    
    New Procedures and Functions
    
        void FramebufferTextureEXT(enum target, enum attachment,
                                   uint texture, int level);
    
    New Tokens
    
        Accepted by the <type> parameter of CreateShader and
        CreateShaderProgramv, by the <pname> parameter of
        GetProgramPipelineiv and returned in the <params> parameter of
        GetShaderiv when <pname> is SHADER_TYPE:
    
            GEOMETRY_SHADER_EXT                             0x8DD9
    
        Accepted by the <stages> parameter of UseProgramStages:
    
            GEOMETRY_SHADER_BIT_EXT                         0x00000004
    
        Accepted by the <pname> parameter of GetProgramiv:
    
            GEOMETRY_LINKED_VERTICES_OUT_EXT                0x8916
            GEOMETRY_LINKED_INPUT_TYPE_EXT                  0x8917
            GEOMETRY_LINKED_OUTPUT_TYPE_EXT                 0x8918
            GEOMETRY_SHADER_INVOCATIONS_EXT                 0x887F
    
        Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
        GetFloatv, and GetInteger64v:
    
            LAYER_PROVOKING_VERTEX_EXT                      0x825E
            MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT             0x8DDF
            MAX_GEOMETRY_UNIFORM_BLOCKS_EXT                 0x8A2C
            MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT    0x8A32
            MAX_GEOMETRY_INPUT_COMPONENTS_EXT               0x9123
            MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT              0x9124
            MAX_GEOMETRY_OUTPUT_VERTICES_EXT                0x8DE0
            MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT        0x8DE1
            MAX_GEOMETRY_SHADER_INVOCATIONS_EXT             0x8E5A
            MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT            0x8C29
            MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT         0x92CF
            MAX_GEOMETRY_ATOMIC_COUNTERS_EXT                0x92D5
            MAX_GEOMETRY_IMAGE_UNIFORMS_EXT                 0x90CD
            MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT          0x90D7
    
        Returned in the <data> parameter from a Get query with a <pname> of
        LAYER_PROVOKING_VERTEX_EXT:
    
            FIRST_VERTEX_CONVENTION_EXT                     0x8E4D
            LAST_VERTEX_CONVENTION_EXT                      0x8E4E
            UNDEFINED_VERTEX_EXT                            0x8260
    
        Accepted by the <target> parameter of BeginQuery, EndQuery,
        GetQueryiv, and GetQueryObjectuiv:
    
            PRIMITIVES_GENERATED_EXT                        0x8C87
    
        Accepted by the <mode> parameter of DrawArrays, DrawElements,
        and other commands which draw primitives:
    
            LINES_ADJACENCY_EXT                             0xA
            LINE_STRIP_ADJACENCY_EXT                        0xB
            TRIANGLES_ADJACENCY_EXT                         0xC
            TRIANGLE_STRIP_ADJACENCY_EXT                    0xD
    
        Accepted by the <pname> parameter of FramebufferParameteri,
        and GetFramebufferParameteriv:
    
            FRAMEBUFFER_DEFAULT_LAYERS_EXT                  0x9312
    
        Accepted by the <pname> parameter of GetIntegerv, GetBooleanv,
        GetInteger64v, and GetFloatv:
    
            MAX_FRAMEBUFFER_LAYERS_EXT                      0x9317
    
        Returned by CheckFramebufferStatus:
    
            FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT        0x8DA8
    
        Accepted by the <pname> parameter of
        GetFramebufferAttachmentParameteriv:
    
            FRAMEBUFFER_ATTACHMENT_LAYERED_EXT              0x8DA7
    
        Accepted by the <props> parameter of
        GetProgramResourceiv:
    
            REFERENCED_BY_GEOMETRY_SHADER_EXT               0x9309
    
    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. 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" to insert a
        new box "Geometry Shader" following "Vertex Shader" and preceding
        "Rasterization". Connect the Geometry Shader box to Transform Feedback
        and Rasterization boxes, and remove the connection from Vertex Shader to
        Transform Feedback. Extend the arrows from the boxes "Image Load/Store"
        .. "Uniform Block" to the right of "Vertex Shader" to connect to the new
        "Geometry Shader" box.
    
    
        Modify section 4.2, "Query Objects and Asynchronous Queries" on p. 36
        to add to the bullet list of supported query types
    
        * Primitive queries with a target of PRIMITIVES_GENERATED_EXT (see
          section 12.2) return information on the number of primitives processed
          by the GL.
    
    
        Replace the two paragraphs of chapter 7, "Programs and Shaders"
        on p. 64 starting "Shader stages including ..." with:
    
        Shader stages including vertex, geometry, fragment, and compute shaders
        can be created, compiled, and linked into program objects.
    
        Vertex shaders describe the operations that occur on vertex attributes.
        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
            -------------------     ---------------
            GEOMETRY_SHADER_EXT     Geometry shader
    
    
        Change bullet list describing reasons for link failure below the
        LinkProgram command on p. 70:
    
        ... Linking can fail for a variety of reasons as specified in the OpenGL
        ES Shading Language Specification, as well as any of the following
        reasons:
    
        * One or more of the shader objects attached to <program> are not
          compiled successfully.
        * More active uniform or active sampler variables are used in <program>
          than allowed (see sections 7.6 and 7.9).
        * The shaders do not use the same shader language version.
        * <program> contains objects to form a geometry shader (see section
          11.1gs), and
          - <program> is not separable and contains no objects to form a
            vertex shader; or
          - the input primitive type, output primitive type, or maximum output
            vertex count is not specified in the compiled geometry shader
            object.
        * <program> contains objects to form a compute shader (see section 17)
          and
          - <program> also contains objects to form any other type of shader.
    
        If LinkProgram failed, ...
    
    
        Modify section 7.3, "Program Objects":
    
        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 geometry shader stage, that stage is 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_GEOMETRY_SHADER_EXT" to the
        "Property" cell already containing REFERENCED_BY_<stage>_SHADER for
        VERTEX, FRAGMENT, and COMPUTE stages, with the same supported
        interfaces.
    
    
        Add geometry shaders to the paragraph describing the REFERENCED_BY
        properties, on p. 83:
    
        For the properties REFERENCED_BY_VERTEX_SHADER,
        REFERENCED_BY_GEOMETRY_SHADER_EXT, 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,
        geometry, fragment, or compute shaders, respectively, in the program
        object. ...
    
    
        Modify section 7.4, "Program Pipeline Objects" in the first paragraph
        paragraph after UseProgramStages on p. 89:
    
        ... These stages may include vertex, geometry, fragment, or compute,
        indicated respectively by VERTEX_SHADER_BIT, GEOMETRY_SHADER_BIT_EXT,
        FRAGMENT_SHADER_BIT, or COMPUTE_SHADER_BIT. ...
    
    
        Modify section 7.4.1, "Shader Interface Matching" on p. 91, changing
        the second paragraph and adding a new paragraph:
    
        Variables and block members declared as structures ... in the OpenGL ES
        Shading Language Specification.
    
        Geometry shader per-vertex input variables and blocks are required to be
        declared as arrays, with each element representing input or output
        values for a single vertex of a multi-vertex primitive. For the purposes
        of interface matching, such variables and blocks are treated as though
        they were not declared as arrays.
    
        For program objects containing multiple shaders...
    
    
        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, 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
        ----------------------------    -------------------------------------------
        Geometry (see sec. 11.1gs.3)    MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT
    
    
        Add to table 7.5 "Query targets for combined uniform block storage ..."
        on p. 97:
    
    
        Shader Stage                    <pname> for querying combined uniform block
                                        storage, in components
        ----------------------------    --------------------------------------------
        Geometry                        MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT
    
    
        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, geometry,
        fragment, and compute shaders can be obtained by calling GetIntegerv
        with <pname> values of MAX_VERTEX_UNIFORM_BLOCKS,
        MAX_GEOMETRY_UNIFORM_BLOCKS_EXT, 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, geometry, fragment, and compute shaders can be
        obtained by calling GetIntegerv with <pname> values of
        MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,
        MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT,
        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, geometry, fragment, and compute
        shaders can be obtained by calling GetIntegerv with pname values of
        MAX_VERTEX_SHADER_STORAGE_BLOCKS,
        MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT,
        MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, and
        MAX_COMPUTE_SHADER_STORAGE_BLOCKS, respectively. Additionally, a ...
    
    
        Modify section 7.11.1 "Shader Memory Access Ordering" on p. 113 to add
        to the list of ordering rules:
    
        * The relative order of invocations of different shader types is largely
          undefined. However, when executing a shader whose inputs are generated
          from a previous programmable stage, the shader invocations from the
          previous stage are guaranteed to have executed far enough to generate
          final values for all next-stage inputs. That implies shader completion
          for all stages except geometry; geometry shaders are guaranteed only
          to have executed far enough to emit all needed vertices.
    
    
        Modify section 7.12, "Shader, Program, and Program Pipeline Queries"
        to add to the list of valid <pname>s for GetProgramiv on p. 121:
    
        If <pname> is GEOMETRY_LINKED_VERTICES_OUT_EXT, the maximum number of
        vertices the geometry shader will output is returned.
    
        If <pname> is GEOMETRY_LINKED_INPUT_TYPE_EXT, the geometry shader input
        type, which must be one of POINTS, LINES, LINES_ADJACENCY_EXT, TRIANGLES
        or TRIANGLES_ADJACENCY_EXT, is returned.
    
        If <pname> is GEOMETRY_LINKED_OUTPUT_TYPE_EXT, the current geometry shader
        output type, which must be one of POINTS, LINE_STRIP or TRIANGLE_STRIP,
        is returned.
    
        If <pname> is GEOMETRY_SHADER_INVOCATIONS_EXT, the number of geometry
        shader invocations per primitive will be returned.
    
    
        Add to the Errors for GetProgramiv on p. 121:
    
        An INVALID_OPERATION error is generated if
        GEOMETRY_LINKED_VERTICES_OUT_EXT, GEOMETRY_LINKED_INPUT_TYPE_EXT,
        GEOMETRY_LINKED_OUTPUT_TYPE_EXT, or GEOMETRY_SHADER_INVOCATIONS_EXT are
        queried for a program which has not been linked successfully, or which
        does not contain objects to form a geometry shader,
    
    
        Modify section 7.13 "Required State" to change the last two paragraphs
        of the section on p. 127:
    
        This list of program object state is not complete. Tables 20.20-20.28
        describe additional program object state specific to program binaries,
        geometry shaders, and uniform blocks.
    
        Table 20.29 describes state related to vertex and geometry shaders that
        is not program object state.
    
    
        Modify section 9.2, "Binding and Managing Framebuffer Objects" to add to
        the list of bullet points for BindFramebuffer on p. 205:
    
        * If the number of layers of each attachment are not all identical,
          rendering will be limited to the smallest number of layers of any
          attachment. If there are no attachments, the number of layers will be
          taken from the framebuffer object's default layer count.
    
    
        Modify section 9.2.1, "Framebuffer Object Parameters" to replace the
        second and third paragraphs of the section, adding default and maximum
        layer counts to FramebufferParameteri, on p. 206 and p. 207:
    
        When a framebuffer has one or more attachments, the width, height, layer
        count (section 9.7gs), sample count, and sample location pattern of the
        framebuffer are derived from the properties of the framebuffer
        attachments. When the framebuffer has no attachments, these properties
        are taken from framebuffer parameters. When <pname> is
        FRAMEBUFFER_DEFAULT_WIDTH, FRAMEBUFFER_DEFAULT_HEIGHT,
        FRAMEBUFFER_DEFAULT_LAYERS_EXT, FRAMEBUFFER_DEFAULT_SAMPLES, or
        FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS, the value in <param>
        specifies the width, height, layer count, sample count, or sample
        location pattern, respectively, used when the framebuffer has no
        attachments.
    
        When a framebuffer has no attachments, it is considered layered (section
        9.7gs) if and only if the value of FRAMEBUFFER_DEFAULT_LAYERS_EXT is
        non-zero. It is considered to have sample buffers ...
    
    
        Modify the error for invalid parameter values on p. 207 to add
        layer counts:
    
        An INVALID_VALUE error is generated if <pname> is
        FRAMEBUFFER_DEFAULT_WIDTH, FRAMEBUFFER_DEFAULT_HEIGHT,
        FRAMEBUFFER_DEFAULT_LAYERS_EXT, or FRAMEBUFFER_DEFAULT_SAMPLES, and
        <param> is either negative or greater than the value of the
        corresponding implementation-dependent limits MAX_FRAMEBUFFER_WIDTH,
        MAX_FRAMEBUFFER_HEIGHT, MAX_FRAMEBUFFER_LAYERS_EXT, or
        MAX_FRAMEBUFFER_SAMPLES, respectively.
    
    
        Replace the bullet list in section 9.2.2, "Attaching Images to
        Framebuffer Objects" on p. 208:
    
        There are several types of framebuffer-attachable images:
    
        * The image of a renderbuffer object, which is always two-dimensional.
        * A single level of a two-dimensional or two-dimensional multisample
          texture.
        * A single face of a cube map texture level, which is treated as a
          two-dimensional image.
        * A single layer of a two-dimensional array texture, two-dimensional
          multidimensional array texture, or three-dimensional texture, which is
          treated as a two-dimensional image.
    
        Additionally, an entire level of a three-dimensional, cube map,
        two-dimensional array, or two-dimensional multisample array texture can
        be attached to an attachment point. Such attachments are treated as an
        array of two-dimensional images, arranged in layers, and the
        corresponding attachment point is considered to be <layered> (also see
        section 9.7gs)
    
    
        Modify section 9.2.3, "Framebuffer Object Queries"
    
        In the description of GetFramebufferAttachmentParameteriv for texture
        attachments, replace the bullet point for
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER on p. 210:
    
        * If <pname> is FRAMEBUFFER_ATTACHMENT_LAYERED_EXT then <params> will
          contain TRUE if an entire level of a three-dimensional, cube map,
          two-dimensional array, or two-dimensional multisample array texture is
          attached. Otherwise, <params> will contain FALSE.
        * If pname is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER; the value of
          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is the name of a three-dimensional,
          or a two-dimensional array texture; and the value of
          FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is FALSE, then <params> will
          contain the value of the texture layer which contains the attached
          image.
    
    
        Modify section 9.2.8, "Attaching Texture Images to a Framebuffer" on
        p. 217:
    
        The GL supports copying the rendered contents of the framebuffer into
        the images of a texture object through the use of the routines
        CopyTexImage* and CopyTexSubImage*. Additionally, the GL supports
        rendering directly into the images of a texture object.
    
        To render directly into a texture image, a specified level of a texture
        object can be attached as one of the logical buffers of the currently
        bound framebuffer object by calling
    
          void FramebufferTextureEXT(enum target, enum attachment,
                                     uint texture, int level);
    
        <target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or FRAMEBUFFER.
        FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. <attachment> must be one
        of the attachment points of the framebuffer listed in table 9.1.
    
        If <texture> is non-zero, the specified mipmap <level> of the texture
        object named <texture> is attached to the framebuffer attachment point
        named by <attachment>.
    
        If <texture> is the name of a three-dimensional texture, cube map
        texture, two-dimensional array, or two-dimensional multisample array
        texture, the texture level attached to the framebuffer attachment point
        is an array of images, and the framebuffer attachment is considered
        <layered>.
    
        Errors
    
        An INVALID_ENUM error is generated if <target> is not DRAW_FRAMEBUFFER,
        READ_FRAMEBUFFER, or FRAMEBUFFER.
    
        An INVALID_ENUM error is generated if <attachment> is not one of the
        attachments in table 9.1.
    
        An INVALID_OPERATION error is generated if zero is bound to <target>.
    
        An INVALID_VALUE error is generated if <texture> is not the name of a
        texture object, or if <level> is not a supported texture level for
        <texture>.
    
        An INVALID_OPERATION error is generated if <texture> is the name of a
        buffer texture.
    
    
        Additionally, a specified image from a texture object can be attached as
        one of the logical buffers of a currently bound framebuffer object by
        calling
    
          void FramebufferTexture2D
    
        ...
    
        The command
    
          void FramebufferTextureLayer(enum target, enum attachment,
                                       uint texture, int level, int layer);
    
        operates similarly to FramebufferTexture2D, except that it attaches a
        single layer of a three-dimensional, two-dimensional array, or
        two-dimensional multisample array texture level.
    
        <target> and <attachment> are specified with the same values, and have
        the same meanings as the corresponding arguments of
        FramebufferTexture2D.
    
        <level> specifies the mipmap level of the texture image to be attached
        to the framebuffer.
    
        If <texture> is a three-dimensional texture, then <level> must be
        greater than or equal to zero and less than or equal to log2 of the
        value of MAX_3D_TEXTURE_SIZE. If <texture> is a two-dimensional array
        texture, then <level> must be greater than or equal to zero and no
        larger than log2 of the value of MAX_TEXTURE_SIZE. If <texture> is a
        two-dimensional multisample array texture, then <level> must be zero.
    
        <layer> specifies the layer of a two-dimensional image within <texture>.
    
        Unlike FramebufferTexture2D, no <textarget> parameter is accepted.
    
        If <texture> is non-zero and the command does not result in an error,
        the framebuffer attachment state corresponding to <attachment> is
        updated as in the other FramebufferTexture commands, except that the
        value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is set to <layer>.
    
        Errors
    
        An INVALID_ENUM error is generated if <target> is not DRAW_FRAMEBUFFER,
        READ_FRAMEBUFFER, or FRAMEBUFFER.
    
        An INVALID_ENUM error is generated if <attachment> is not one of the
        attachments in table 9.1.
    
        An INVALID_VALUE error is generated if texture is non-zero and <level>
        is not a supported texture level for <texture>, as described above.
    
        An INVALID_VALUE error is generated if <texture> is non-zero and <layer>
        is larger than the value of MAX_3D_TEXTURE_SIZE minus one (for
        three-dimensional textures), or larger than the value of
        MAX_ARRAY_TEXTURE_LAYERS minus one (for array textures).
    
        An INVALID_VALUE error is generated if <texture> is non-zero and <layer>
        is negative.
    
        An INVALID_OPERATION error is generated if <texture> is non-zero and is
        not the name of a three dimensional, two-dimensional multisample array,
        or two-dimensional array texture.
    
    
        Modify section 9.2.8.1, "Effects of Attaching a Texture Image" to add
        to the list of bullet points on p. 220:
    
        * If FramebufferTextureEXT is called and <texture> is the name of a
          three-dimensional, cube map, two-dimensional multisample array, or
          two-dimensional array texture, the value of
          FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is set to TRUE; otherwise it is set
          to FALSE.
    
    
        Modify section 9.4.1, "Framebuffer Completeness" to replace the bullet
        point starting "If <image> is a three-dimensional texture" on p. 223:
    
        * If <image> is a three-dimensional texture or a two-dimensional array
          texture and the attachment is not layered, the selected layer is less
          than the depth or layer count, respectively, of the texture.
    
        * If <image> is a three-dimensional texture or a two-dimensional array
          texture and the attachment is layered, the depth or layer count,
          respectively, of the texture is less than or equal to the value of
          MAX_FRAMEBUFFER_LAYERS_EXT.
    
    
        Modify section 9.4.2 "Whole Framebuffer Completeness" to add to the list
        of bullet points on p. 224:
    
        * If any framebuffer attachment is layered, all populated attachments
          must be layered. Additionally, all populated color attachments must be
          from textures of the same target (i.e., three-dimensional, cube map,
          two-dimensional array, or two-dimensional multisample array textures).
    
          { FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT }
    
    
        Add new section 9.7gs on p. 229, following existing section 9.7
        "Conversion to RGBA Values":
    
        Section 9.7gs Layered Framebuffers
    
        A framebuffer is considered to be layered if it is complete and all of
        its populated attachments are layered. When rendering to a layered
        framebuffer, each fragment generated by the GL is assigned a layer
        number. The layer number for a fragment is zero if
    
          * geometry shaders are disabled, or
    
          * the current geometry shader does not statically assign a value to
            the built-in output variable "gl_Layer".
    
        Otherwise, the layer for each point, line, or triangle emitted by the
        geometry shader is taken from the "gl_Layer" output of one of the
        vertices of the primitive. The vertex used is implementation-dependent
        and may be queried as described in section 11.1gs.4.
        To get defined results, all vertices of each primitive emitted should
        set the same value for "gl_Layer". Since the "EndPrimitive" built-in
        function starts a new output primitive, defined results can be achieved
        if "EndPrimitive" is called between two vertices emitted with different
        layer numbers. A layer number written by a geometry shader has no effect
        if the framebuffer is not layered.
    
        When fragments are written to a layered framebuffer, the fragment's
        layer number selects a single image from the array of images at each
        attachment point to use for the stencil test (see section 4.1.4), depth
        buffer test (see section 4.1.5), and for blending and color buffer
        writes (see section 4.1.7). If the fragment's layer number is negative,
        or greater than or equal to the minimum number of layers of any
        attachment, the effects of the fragment on the framebuffer contents are
        undefined.
    
        When the Clear or ClearBuffer* commands are used to clear a layered
        framebuffer attachment, all layers of the attachment are cleared.
    
        When commands such as ReadPixels read from a layered framebuffer, the
        image at layer zero of the selected attachment is always used to obtain
        pixel values.
    
        When cube map texture levels are attached to a layered framebuffer, there
        are six layers attached, numbered zero through five.  Each layer number is
        mapped to a cube map face, as indicated in table 8.25.
    
    
        Modify section 10.1, "Primitive Types" to add new figure 10.X1 and new
        sections 10.1.7la, 10.1.7lsa, 10.1.7ta, and 10.1.7tsa following section
        10.1.7, "Separate Triangles", on p. 234:
    
    
        Section 10.1.7la Lines with Adjacency
    
        Add figure 10.X1:
    
            1 - - - 2----->3 - - - 4     1 - - - 2--->3--->4--->5 - - - 6
    
            5 - - - 6----->7 - - - 8
    
                   (a)                             (b)
    
          Figure 10.X1 (a) Lines with adjacency, (b) Line strip with adjacency.
          The vertices connected with solid lines belong to the main primitives;
          the vertices connected by dashed lines are the adjacent vertices that
          may be used in a geometry shader.
    
        Lines with adjacency are specified with <mode> LINES_ADJACENCY_EXT, and
        are independent line segments where each endpoint has a corresponding
        "adjacent" vertex that can be accessed by a geometry shader (see section
        11.1gs). If a geometry shader is not active, the "adjacent" vertices are
        ignored.
    
        A line segment is drawn from the 4i + 2nd vertex to the 4i + 3rd vertex
        for each i = 0, 1, ... , n-1, where there are 4n+k vertices passed. k is
        either 0, 1, 2, or 3; if k is not zero, the final k vertices are
        ignored. For line segment i, the 4i + 1st and 4i + 4th vertices are
        considered adjacent to the 4i + 2nd and 4i + 3rd vertices, respectively.
        See Figure 10.X1.
    
    
        Section 10.1.7lsa Line Strips with Adjacency
    
        Line strips with adjacency are specified with <mode>
        LINE_STRIP_ADJACENCY_EXT and are similar to line strips, except that
        each line segment has a pair of adjacent vertices that can be accessed
        by a geometry shader. If a geometry shader is not active, the "adjacent"
        vertices are ignored.
    
        A line segment is drawn from the i + 2nd vertex to the i + 3rd vertex
        for each i = 0, 1, ..., n-1, where there are n+3 vertices passed. If
        there are fewer than four vertices, all vertices are ignored. For line
        segment i, the i + 1st and i + 4th vertex are considered adjacent to the
        i + 2nd and i + 3rd vertices, respectively. See Figure 10.X1.
    
    
        Section 10.1.7ta Triangles with Adjacency
    
        Add new figure 10.X2:
    
                       2 - - - 3 - - - 4     8 - - - 9 - - - 10
                               ^\                    ^\
                         \     | \     |       \     | \     |
                               |  \                  |  \
                           \   |   \   |         \   |   \   |
                               |    \                |    \
                             \ |     \ |           \ |     \ |
                               |      v              |      v
                               1<------5             7<------11
    
                                 \     |               \     |
    
                                   \   |                 \   |
    
                                     \ |                   \ |
    
                                       6                     12
    
          Figure 10.X2 Triangles with adjacency.  The vertices connected with solid
          lines belong to the main primitive; the vertices connected by dashed
          lines are the adjacent vertices that may be used in a geometry shader.
    
    
        Triangles with adjacency are specified with <mode> TRIANGLES_ADJACENCY_EXT,
        and are similar to separate triangles except that
        each triangle edge has an adjacent vertex that can be accessed by a
        geometry shader.  If a geometry shader is not active, the
        "adjacent" vertices are ignored.
    
        The 6i + 1st, 6i + 3rd, and 6i + 5th vertices (in that order) determine a
        triangle for each i = 0, 1, ..., n-1, where there are 6n+k vertices
        passed. k is either 0, 1, 2, 3, 4, or 5; if k is
        non-zero, the final k vertices are ignored.  For triangle i, the i + 2nd,
        i + 4th, and i + 6th vertices are considered adjacent to edges from the i
        + 1st to the i + 3rd, from the i + 3rd to the i + 5th, and from the i +
        5th to the i + 1st vertices, respectively.  See Figure 10.X2.
    
    
        Section 10.1.7 tsa Triangle Strips with Adjacency
    
        Add figure 10.X3:
    
                                      6                     6
    
                                      | \                   | \
    
                                      |   \                 |   \
    
                                      |     \               |     \
    
          2 - - - 3- - - >6   2 - - - 3------>7     2 - - - 3------>7- - - 10
                  ^\                  ^^      |             ^^      ^^      |
            \     | \     |     \     | \     | \     \     | \     | \
                  |  \                |  \    |             |  \    |  \    |
              \   |   \   |       \   |   \   |   \     \   |   \   |   \
                  |    \              |    \  |             |    \  |    \  |
                \ |     \ |         \ |     \ |     \     \ |     \ |     \
                  |      v            |      vv             |      vv      v|
                  1<------5           1<------5 - - - 8     1<------5<------9
    
                    \     |             \     |               \     | \     |
    
                      \   |               \   |                 \   |   \   |
    
                        \ |                 \ |                   \ |     \ |
    
                          4                   4                     4       8
    
    
                                       6       10
    
                                       | \     | \
    
                                       |   \   |   \
    
                                       |     \ |     \
                               2 - - - 3------>7------>11
                                       ^^      ^^      |
                                 \     | \     | \     | \
                                       |  \    |  \    |
                                   \   |   \   |   \   |   \
                                       |    \  |    \  |
                                     \ |     \ |     \ |     \
                                       |      vv      vv
                                       1<------5<------9 - - - 12
    
                                         \     | \     |
    
                                           \   |   \   |
    
                                             \ |     \ |
    
                                               4       8
    
          Figure 10.X3 Triangle strips with adjacency.  The vertices connected with
          solid lines belong to the main primitives; the vertices connected by
          dashed lines are the adjacent vertices that may be used in a geometry
          shader.
    
        Triangle strips with adjacency are specified with <mode>
        TRIANGLE_STRIP_ADJACENCY_EXT and are similar to triangle strips except that
        each line triangle edge has an adjacent vertex that can be accessed by a
        geometry shader (see section 11.1gs). If a geometry shader is not
        active, the "adjacent" vertices are ignored.
    
        In triangle strips with adjacency, n triangles are drawn where there are
        2 * (n+2) + k vertices passed.  k is either 0 or 1; if k is 1, the
        final vertex is ignored.  If there are fewer than 6 vertices,
        the entire primitive is ignored.  Table 10.X1 describes
        the vertices and order used to draw each triangle, and which vertices are
        considered adjacent to each edge of the triangle.  See Figure 10.X3.
    
    
        Add table 10.X1:
    
                                     primitive          adjacent
                                     vertices           vertices
          primitive               1st   2nd   3rd     1/2  2/3  3/1
          ---------------        ----  ----  ----    ---- ---- ----
          only (i==0, n==1)        1     3     5       2    6    4
          first (i==0)             1     3     5       2    7    4
          middle (i odd)         2i+3  2i+1  2i+5    2i-1 2i+4 2i+7
          middle (i even)        2i+1  2i+3  2i+5    2i-1 2i+7 2i+4
          last (i==n-1, i odd)   2i+3  2i+1  2i+5    2i-1 2i+4 2i+6
          last (i==n-1, i even)  2i+1  2i+3  2i+5    2i-1 2i+6 2i+4
    
          Table 10.X1:  Triangles generated by triangle strips with adjacency.
          Each triangle is drawn using the vertices in the "1st", "2nd", and "3rd"
          columns under "primitive vertices", in that order.  The vertices in the
          "1/2", "2/3", and "3/1" columns under "adjacent vertices" are considered
          adjacent to the edges from the first to the second, from the second to
          the third, and from the third to the first vertex of the triangle,
          respectively.  The six rows correspond to the six cases:  the first and
          only triangle (i=0, n=1), the first triangle of several (i=0, n>0),
          "odd" middle triangles (i=1,3,5...), "even" middle triangles
          (i=2,4,6,...), and special cases for the last triangle,
          when i is either even or odd.  For the purposes of this
          table, the first vertex passed is numbered "1" and the
          first triangle is numbered "0".
    
    
        Modify section 10.5, "Drawing Commands using Vertex Arrays"
    
        On p. 250 in the errors section for the DrawArraysIndirect command,
        and on p. 254 in the errors section for the DrawElementsIndirect command,
        delete the errors which state:
    
        "An INVALID_OPERATION error is generated if transform feedback is
        active and not paused."
    
        (thus allowing transform feedback to work with indirect draw commands).
    
    
        Modify section 11.1.2.1, "Output Variables" on p. 262, starting with the
        second paragraph of the section:
    
        The OpenGL ES Shading Language specification also defines a
        set of built-in outputs that vertex shaders can write to (see
        section 7.1 ("Built-In Language Variables") of the OpenGL ES Shading
        Language Specification). These output variables
        are used to communicate values to the next active stage in the
        vertex processing pipeline; either the geometry shader, or the
        fixed-function vertex processing stages leading to rasterization.
    
        If the output variables are passed directly to the vertex processing
        stages leading to rasterization, the values of all outputs are expected
        to be interpolated across the primitive being rendered, unless
        flatshaded. Otherwise the values of all outputs are collected by the
        primitive assembly stage and passed on to the subsequent pipeline stage
        once enough data for one primitive has been collected.
    
        The number of components (individual scalar numeric values) of output
        variables that can be written by the vertex shader, whether or not a
        geometry shader is active, is given by the value of the
        implementation-dependent constant MAX_VERTEX_OUTPUT_COMPONENTS.
        For the purposes of counting input and output components
        consumed by a shader, variables declared as vectors, matrices, and
        arrays will all consume multiple components.
    
        When a program is linked...
    
        Additionally, when linking a program containing only a vertex and
        fragment shader, there is a limit on the total number of components...
    
        Each program object can specify a set of output variables from one
        shader to be recorded in transform feedback mode (see section 12.1).
        The variables that can be recorded are those emitted by the first active
        shader, in order, from the following list:
    
        * geometry shader
        * vertex shader
    
        The set of variables to record is specified with the command
    
        void TransformFeedbackVaryings ...
    
    
        Modify starting with the list of TransformFeedbackVaryings link failures
        on p. 263:
    
        ... A program will fail to link if:
    
        * the <count> specified by TransformFeedbackVaryings is non-zero, but
          the program object has no vertex or geometry shader;
        * any variable name specified in the <varyings> array is not declared as
          a built-in or user-defined output variable in the shader stage whose
          outputs can be recorded;
        * any two entries in the <varyings> array specify the same output
          variable;
        * the total number of components to capture in any output in <varyings>
          is greater than the value of
          MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS and the buffer mode is
          SEPARATE_ATTRIBS; or
        * the total number of components to capture is greater than the value of
          MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS and the buffer mode is
          INTERLEAVED_ATTRIBS.
    
        When a program is linked ...
    
    
        Modify section 11.1.3 "Shader Execution"
    
        Change the first paragraph of the section on p. 264:
    
        If there is an active program object present for the vertex 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 geometry shader, each individual
          primitive is processed by the geometry shader (see section 11.1gs).
          Otherwise, primitives are passed through unmodified. If active, the
          geometry shader consumes its input primitive. However, each geometry
          shader invocation may emit new vertices, which are arranged into
          primitives and passed to subsequent pipeline stages.
    
        Following shader execution, the fixed-function operations described in
        chapter 12 are applied.
    
        Special considerations for ...
    
    
        Rename section 11.1.3.1 "Shader Texturing" to "Shader Only Texturing"
        on p. 264.
    
    
        Modify the bullet list in section 11.1.3.5 "Texture Access" on p. 266 to
        add a limit for geometry shaders:
    
        * MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT (for geometry 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_GEOMETRY_ATOMIC_COUNTERS_EXT (for geometry shaders)
    
    
        Modify the bullet list in section 11.1.3.7 "Image Access" on p. 268 to
        add a limit for geometry shaders:
    
        * MAX_GEOMETRY_IMAGE_UNIFORMS_EXT (for geometry 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_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT (for geometry shaders)
    
    
    
        Modify section 11.1.3.11 "Validation" to add to the list of validation
        errors on p. 270:
    
        * One program object is active for at least two shader stages and a
          second program is active for a shader stage between two stages for
          which the first program was active.
    
        * There is an active program for the geometry stage with corresponding
          executable shader, but there is no active program with an executable
          vertex shader.
    
    
        Add new section 11.1gs, "Geometry Shaders" on p. 272, following
        section 11.1, "Vertex Shaders"
    
        Section 11.1.gs Geometry Shaders
    
        After vertices are processed, they are arranged into primitives, as
        described in section 10.1 (Primitive Types). This section describes
        <geometry shaders>, an additional pipeline stage defining operations to
        further process those primitives. Geometry shaders are defined by source
        code in the OpenGL ES Shading Language, in the same manner as vertex
        shaders. They operate on a single primitive at a time and emit one or
        more output primitives, all of the same type, which are then processed
        like an equivalent GL primitive specified by the application. The
        original primitive is discarded after geometry shader execution. The
        inputs available to a geometry shader are the transformed attributes of
        all the vertices that belong to the primitive. Additional <adjacency
        primitives> are available which also make the transformed attributes of
        neighboring vertices available to the shader. The results of the shader
        are a new set of transformed vertices, arranged into primitives by the
        shader.
    
        The geometry shader pipeline stage is inserted after primitive assembly,
        prior to transform feedback (see section 12.1), as discussed in section
        11.1.3.
    
        Geometry shaders are created as described in section 7.1 using a <type>
        of GEOMETRY_SHADER_EXT. They are attached to and used in program objects
        as described in section 7.3. When the program object currently in use
        includes a geometry shader, its geometry shader is considered active,
        and is used to process primitives. If the program object has no geometry
        shader, this stage is bypassed.
    
        A non-separable program object or program pipeline object that includes
        a geometry shader 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 a geometry shader
        but no vertex shader.
    
    
        Section 11.1gs.1, Geometry Shader Input Primitives
    
        A geometry shader can operate on one of five input primitive types.
        Depending on the input primitive type, one to six input vertices are
        available when the shader is executed. Each input primitive type
        supports a subset of the primitives provided by the GL.
    
        An INVALID_OPERATION error is generated by any command that transfers
        vertices to the GL if a geometry shader is active and the primitive
        <mode> parameter is incompatible with the input primitive type of the
        geometry shader of the active geometry program object, as discussed
        below.
    
        A geometry shader that accesses more input vertices than are available
        for a given input primitive type can be successfully compiled, because
        the input primitive type is not part of the shader object. However, a
        program object containing a shader object that accesses more input
        vertices than are available for the input primitive type of the program
        object will not link.
    
        The input primitive type is specified in the geometry shader source code
        using an input layout qualifier, as described in the OpenGL ES Shading
        Language Specification. A program will fail to link if the input
        primitive type is not specified by the geometry shader object attached
        to the program. The input primitive type may be queried by calling
        GetProgramiv with the symbolic constant GEOMETRY_LINKED_INPUT_TYPE_EXT.
        The supported types and the corresponding OpenGL ES Shading Language
        input layout qualifier keywords are:
    
        Points (points)
    
        Geometry shaders that operate on points are valid only for the POINTS
        primitive type. There is only a single vertex available for each
        geometry shader invocation.
    
        Lines (lines)
    
        Geometry shaders that operate on line segments are valid only for the
        LINES, LINE_STRIP, and LINE_LOOP primitive types. There are two vertices
        available for each geometry shader invocation. The first vertex refers
        to the vertex at the beginning of the line segment and the second vertex
        refers to the vertex at the end of the line segment. See also section
        11.1gs.4.
    
        Lines with Adjacency (lines_adjacency)
    
        Geometry shaders that operate on line segments with adjacent vertices
        are valid only for the LINES_ADJACENCY_EXT and LINE_STRIP_ADJACENCY_EXT
        primitive types. There are four vertices available for each program
        invocation. The second vertex refers to attributes of the vertex at the
        beginning of the line segment and the third vertex refers to the vertex
        at the end of the line segment. The first and fourth vertices refer to
        the vertices adjacent to the beginning and end of the line segment,
        respectively.
    
        Triangles (triangles)
    
        Geometry shaders that operate on triangles are valid for the TRIANGLES,
        TRIANGLE_STRIP and TRIANGLE_FAN primitive types. There are three
        vertices available for each program invocation. The first, second and
        third vertices refer to attributes of the first, second and third vertex
        of the triangle, respectively.
    
        Triangles with Adjacency (triangles_adjacency)
    
        Geometry shaders that operate on triangles with adjacent vertices are
        valid for the TRIANGLES_ADJACENCY_EXT and TRIANGLE_STRIP_ADJACENCY_EXT
        primitive types. There are six vertices available for each program
        invocation. The first, third and fifth vertices refer to attributes of
        the first, second and third vertex of the triangle, respectively. The
        second, fourth and sixth vertices refer to attributes of the vertices
        adjacent to the edges from the first to the second vertex, from the
        second to the third vertex, and from the third to the first vertex,
        respectively.
    
    
        Section 11.1gs.2, Geometry Shader Output Primitives
    
        A geometry shader can generate primitives of one of three types. The
        supported output primitive types are points (POINTS), line strips
        (LINE_STRIP), and triangle strips (TRIANGLE_STRIP). The vertices output
        by the geometry shader are assembled into points, lines, or triangles
        based on the output primitive type in the manner described in section
        10.5. The resulting primitives are then further processed as described
        in section 11.1gs.4. If the number of vertices emitted by the geometry
        shader is not sufficient to produce a single primitive, nothing is
        drawn. The number of vertices output by the geometry shader is limited
        to a maximum count specified in the shader.
    
        The output primitive type and maximum output vertex count are specified
        in the geometry shader source code using an output layout qualifier, as
        described in section 4.4.2.gs ("Geometry Outputs") of the OpenGL ES
        Shading Language Specification. A program will fail to link if either
        the output primitive type or maximum output vertex count are not
        specified by the geometry shader object attached to the program. The
        output primitive type and maximum output vertex count of a linked
        program may be queried by calling GetProgramiv with the symbolic
        constants GEOMETRY_LINKED_OUTPUT_TYPE_EXT and
        GEOMETRY_LINKED_VERTICES_OUT_EXT, respectively.
    
    
        Section 11.1gs.3 Geometry Shader Variables
    
        Geometry 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.
    
        Geometry shaders also have access to samplers to perform texturing
        operations, as described in section 7.9.
    
        Geometry shaders can access the transformed attributes of all vertices
        for their input primitive type 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, a geometry shader has access to a built-in
        variable that holds the ID of the current primitive. This ID is
        generated by the primitive assembly stage that sits in between the
        vertex and geometry shader.
    
        Additionally, geometry shaders can write to one or more output variables
        for each vertex they output. These values are optionally flatshaded
        (using the OpenGL ES Shading Language varying qualifier "flat") and
        clipped, then the clipped values interpolated across the primitive (if
        not flatshaded). The results of these interpolations are available to
        the fragment shader.
    
    
        Section 11.1gs.4, Geometry Shader Execution Environment
    
        If there is an active program for the geometry stage, the executable
        version of the program's geometry shader is used to process primitives
        resulting from the primitive assembly stage.
    
        There are several special considerations for geometry shader execution
        described in the following sections.
    
    
        Section 11.1gs.4.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 geometry shaders.
    
    
        Section 11.1gs.4.2 Instanced Geometry Shaders
    
        For each input primitive received by the geometry shader pipeline stage,
        the geometry shader may be run once or multiple times. The number of
        times a geometry shader should be executed for each input primitive may
        be specified using a layout qualifier in a geometry shader of a linked
        program. If the invocation count is not specified in any layout
        qualifier, the invocation count will be one.
    
        Each separate geometry shader invocation is assigned a unique invocation
        number. For a geometry shader with <N> invocations, each input primitive
        spawns <N> invocations, numbered 0 through <N>-1. The built-in uniform
        gl_InvocationID may be used by a geometry shader invocation to determine
        its invocation number.
    
        When executing instanced geometry shaders, the output primitives
        generated from each input primitive are passed to subsequent pipeline
        stages using the shader invocation number to order the output. The first
        primitives received by the subsequent pipeline stages are those emitted
        by the shader invocation numbered zero, followed by those from the
        shader invocation numbered one, and so forth. Additionally, all output
        primitives generated from a given input primitive are passed to
        subsequent pipeline stages before any output primitives generated from
        subsequent input primitives.
    
    
        Section 11.1gs.4.3 Geometry Shader Inputs
    
        Section 7.1 ("Built-In Language Variables") of the OpenGL ES Shading
        Language Specification describes the built-in variable array gl_in[]
        available as input to a geometry shader. gl_in[] receives values from
        the 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 primitive. The length of gl_in[] is
        determined by the geometry shader input type (see section 11.1gs.1). The
        members of each element of the gl_in[] array are:
    
          [[ If EXT_geometry_point_size is supported: ]]
        * structure member gl_PointSize holds the per-vertex point size written
          by the previous shader to its built-in output variable gl_PointSize.
          If the previous shader does not write gl_PointSize, the value of
          gl_PointSize is undefined.
    
        * structure member gl_Position holds the per-vertex position, as written
          by the previous shader to its built-in output variable gl_Position.
          Note that writing to gl_Position from either the vertex or geometry
          shader is optional (also see section 7.1 ("Built-In Language
          Variables") of the OpenGL ES Shading Language Specification)
    
        Geometry shaders also have available the built-in input variable
        gl_PrimitiveIDIn, which is not an array and has no vertex shader
        equivalent. It 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. For triangles drawn in point or line mode, the
        primitive ID counter is incremented only once, even though multiple
        points or lines may eventually be drawn. 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.
    
        Similarly to the built-in inputs, each user-defined input has a value
        for each vertex and thus needs 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 inferred by the linker from the input
        primitive type. If a size is specified, it must match the number of
        vertices for the input primitive type; otherwise a link error will
        occur. The OpenGL ES Shading Language doesn't support multi-dimensional
        arrays as shader inputs or outputs; therefore, user-defined geometry
        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. See section 4.3.6 ("Output Variables") of the
        OpenGL ES Shading Language Specification for more information.
    
        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 geometry shader, given by the value of
        the implementation-dependent constant MAX_GEOMETRY_INPUT_COMPONENTS_EXT.
    
        When a program is linked, all components of any input read by a geometry
        shader will count against this limit. A program whose geometry 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.1gs.4.4 Geometry Shader Outputs
    
        A geometry shader is limited in the number of vertices it may emit per
        invocation. The maximum number of vertices a geometry shader can
        possibly emit is specified in the geometry shader source and may be
        queried after linking by calling GetProgramiv with the symbolic constant
        GEOMETRY_LINKED_VERTICES_OUT_EXT. If a single invocation of a geometry
        shader emits more vertices than this value, the emitted vertices may
        have no effect.
    
        There are two implementation-dependent limits on the value of
        GEOMETRY_LINKED_VERTICES_OUT_EXT; it may not exceed the value of
        MAX_GEOMETRY_OUTPUT_VERTICES_EXT, and the product of the total number of
        vertices and the sum of all components of all active output variables
        may not exceed the value of MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT.
        LinkProgram will fail if it determines that the total component limit
        would be violated.
    
        A geometry shader can write to built-in as well as user-defined output
        variables. These values are expected to be interpolated across the
        primitive it outputs, unless they are specified to be flatshaded. To
        enable seamlessly inserting or removing a geometry shader from a program
        object, the rules, names and types of the built-in and user-defined
        output variables are the same as for the vertex shader. Refer to section
        11.1.2.1, and to sections 4.3.6 ("Output Variables") and 7.1 ("Built-In
        Language Variables") of the the OpenGL ES Shading Language Specification
        for more detail.
    
        After a geometry shader emits a vertex, all output variables are
        undefined, as described in section 8.12gs ("Geometry Shader Functions")
        of the OpenGL Shading Language Specification.
    
        The built-in output gl_Position is intended to hold the homogeneous
        vertex position. Writing gl_Position is optional.
    
          [[ If EXT_geometry_point_size is supported: ]]
        The built-in output gl_PointSize, if written, holds the size of the
        point to be rasterized, measured in pixels.
    
        The built-in output gl_PrimitiveID holds the primitive ID counter read
        by the fragment shader, replacing the value of gl_PrimitiveID generated
        by drawing commands when no geometry shader is active. The geometry
        shader must write to gl_PrimitiveID for the provoking vertex (see
        section 12.3) of a primitive being generated, or the primitive ID
        counter read by the fragment shader for that primitive is undefined.
    
        The built-in output gl_Layer is used in layered rendering, and discussed
        further in the next section.
    
        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 output
        variables that can be written by the geometry shader, given by the value
        of the implementation-dependent constant
        MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT.
    
        When a program is linked, all components of any output variable written
        by a geometry shader will count against this limit. A program whose
        geometry 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.1gs.4.5 Layer Selection
    
        Geometry shaders can be used to render to one of several different
        layers of cube map textures, three-dimensional textures, or
        two-dimensional texture arrays. This functionality allows an application
        to bind an entire complex texture to a framebuffer object, and render
        primitives to arbitrary layers computed at run time. For example, this
        mechanism can be used to project and render a scene onto all six faces
        of a cube map texture in one pass. The layer to render to is specified
        by writing to the built-in output variable "gl_Layer". Layered rendering
        requires the use of framebuffer objects (see section 9.7gs).
    
        The specific vertex of a primitive that is used to select the rendering
        layer is implementation-dependent and thus portable applications will
        assign the same layer for all vertices in a primitive. The vertex
        convention followed for "gl_Layer" may be determined by calling
        GetIntegerv with the symbolic constant LAYER_PROVOKING_VERTEX_EXT. If
        the value returned is FIRST_VERTEX_CONVENTION_EXT, selection is always
        taken from the first vertex of a primitive. If the value returned is
        LAST_VERTEX_CONVENTION_EXT, the selection is always taken from the last
        vertex of a primitive. If the value returned is UNDEFINED_VERTEX_EXT,
        the selection is not guaranteed to be taken from any specific vertex in
        the primitive. The vertex considered the provoking vertex for particular
        primitive types is given in table 12.2.
    
    
        Section 11.1gs.4.6 Primitive Type Mismatches and Drawing Commands
    
        An INVALID_OPERATION error is generated by any command that transfers
        vertices to the GL, and no fragments will be rendered, if a mismatch
        exists between the type of primitive being drawn and the input primitive
        type of a geometry shader. A mismatch exists under any of the following
        conditions:
    
          * the input primitive type of the current geometry shader is
            POINTS and <mode> is not POINTS,
    
          * the input primitive type of the current geometry shader is
            LINES and <mode> is not LINES, LINE_STRIP, or LINE_LOOP,
    
          * the input primitive type of the current geometry shader is
            TRIANGLES and <mode> is not TRIANGLES, TRIANGLE_STRIP or
            TRIANGLE_FAN,
    
          * the input primitive type of the current geometry shader is
            LINES_ADJACENCY_EXT and <mode> is not LINES_ADJACENCY_EXT or
            LINE_STRIP_ADJACENCY_EXT, or
    
          * the input primitive type of the current geometry shader is
            TRIANGLES_ADJACENCY_EXT and <mode> is not
            TRIANGLES_ADJACENCY_EXT or TRIANGLE_STRIP_ADJACENCY_EXT.
    
    
        Modify section 12.1, "Transform Feedback"
    
        Replace the second paragraph of the section on p. 274:
    
        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, transform feedback
        captures each primitive processed by the vertex shader.
    
    
        Modify the second paragraph following ResumeTransformFeedback on p. 277
    
        When transform feedback is active and not paused, all geometric
        primitives generated must be compatible with the value of
        <primitiveMode> passed to BeginTransformFeedback. If a 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. Any primitive type may be used while transform
        feedback is paused.
    
        Add table 12.1gs:
    
        Transform Feedback  Allowed render primitive
        <primitiveMode>     <modes>
        -------------------+----------------------------------------
        POINTS             | POINTS
        LINES              | LINES, LINE_LOOP, LINE_STRIP
        TRIANGLES          | TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN
        ------------------------------------------------------------
        Table 12.1gs: Legal combinations of the transform feedback
        primitive mode, as passed to BeginTransformFeedback, and the
        current primitive mode.
    
    
        In the Errors section, replace "An INVALID_OPERATION error is generate
        by DrawArrays and DrawArraysInstanced if <mode> is not identical to
        <primitiveMode>" with:
    
        An INVALID_OPERATION error is generated by any command that transfers
        vertices to the GL if <mode> is not one of the allowed modes in table
        12.1gs.
    
        and delete the error condition which states:
    
        An INVALID_OPERATION error is generated by any drawing commands other
        than DrawArrays and DrawArraysInstanced while transform feedback is
        active and not paused, regardless of mode.
    
        Modify the last sentence of the second paragraph on p. 278:
    
        When writing output variables that are arrays ... The value for any
        output variable specified to be streamed to a buffer object but not
        actually written by a vertex or geometry shader is undefined. The
        results of appending an output variable to a transform feedback buffer
        are undefined if any component of that variable would be written at an
        offset not aligned to the size of the component.
    
    
        Modify the sixth paragraph on p. 278:
    
        In INTERLEAVED_ATTRIBS mode, the values of one or more output variables
        written by a vertex or geometry shader are written, interleaved, ...
    
    
        Modify the eighth paragraph on p. 278, describing errors on buffer
        overflow:
    
    
        The error INVALID_OPERATION ... as set by BindBufferRange. No vertices
        of that primitive are recorded in any buffer object, and the counter
        corresponding to the asynchronous query target
        TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN (see section 12.2) is not
        incremented.
    
    
        Modify the second paragraph on p. 280:
    
        When BeginTransformFeedback is called with an active program object
        containing a vertex or geometry shader, the set of output variables
        captured ...
    
    
        Replace section 12.2, "Primitive Queries" on p. 281:
    
        Primitive queries use query objects to track the number of primitives
        that are generated by the GL and the number of primitives that are
        written to buffer objects in transform feedback mode.
    
        When BeginQuery is called with a target of PRIMITIVES_GENERATED_EXT, the
        primitives generated count maintained by the GL is set to zero. When a
        generated primitive query is active, the primitives-generated count is
        incremented every time an emitted primitive reaches the transform
        feedback stage (see section 12.1), whether or not transform feedback is
        active. 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.
    
        When BeginQuery is called with a target of
        TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, the transform feedback primitives
        written count maintained by the GL is set to zero. When the transform
        feedback primitive written query is active, the transform feedback
        primitives written count is incremented every time the vertices of a
        primitive are recorded into a buffer object. If transform feedback is
        not active or if a primitive to be recorded does not fit in a buffer
        object, this counter is not incremented.
    
        These two types of queries can be used together to determine if all
        primitives have been written to the bound feedback buffer; if both
        queries are run simultaneously and the query results are equal, all
        primitives have been written to the buffer. If the number of primitives
        written is less than the number of primitives generated, the buffer
        overflowed.
    
    
        Modify section 12.5 "Coordinate Transformations" on p. 283:
    
        <Clip coordinates> for a vertex result from shader execution, which
        yields ...
    
    
        Modify section 13.3, "Points"
    
        Replace the second paragraph starting "The point size..." on p. 290:
    
        The point size is determined by the last active stage before the
        rasterizer:
    
        * the geometry shader, if active; or
        * 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
               EXT_geometry_point_size is not supported and enabled in the
               geometry shader stage. ]]
    
        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 ...
    
    
        Modify section 14.2.2, "Shader Inputs"
    
        Add a new paragraph following the paragraph starting "The built-in
        variable gl_FrontFacing" on p. 305:
    
        If a geometry shader is active, the built-in variable gl_PrimitiveID
        contains the ID value emitted by the geometry shader for the provoking
        vertex. If no geometry shader is active, gl_PrimitiveID contains the
        number of primitives processed by the rasterizer since the last drawing
        command was called. The first primitive generated by a drawing command
        is numbered zero, and the primitive ID counter is incremented after
        every individual point, line, or polygon primitive is processed.
        The counter is reset to zero between each instance drawn.
    
        Restarting a primitive using the primitive restart index (see section
        10.3.4) has no effect on the primitive ID counter.
    
        gl_PrimitiveID is only defined under the same conditions that
        gl_VertexID is defined, as described under "Shader Inputs" in section
        11.1.3.9.
    
        Similarly to the limit on geometry shader output components (see section
        11.1gs.4), there is a limit on the number of components of built-in and
        user-defined input variables that can be read by the fragment shader,
        given by the value of the implementation-dependent constant
        MAX_FRAGMENT_INPUT_COMPONENTS.
    
        When a program is linked ...
    
    
        Modify section 16.2.1, "Blitting Pixel Rectangles" to add following the
        paragraph starting "When values are written to the draw buffers" on p.
        337:
    
        If the read framebuffer is layered (see section 9.7gs), pixel values are
        read from layer zero. If the draw framebuffer is layered, pixel values
        are written to layer zero. If both read and draw framebuffers are
        layered, the blit operation is still performed only on layer zero.
    
    
        Modify the first sentence of chapter 17, "Compute Shaders" on p. 340:
    
        In addition to graphics-oriented shading operations such as vertex,
        geometry, and fragment shading, generic computation ...
    
    
    Dependencies on OES_sample_variables
    
        If OES_sample_variables is not supported, references to
        the extension edits should be ignored.
    
    Dependencies on OES_texture_storage_multisample_2d_array
    
        If OES_texture_storage_multisample_2d_array is not supported, references
        to two-dimensional multisample array textures should be ignored.
    
    Dependencies on OES_shader_multisample_interpolation
    
        If OES_shader_multisample_interpolation is not supported, references
        to "sample in", "sample out" and the extension should be ignored.
    
    Dependencies on EXT_texture_buffer
    
        If EXT_texture_buffer is not supported, references to
        buffer textures should be removed.
    
    New State
    
        Add to table 20.14, "Framebuffer (state per framebuffer object)":
                                                                        Initial
        Get Value                      Type  Get Command                Value   Description               Sec.
        ------------------------------ ----  -------------------------  ------- ------------------------  -----
        FRAMEBUFFER_DEFAULT_LAYERS_EXT  Z+   GetFramebufferParameteriv    0     default layer count of    9.2.1
                                                                                framebuffer w/o
                                                                                attachments
    
        Add to table 20.15, "Framebuffer (state per attachment point)":
    
                                                                                             Initial
        Get Value                                Type    Get Command                         Value   Description            Sec.
        ---------------------------------------- ----    ----------------------------------- ------- ---------------------- -------
        FRAMEBUFFER_ATTACHMENT_LAYERED_EXT       B       GetFramebufferAttachmentParameteriv FALSE   Framebuffer attachment 9.2.8.1
                                                                                                     is layered
    
        Modify description of SHADER_TYPE in table 20.18, "Shader Object State":
    
                                                Initial
        Get Value           Type    Get Command Value   Description                   Sec.
        -----------         ----    ----------- ------- ----------------------------- ----
        SHADER_TYPE         E       GetShaderiv -       Type of shader (shader stage) 7.1
    
        Add to table 20.19, "Program Pipeline Object State":
    
                                                       Initial
        Get Value           Type  Get Command          Value   Description               Sec.
        ------------------  ----  -------------------- ------- ------------------------  ----
        GEOMETRY_SHADER_EXT Z+    GetProgramPipelineiv 0       Name of current geometry  7.4
                                                               shader program object
    
    
        Add to table 20.22, "Program Object State (cont.)":
    
                                                              Initial
        Get Value                        Type   Get Command   Value          Description               Sec.
        -------------------------        ----  ------------   -------------- ------------------------  --------
        GEOMETRY_LINKED_VERTICES_OUT_EXT Z+    GetProgramiv   0              Max.# of output vertices  11.1gs.4
        GEOMETRY_LINKED_INPUT_TYPE_EXT   E     GetProgramiv   TRIANGLES      Primitive input type      11.1gs.1
        GEOMETRY_LINKED_OUTPUT_TYPE_EXT  E     GetProgramiv   TRIANGLE_STRIP Primitive output type     11.1gs.2
        GEOMETRY_SHADER_INVOCATIONS_EXT  Z+    GetProgramiv   1              # of times a geom. shader 7.12
                                                                             should be executed for
                                                                             each input primitive
    
        Add to table 20.28, "Program Object Resource State (cont.)":
    
                                                                     Initial
        Get Value                         Type  Get Command          Value   Description             Sec.
        --------------------------------- ----  -------------------- ------- ----------------------- -----
        REFERENCED_BY_GEOMETRY_SHADER_EXT Z+    GetProgramResourceiv    -    active resource used by 7.3.1
                                                                             geometry shader
    
    
        Rename table 20.29, "Vertex Shader State (not part of program objects)"
        to "Vertex and Geometry Shader State (not part of program objects)".
    
    
    New Implementation Dependent State
    
        Add to table 20.40, "Implementation-Dependent Values (cont.)":
    
        Get Value                      Type  Get Command    Minimum Value  Description                Sec.
        --------------------------     ----  -----------    -------------  -------------------------- --------
        MAX_FRAMEBUFFER_LAYERS_EXT     Z+    GetIntegerv    256            maximum layer count for    9.2.1
                                                                           layered framebuffer object
        LAYER_PROVOKING_VERTEX_EXT     E     GetIntegerv    -- (*)         vertex convention followed 11.1gs.4
                                                                           by the gl_Layer GLSL
                                                                           variable
    
        Add new footnote:
          (*) Note: Valid values are FIRST_VERTEX_CONVENTION_EXT,
          LAST_VERTEX_CONVENTION_EXT, and UNDEFINED_VERTEX_EXT.
    
    
    
        Add new table 20.43gs "Implementation Dependent Geometry Shader Limits"
        following table 20.43 "Implementation Dependent Vertex Shader Limits":
    
                                                                   Min.
        Get Value                                Type Get Command  Value Description             Sec.
        ---------------------------------------- ---- -----------  ----- ----------------------- --------
        MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT      Z+   GetIntegerv  1024  Number of comp. for     11.1gs.3
                                                                         geom. shader uniform
                                                                         variables
        MAX_GEOMETRY_UNIFORM_BLOCKS_EXT          Z+   GetIntegerv  12    Max number of geom.     7.6.2
                                                                         uniform buffers per
                                                                         program
        MAX_GEOMETRY_INPUT_COMPONENTS_EXT        Z+   GetIntegerv  64    Max number of comp.     11.1gs.4
                                                                         of inputs read by a
                                                                         geom. shader
        MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT       Z+   GetIntegerv  64    Max number of comp.     11.1gs.4
                                                                         of outputs written
                                                                         by a geom. shader
        MAX_GEOMETRY_OUTPUT_VERTICES_EXT         Z+   GetIntegerv  256   Max number of vertices  11.1gs.4
                                                                         that any geom. shader
                                                                         can emit
        MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT Z+   GetIntegerv  1024  Max number of total     11.1gs.4
                                                                         comp. (all vertices) of
                                                                         active outputs that a
                                                                         geom. shader can emit
        MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT     Z+   GetIntegerv  16    Number of texture       11.1.3.5
                                                                         image units accessible
                                                                         by a geom. shader
        MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT  Z+   GetIntegerv  0     Number of atom. counter 7.7
                                                                         buffers accessed
                                                                         by a geom. shader
        MAX_GEOMETRY_ATOMIC_COUNTERS_EXT         Z+   GetIntegerv  0     Number of atomic        11.1.3.6
                                                                         counters accessed by a
                                                                         geom. shader
        MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT   Z+   GetIntegerv  0     Num. of shader storage  7.8
                                                                         blocks accessed by a
                                                                         geom. shader
        MAX_GEOMETRY_SHADER_INVOCATIONS_EXT      Z+   GetIntegerv  32    Max supported geom.     11.1gs.4
                                                                         shader invocation count
    
    
    
        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_GEOMETRY_IMAGE_UNIFORMS_EXT              Z+    GetIntegerv 0        Number of image variables 11.1.3.7
                                                                                in geometry shaders
        MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT Z+    GetIntegerv [fn]     No. of words for geom.    7.6.2
                                                                                shader uniform vars. 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 48       Max no. of uniform buf.   7.6.2
                                                                                binding points
        MAX_COMBINED_UNIFORM_BLOCKS                  Z+    GetIntegerv 36       Max. no. of uniform       7.6.2
                                                                                buffers per program
        MAX_COMBINED_TEXTURE_IMAGE_UNITS             Z+    GetIntegerv 64       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_EXT_geometry_shader : <behavior>
          #extension GL_EXT_geometry_point_size : <behaviour>
    
        where <behavior> is as specified in section 3.4.
    
        A new preprocessor #define is added to the OpenGL ES Shading Language:
    
          #define GL_EXT_geometry_shader 1
          #define GL_EXT_geometry_point_size 1
    
        If the EXT_geometry_shader extension is enabled, the
        EXT_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, 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, geometry, or fragment.
    
    
        Add new subsection 2.gs preceding subsection 2.2 "Fragment Processor":
    
        Section 2.gs, Geometry Processor
    
        The <geometry processor> is a programmable unit that operates on data
        for incoming vertices for a primitive assembled after vertex processing
        and outputs a sequence of vertices forming output primitives.
        Compilation units written in the OpenGL ES Shading Language to run on
        this processor are called <geometry shaders>. When a geometry shader is
        compiled and linked, it results in a <geometry shader executable> that
        runs on the geometry processor.
    
        A single invocation of the geometry shader executable on the geometry
        processor will operate on a declared input primitive with a fixed number
        of vertices. This single invocation can emit a variable number of
        vertices that are assembled into primitives of a declared output
        primitive type and passed to subsequent pipeline stages.
    
    
        Modify section 4.3.4 "Input Variables", adding following the paragraph
        starting "It is expected that ... columns in the matrix" on p. 40:
    
        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
        geometry shaders 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.
    
        Fragment shader inputs get per-fragment values...
    
    
        Modify section 4.3.6 "Output Variables" starting with the third
        paragraph of the section, as modified by
        OES_shader_multisample_interpolation, on p. 42:
    
        Vertex and geometry output variables output per-vertex data and are
        declared using the "out", "centroid out", or "sample out" storage
        qualifiers. ...
    
        Individual vertex and geometry outputs are declared as in the following
        examples: ...
    
            ...
            flat out vec3 myColor;
            sample out vec4 perSampleColor;
    
        These can also appear in interface blocks, as described in section 4.3.9
        "Interface Blocks". Interface blocks allow simpler addition of arrays to
        the interface from vertex to geometry shader. They also allow a fragment
        shader to have the same input interface as a geometry shader for a given
        vertex shader.
    
        Fragment outputs output per-fragment data ...
    
    
        Modify section 4.3.9 "Interface Blocks" as modified by
        EXT_shader_io_blocks, to add following the paragraph starting "When
        using OpenGL ES API entry points to identify the name":
    
        Geometry shader input blocks must be declared as arrays and follow the
        array declaration and linking rules for all geometry shader inputs. All
        other input and output block arrays must specify an array size.
    
    
        Modify section 4.4.1 "Input Layout Qualifiers" as modified
        by EXT_shader_io_blocks:
    
        Insert a new section 4.4.1.gs, before section 4.4.1.fs:
    
        Section 4.4.1.gs, Geometry Shader Inputs
    
        Additional layout qualifier identifiers for geometry shader inputs
        include primitive identifiers and an invocation count identifier:
    
          <layout-qualifier-id>
            points
            lines
            lines_adjacency
            triangles
            triangles_adjacency
            invocations = integer-constant
    
        The identifiers points, lines, lines_adjacency, triangles, and
        triangles_adjacency are used to specify the type of input primitive
        accepted by the geometry shader, and only one of these is accepted. The
        geometry shader object in a program must declare this input primitive
        layout, and all geometry shader input layout declarations in a program
        must declare the same layout.
    
        The identifier invocations is used to specify the number of times the
        geometry shader executable is invoked for each input primitive received.
        Invocation count declarations are optional. If no invocation count is
        declared in any geometry shader in a program, the geometry shader will
        be run once for each input primitive. If an invocation count is
        declared, all such declarations must specify the same count. If a shader
        specifies an invocation count greater than the implementation-dependent
        maximum, it will fail to compile.
    
        For example,
    
          layout(triangles, invocations = 6) in;
    
        will establish that all inputs to the geometry shader are triangles and
        that the geometry shader executable is run six times for each triangle
        processed.
    
        All geometry shader input unsized array declarations will be sized by an
        earlier input primitive layout qualifier, when present, as per the
        following table.
    
            Layout                Size of Input Arrays
            -------------------   --------------------
            points                        1
            lines                         2
            lines_adjacency               4
            triangles                     3
            triangles_adjacency           6
    
        The intrinsically declared input array gl_in[] will also be sized by any
        input primitive-layout declaration. Hence, the expression
    
          gl_in.length()
    
        will return the value from the table above.
    
        For inputs declared without an array size, including intrinsically
        declared inputs (i.e., gl_in), a layout must be declared before any use
        of the method length or other any array use that requires the array size
        to be known.
    
        It is a compile-time error if a layout declaration's array size (from
        table above) does not match all the explicit array sizes specified in
        declarations of an input variables in the same shader. The following
        includes examples of compile-time errors:
    
          // code sequence within one shader...
          in vec4 Color1[];      // legal, size still unknown
          in vec4 Color2[2];     // legal, size is 2
          in vec4 Color3[3];     // illegal, input sizes are inconsistent
          layout(lines) in;      // legal for Color2, input size is 2, matching Color2
          in vec4 Color4[3];     // illegal, contradicts layout of lines
          layout(lines) in;      // legal, matches other layout() declaration
          layout(triangles) in;  // illegal, does not match earlier layout() declaration
    
        It is a link-time error if not all provided sizes (sized input arrays
        and layout size) match in the geometry shader of a program.
    
    
        Add new section 4.4.2.gs before section 4.4.2.fs, as added by
        EXT_shader_io_blocks:
    
    
        Section 4.4.2.gs Geometry Outputs
    
        Geometry shaders can have two additional types of output layout
        identifiers: an output primitive type and a maximum output vertex count.
        The primitive type and vertex count identifiers are allowed only on the
        interface qualifier out, not on an output block, block member, or
        variable declaration.
    
        The layout qualifier identifiers for geometry shader outputs are
    
          layout-qualifier-id
              points
              line_strip
              triangle_strip
              max_vertices = integer-constant
    
        The primitive type identifiers points, line_strip, and triangle_strip
        are used to specify the type of output primitive produced by the
        geometry shader, and only one of these is accepted. The geometry shader
        object in a program must declare an output primitive type, and all
        geometry shader output primitive type declarations in a program must
        declare the same primitive type.
    
        The vertex count identifier max_vertices is used to specify the maximum
        number of vertices the shader will ever emit in a single invocation. The
        geometry shader object in a program must declare a maximum output vertex
        count, and all geometry shader output vertex count declarations in a
        program must declare the same count.
    
        In this example,
    
          layout(triangle_strip, max_vertices = 60) out;  // order does not matter
          layout(max_vertices = 60) out;      // redeclaration okay
          layout(triangle_strip) out;         // redeclaration okay
          layout(points) out;                 // error, contradicts triangle_strip
          layout(max_vertices = 30) out;      // error, contradicts 60
    
        all outputs from the geometry shader are triangles and at most 60
        vertices will be emitted by the shader. It is an error for the maximum
        number of vertices to be greater than gl_MaxGeometryOutputVertices.
    
        All geometry shader output layout declarations in a program must declare
        the same layout and same value for max_vertices. If geometry shaders are
        in a program, there must be at least one geometry output layout
        declaration somewhere in that program.
    
    
        Modify section 4.7.4, "Default Precision Qualifiers":
    
        Modify the third paragraph on p. 64:
    
        "All languages except for the fragment language have the following
        predeclared globally scoped default precision statements: ..."
    
    
        Add new section 7.1.1gs following section 7.1.1 "Vertex Shader Special
        Variables":
    
        Section 7.1.1gs, Geometry Shader Special Variables
    
        In the geometry language, the built-in variables are intrinsically
        declared as:
    
            [[ If EXT_geometry_point_size is supported and enabled: ]]
          in gl_PerVertex {
              highp vec4 gl_Position;
              highp float gl_PointSize;
          } gl_in[];
    
            [[ Otherwise: ]]
          in gl_PerVertex {
              highp vec4 gl_Position;
          } gl_in[];
    
          in highp int gl_PrimitiveIDIn;
          in highp int gl_InvocationID;
    
            [[ If EXT_geometry_point_size is supported and enabled: ]]
          out gl_PerVertex {
              highp vec4 gl_Position;
              highp float gl_PointSize;
          };
    
            [[ Otherwise: ]]
          out gl_PerVertex {
              highp vec4 gl_Position;
          };
    
          out highp int gl_PrimitiveID;
          out highp int gl_Layer;
    
    
        Section 7.1.1gs.1, Geometry Shader Input Variables
    
        gl_Position contains the output written in the previous shader stage to
        gl_Position.
    
          [[ If EXT_geometry_point_size is supported: ]]
        gl_PointSize contains the output written in the previous shader stage to
        gl_PointSize.
    
        gl_PrimitiveIDIn contains the number of primitives processed by the
        shader since the current set of rendering primitives was started.
    
        gl_InvocationID contains the invocation number assigned to the geometry
        shader invocation. It is assigned integer values in the range [0, N-1],
        where N is the number of geometry shader invocations per primitive.
    
    
        Section 7.1.1gs.2, Geometry Shader Output Variables
    
        gl_Position is used in the same fashion as the corresponding output
        variable in the vertex shader. Its value is undefined after geometry
        processing if the shader calls EmitVertex() without having written
        gl_Position since the last EmitVertex(), or does not write it at all.
    
          [[ If EXT_geometry_point_size is supported: ]]
        gl_PointSize is used in the same fashion as the corresponding output
        variable in the vertex shader.
    
        gl_PrimitiveID is filled with a single integer that serves as a
        primitive identifier to the fragment shader. This is then available to
        fragment shaders, which will select the written primitive ID from the
        provoking vertex of the primitive being shaded. If a fragment shader
        using gl_PrimitiveID is active and a geometry shader is also active, the
        geometry shader must write to gl_PrimitiveID or the fragment shader
        input gl_PrimitiveID is undefined. See section 11.1gs.4 "Geometry Shader
        Outputs" of the OpenGL ES Specification for more information.
    
        gl_Layer is used to select a specific layer (or face and layer of a cube
        map) of a multi-layer framebuffer attachment. The actual layer used will
        come from one of the vertices in the primitive being shaded. Which
        vertex the layer comes from is determined as discussed in section
        11.1gs.4 of the OpenGL ES Specification but may be undefined, so it is
        best to write the same layer value for all vertices of a primitive. If a
        shader statically assigns a value to gl_Layer, layered rendering mode is
        enabled. See section 11.1gs.4 "Geometry Shader Outputs"and section 9.7gs
        "Layered Framebuffers" of the OpenGL ES Specification for more
        information. If a shader statically assigns a value to gl_Layer, and
        there is an execution path through the shader that does not set
        gl_Layer, then the value of gl_Layer is undefined for executions of the
        shader that take that path.
    
    
        Modify section 7.1.2 "Fragment Shader Special Variables", as modified by
        OES_sample_variables:
    
        Add to the list of built-in variables:
    
          in highp int gl_PrimitiveID;
          in highp int gl_Layer;
    
        Add descriptions of these variables:
    
        The input variable gl_PrimitiveID is filled with the value written to
        the gl_PrimitiveID geometry shader output, if a geometry shader is
        present. Otherwise, it is filled with the number of primitives processed
        by the shader since the current set of rendering primitives was started.
    
        The input variable gl_Layer is filled with the value written to the
        gl_Layer geometry shader output, if a geometry shader is present. If the
        geometry stage does not dynamically assign a value to gl_Layer, the
        value of gl_Layer in the fragment stage will be undefined. If the
        geometry stage makes no static assignment to gl_Layer, the input value
        in the fragment stage will be zero. Otherwise, the fragment stage will
        read the same value written by the geometry stage, even if that value is
        out of range. If a fragment shader contains a static access to gl_Layer,
        it will count against the implementation defined limit for the maximum
        number of inputs to the fragment stage.
    
        Modify the description of gl_FrontFacing:
    
        The input variable gl_FrontFacing is true if the fragment belongs to a
        front-facing primitive. One use of this is to emulate two-sided lighting
        by selecting one of two colors calculated by a vertex or geometry
        shader.
    
    
        Add to Section 7.2 "Built-In Constants", matching the
        corresponding API implementation-dependent limits:
    
          const mediump int gl_MaxGeometryInputComponents = 64;
          const mediump int gl_MaxGeometryOutputComponents = 128;
          const mediump int gl_MaxGeometryImageUniforms = 0;
          const mediump int gl_MaxGeometryTextureImageUnits = 16;
          const mediump int gl_MaxGeometryOutputVertices = 256;
          const mediump int gl_MaxGeometryTotalOutputComponents = 1024;
          const mediump int gl_MaxGeometryUniformComponents = 1024;
          const mediump int gl_MaxGeometryAtomicCounters = 0;
          const mediump int gl_MaxGeometryAtomicCounterBuffers = 0;
    
        Modify gl_MaxCombinedTextureImageUnits to match the API:
    
          const mediump int gl_MaxCombinedTextureImageUnits = 64;
    
    
        Add new section 8.12gs preceding section 8.13 "Fragment Processing
        Functions":
    
        Section 8.12gs, Geometry Shader Functions
    
        These functions are only available in geometry shaders. They are
        described in more depth following the table.
    
            Syntax              Description
            ------------------- -----------------------------------------------
            void EmitVertex()   Emits the current values of output variables to
                                the current output primitive. On return from
                                this call, the values of output variables are
                                undefined.
            void EndPrimitive() Completes the current output primitive and
                                starts a new one. No vertex is emitted.
    
        The function EmitVertex() specifies that a vertex is completed. A vertex
        is added to the current output primitive using the current values of all
        built-in and user-defined output variables. The values of all output
        variables are undefined after a call to EmitVertex(). If a geometry
        shader invocation has emitted more vertices than permitted by the output
        layout qualifier max_vertices, the results of calling EmitVertex() are
        undefined.
    
        The function EndPrimitive() specifies that the current output primitive
        is completed and a new output primitive (of the same type) will be
        started by any subsequent EmitVertex(). This function does not emit a
        vertex. If the output layout is declared to be "points", calling
        EndPrimitive() is optional.
    
        A geometry shader starts with an output primitive containing no
        vertices. When a geometry shader terminates, the current output
        primitive is automatically completed. It is not necessary to call
        EndPrimitive() if the geometry shader writes only a single primitive.
    
    
        Modify section 8.16, "Shader Memory Control Functions" to change the
        paragraph starting "When these functions return..." on p. 139:
    
        When these functions return ... the execution of the original shader
        invocation (e.g., fragment shader invocations for a primitive resulting
        from a particular vertex or geometry shader invocation).
    
    Issues
    
        Note: These issues apply specifically to the definition of the
        EXT_geometry_shader specification, which is based on the OpenGL
        extension ARB_geometry_shader4 as updated in OpenGL 4.x. Resolved issues
        from ARB_geometry_shader4 have been removed, but remain largely
        applicable to this extension. ARB_geometry_shader4 can be found in the
        OpenGL Registry.
    
        (1) What functionality was removed from ARB_geometry_shader4 / GL 4.4?
    
          - Interactions with features not supported by the underlying
            ES 3.1 API and Shading Language, including:
              * one-dimensional, rectangular, and cube map array textures (cube
                map array textures are restored in EXT_texture_cube_map_array).
              * vertex program point size mode
              * viewport arrays and other support for multiple viewports
              * multiple vertex streams (these require ARB_transform_feedback3)
              * gl_ClipDistance shader inputs and outputs.
              * CopyPixels and Bitmap
              * fixed-functionality vertex and fragment shader stages
              * "component" layout
              * Implicit references to glPolygonMode
              * References allowing or assuming more than one shader object per
                pipeline stage.
          - FramebufferTexture3D (use FramebufferTextureLayer instead).
          - gl_MaxGeometryVaryingComponents
          - gl_VerticesIn
          - FramebufferTextureFaceARB (also removed from GL core)
          - The FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT completeness condition,
            also removed from desktop GL.
          - Description of limitations of GeForce series 8 chips.
          - GLSL two-dimensional arrays (already supported by GLSL-ES 3.10 in a
            more general fashion). Note that while multi-dimensional arrays are
            supported, they are explicitly not supported as shader inputs and
            outputs, and that decision is respected here.
          - multiple compilation units of the same shader type.
    
        (2) What functionality was changed and added relative to
            ARB_geometry_shader4 and GL 4.4?
    
          - EXT_geometry_shader closely matches OpenGL 4.4 geometry shader
            language, rather than ARB_geometry_shader language.
          - In particular, input and output interface blocks were added from GL
            4.4 / GLSL 4.40, via the required EXT_shader_io_blocks extension.
          - Interactions were added with OpenGL ES 3.1 functionality including
            separate shader objects, shader atomic counters, shader storage
            buffer objects, and shader image load/store.
          - Geometry instancing was added from ARB_gpu_shader5.
          - FRAMEBUFFER_DEFAULT_LAYERS_EXT and MAX_FRAMEBUFFER_LAYERS_EXT state
            and related spec language from ARB_framebuffer_no_attachments (it
            was removed from OpenGL ES 3.1).
          - PRIMITIVES_GENERATED_EXT query from OpenGL 3.0, to count primitives
            due to geometry amplification by geometry shaders.
          - LAYER_PROVOKING_VERTEX_EXT query from ARB_provoking_vertex /
            ARB_viewport_array (but did not add ProvokingVertex control, just
            this query).
          - Specify undefined behavior when appending outputs to XFB buffers if
            any component would be written at a misaligned offset, from
            ARB_enhanced_layouts. Bug 11191 is tracking this into ES 3.1, as
            it's not specific to geometry shaders.
          - Writing point size from geometry shaders is optional functionality.
            If it's not supported or written, the point size of 1.0 is used.
          - Added precision qualifiers to builtins.
          - Clarification from Bug 11508.
          - Added program interface query properties relevant to geometry
            shaders.
    
        (3) Should GetActiveUniformBlockiv support queries for uniform blocks
            and atomic counter buffers referenced by geometry shaders?
    
        RESOLVED: No. Use the new generic program interface query supported by
        OpenGL ES 3.1, following the behavior of features added to 3.1 such as
        compute shaders, which also dropped these legacy tokens / queries.
    
        (4) 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 = 48
                This is 12 bindings/stage * 4 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 = 36
                This is 12 blocks/stage * 3 stages, since compute shaders can't
                be mixed with other stages.
            MAX_COMBINED_TEXTURE_IMAGE_UNITS = 64
                This is 16 textures/stage * 4 stages.
    
        Khronos internal bugs 5870, 8891, and 9424 cover the ARB's thinking on
        these limits for GL 4.0 and beyond.
    
        (5) 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 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've resolved 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".
    
        (6) 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.
    
        (7) 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 EXT 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 (7). 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.
    
        (8) What should the minimum value of MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT
        be?
    
        RESOLVED: GL 4.4 has 512, but we use 1024 to match the ES vertex
        shader limit.
    
        (9) What should the minimum value of MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT
        be?
    
        RESOLVED: This was reduced to 64 in revision 20, from an initial value
        of 128 (matching GL 4.4), to match the limits on vertex shader outputs
        and fragment shader inputs (Bug 12823).
    
        (10) What naming and token values should we use for
        GEOMETRY_VERTICES_OUT_EXT, GEOMETRY_INPUT_TYPE_EXT, and
        GEOMETRY_OUTPUT_TYPE_EXT?
    
        DISCUSSION: In EXT_geometry_shader4 and ARB_geometry_shader4, the
        vertice and input and output type are specified by a program parameter
        state. OpenGL 3.2 requires this to be provided in the shader text and
        provided a query for these values after linking. Since this was a
        functionality change the similarly named enumerants were given different
        values. Thus we have the following token names and enumerants in GL:
    
        (from EXT_geometry_shader4)
            GEOMETRY_VERTICES_OUT_EXT        0x8DDA
            GEOMETRY_INPUT_TYPE_EXT          0x8DDB
            GEOMETRY_OUTPUT_TYPE_EXT         0x8DDC
    
        (from ARB_geometry_shader4)
            GEOMETRY_VERTICES_OUT_ARB        0x8DDA
            GEOMETRY_INPUT_TYPE_ARB          0x8DDB
            GEOMETRY_OUTPUT_TYPE_ARB         0x8DDC
    
        (from OpenGL 3.2)
            GEOMETRY_VERTICES_OUT            0x8916
            GEOMETRY_INPUT_TYPE              0x8917
            GEOMETRY_OUTPUT_TYPE             0x8918
    
        Now for this extensions we are providing the GL 3.2-type functionality
        and thus we should use the token *values* from GL core.  However,
        it is expected that this extension will ship as an EXT, so we would
        end up with:
            GEOMETRY_VERTICES_OUT_EXT        0x8916
            GEOMETRY_INPUT_TYPE_EXT          0x8917
            GEOMETRY_OUTPUT_TYPE_EXT         0x8918
        which gives us the same token names as the EXT_geometry_shader4 but
        the same token values as OpenGL 3.2. This would potentially be
        quite confusing if headers are mix and matched.
    
        OPTIONS: If this extension ships as an EXT,
        a) invent a new suffix. Ideally we'd have a different EXT-like suffix
        to disambiguate between GL and ES multivendor extensions.  However this
        has not happened yet.
        b) we use a _VENDOR suffix for these 3 enumerants to disambiguate them
        c) change the tokens to GEOMETRY_LINKED_*_EXT, with the expectation that
        we'd rename them back if this becomes core functionality.
    
        RESOLVED.  Pick c). We will include the "_LINKED" term in the tokens
        to indicate that they represent the values generated at link time. At
        such a time as this becomes core functionality in ES, they should
        be renamed back to be the same as the GL tokens (possibly with an
        alias for compatibility with this extension).
    
        (11) How should we handle the enablement of input/output blocks in
        non-geometry stages?
    
        RESOLVED: Early drafts of this extension added a number
        of capabilities that were not specific to geometry shaders, namely:
         * allowed the declaration and use of input and output blocks
         * moved the built-in "per-vertex" in/out variables into the
           built-in gl_PerVertex block
         * allowed the redeclaration of the gl_PerVertex block.
    
        In OpenGL these capabilities are provided by the GLSL 1.50 version.
        Furthermore, when separable programs are in use, OpenGL *requires*
        that the gl_PerVertex block be declared in any shader which uses any of
        its members (including vertex and fragment shaders).
    
        Since this capability is being added as an extension to OpenGL ES 3.1
        we don't have a core shading language version to hang this feature
        off of and thus we need an extension to enable this.
    
        Using the earlier drafts, we would have needed to use the
        EXT_geometry_shader #extension in vertex or fragment shaders to enable
        this functionality. Since this was rather unintuitive and this
        functionality does have utility on it's own, we opted instead to pull
        this out to a separate extension that is a required dependency
        (EXT_shader_io_blocks).
    
        The geometry (and tessellation) extensions will automatically imply
        that the EXT_shader_io_blocks functionality is enabled, since it is
        impossible to use them in a useful manner without accessing
        gl_PerVertex input/output blocks.
    
        (12) Due to HW limitations, some vendors may not be able
        to support writing gl_PointSize from geometry 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 geometry
        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 geometry shaders.  When this extension
        is enabled, the gl_PerVertex block does include gl_PointSize and it
        can be written from geometry shaders as normal.
    
        If the point-size extension is not supported, all points written
        from a geometry 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.
    
        (13) Does this extension change how transform feedback operates
        compared to unextended OpenGL ES 3.0 or 3.1?
    
        RESOLVED: Yes. Because dynamic geometry amplification in a geometry
        shader can make it difficult if not impossible to predict the amount
        of geometry that may be generated in advance of executing the shader,
        the draw-time error for transform feedback buffer overflow conditions
        is removed and replaced with the GL behavior (primitives are not written
        and the corresponding counter is not updated). Since we no longer
        require being able to predict how much geometry will be generated, we
        also lift the restriction that only DrawArray* commands are supported
        and also support the DrawElements* commands for transform feedback.
        We also allow Draw*Indirect to be used with transform feedback.
    
        (14) Should GetShaderPrecisionFormat support the new GEOMETRY_SHADER_EXT
        stage?
    
        RESOLVED: No. Following the precedence of OpenGL ES 3.1 which did not
        extend this query to COMPUTE_SHADERS due to the following reason:
        GetShaderPrecisionFormat is listed in ES 3.0 appendix F.1 Legacy Features
        whose use is not recommended.  Adding new capabilities to a feature that
        is effectively deprecated seems silly (Bug 11464).
    
    Revision History
    
        Rev.    Date    Author    Changes
        ----  --------  --------- -------------------------------------------------
         21   05/31/16  Jon Leech Note that primitive ID counters are reset to zero
                                  after each instance drawn (Bug 14024).
         20   07/23/15  Jon Leech Reduce minimum value of
                                  MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT to 64 (Bug
                                  12823).
         19   10/08/14  dkoch     change max_vertices identifier to integer-constant
                                  to match rest of ES layout-qualifier-id's
                                  (Bug 12878)
         18   04/23/14  dkoch     Add GetProgramPipelineiv to the list of functions
                                  which accept GEOMETRY_SHADER token. Add issue 14.
                                  (Bug 12152)
         17   03/28/14  Jon Leech Sync with released ES 3.1 specs. Reflow text and
                                  remove irrelevant footnote to table 20.40.
         16   03/26/14  dkoch     Update contributors, update issue 14 and
                                  allow XFB with draw indirect.
         15   03/10/14  Jon Leech Rebase on OpenGL ES 3.1 and change suffix to EXT.
                                  Remove material now in the 3.1 spec and fix up
                                  references between API and GLSL specs.
         14   02/27/14  dkoch     Fix typo in issue 14.
         13   02/18/14  dkoch     Resolve issues 5, 9, 10.
                                  Resolve issue 11, by adding _LINKED to the
                                  affected tokens.
                                  Clarify XFB error relaxations and add issue 14
                                  explaining the difference from ES 3.0.
         12   02/12/14  dkoch     Correct some entry points/token acceptance.
                                  Explicitly delete error condition for non-arrayed
                                  drawing commands with transform feedback.
         11   01/16/14  dkoch     Clarification from Bug 11508
                                  Remove mention of multiple compilation units.
         10   12/19/13  dkoch     Move input and output interface block and
                                  related functionality to separate extension.
                                  Rewrote / renumbered the issues.
                                  Added missing enum.
                                  Add geometry point size extension.
                                  Added precision qualifiers to builtins.
                                  Remove duplicated edits to Shader Memory Access
    
          9   12/02/13  dkoch     Add Issues 11-14
    
          8   11/21/13  dkoch     Minor updates
            - Remove DSA commands
            - update MAX_FRAMEBUFFER_LAYERS_EXT to match MAX_ARRAY_TEXTURES (256)
    
          7   11/20/13  Jon Leech Minor updates
            - Sync with ES 3.1 spec language update.
            - Refer to ES 3.1 instead of ES 3plus.
    
          6   11/14/13  Jon Leech Minor updates
            - Incorporate language tweak on output variables from bug 11100
    
          5   11/08/13  Jon Leech Minor updates
            - Incorporate language tweak from bug 11102.
    
          4   11/08/13  Jon Leech Minor updates
            - Remove FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT (token and
              language is already in ES 3.0).
            - Reorganize errors for commands completely described in this
              specification into separate "Errors" subsections like GL 4.4.
            - Add complete set of error conditions for FramebufferTextureEXT.
    
          3   11/06/13  Jon Leech Updates based on Daniel Koch's feedback
            - Remove references from desktop language allowing multiple shader
              objects per stage.
            - Clean up typos identified by Daniel.
            - Disallow multi-dimensional arrays as shader inputs & outputs,
              consistent with ES 3.1 multidimensional arrays and geometry_shader
              issue 7.
            - Drop implicit reference to nonexistent glPolygonMode in section
              3.4.
            - Drop FramebufferTexture3D in favor of FramebufferTextureLayer.
            - Add trivial interactions with compute shaders.
            - Drop gl_MaxGeometryVaryingComponents constant.
            - Added FRAMEBUFFER_DEFAULT_LAYERS_EXT and
              MAX_FRAMEBUFFER_LAYERS_EXT state, and related spec language from
              ARB_framebuffer_no_attachments (it was removed from
              ES 3.1).
            - Added PRIMITIVES_GENERATED_EXT query from GL 3.0.
            - Added LAYER_PROVOKING_VERTEX_EXT query from ARB_provoking_vertex /
              ARB_viewport_array.
            - Dropped reference to cube map array texture layer selection, this
              will go in EXT_texture_cube_map_array.
    
          2   11/03/13  Jon Leech
            - Revisions based on NVIDIA feedback and first draft of
              EXT_tessellation_shader.
            - Rearrange descriptions of built-in variables in chapter 7 GLSL-ES
              language.
            - Fix minor inconsistencies and descriptions relative to GL 4.2/4.4
              and EXT_tessellation_shader.
            - Expand Issues list with open issues.
    
          1   10/20/13  Jon Leech Initial version based on ARB_geometry_shader4.
    
    人人超碰97caoporen国产