Edit

kc3-lang/angle/extensions/ANGLE_texture_multisample.txt

Branch :

  • Show log

    Commit

  • Author : Yunchao He
    Date : 2018-01-10 21:28:00
    Hash : 97dbf436
    Message : Add specification for ANGLE_texture_multisample. The patch adds the specification for the ANGLE_texture_multisample extension, which enables the functionality of multisample texture. This extension is also the basis to expose multisample texture to web via a webgl extension. BUG=angleproject:2275 BUG=angleproject:2775 Change-Id: I21771ac1d7d3e2fad8bf5d5e0a5c5e082c8fe7a2 Reviewed-on: https://chromium-review.googlesource.com/859917 Commit-Queue: Yunchao He <yunchao.he@intel.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • extensions/ANGLE_texture_multisample.txt
  • Name
    
        ANGLE_texture_multisample
    
    Name Strings
    
        GL_ANGLE_texture_multisample
    
    Contributors
    
        Yunchao He, Intel Corporation
        Yizhou Jiang, Intel Corporation
        Contributors to the OpenGL ES 3.1, GLSL ES 3.1, and ARB_texture_multisample
    
    Contact
    
        Yunchao He (yunchao.he 'at' intel.com)
    
    Status
    
        Incomplete
    
    Version
    
        Last Modified Date: August 27, 2018
        Author Revision: 1
    
    Number
    
        OpenGL ES Extension XX
    
    Dependencies
    
        OpenGL ES 3.0 is required.
    
        This extension is written against the OpenGL ES 3.0.5 and OpenGL ES
        Shading Language 3.0 (Document Revision 6) specifications.
    
        KHR_robustness affects the behavior of this specification.
    
    Overview
    
        This extension provides support for a new type of texture -
        two-dimensional multisample textures - as well as mechanisms to
        allocate storage and attach such textures to FBOs for rendering.
        It also add supports using such textures in a shader, fetching specific
        samples from such textures in a shader, and querying the dimensions of
        such textures in a shader.
    
        This extension also includes the following functionality, some of which
        was first described in NV_explicit_multisample:
    
         * An API to query the location of samples within the pixel
    
         * An explicit control for the multisample sample mask to augment the
           control provided by SampleCoverage
    
         * An API to query the texture's level-of-detail information for various
           parameters
    
         * A mechanism to support the SAMPLE_MASK capability
    
         * A mechanism to return corresponding types for multisample textures when
           the uniform type is queried by getActiveUniform
    
        This extension does not expose multisampled 2D array textures, because they
        are not supported in OpenGL ES 3.1.
    
    IP Status
    
        No known IP claims.
    
    New Procedures and Functions
    
        void TexStorage2DMultisampleANGLE(enum target,
                                          sizei samples,
                                          enum sizedinternalformat,
                                          sizei width,
                                          sizei height,
                                          boolean fixedsamplelocations);
    
        void GetMultisamplefvANGLE(enum pname, uint index, float *val);
    
        void SampleMaskiANGLE(uint maskNumber, bitfield mask);
    
        void GetTexLevelParameter{if}vANGLE(enum target, int level,
                                            enum pname, T *params );
    
    New Tokens
    
        Accepted by the <target> parameter of BindTexture,
        TexStorage2DMultisampleANGLE, GetInternalformativ, TexParameter{if}*,
        GetTexParameter{if}v, GetTexLevelParameter{if}vANGLE and
        by the <textarget> parameter of FramebufferTexture2D:
    
            TEXTURE_2D_MULTISAMPLE_ANGLE                      0x9100
    
        Accepted by the <pname> parameter of GetMultisamplefvANGLE:
    
            SAMPLE_POSITION_ANGLE                             0x8E50
    
        Accepted by the <cap> parameter of Enable, Disable, and IsEnabled:
    
            SAMPLE_MASK_ANGLE                                 0x8E51
    
        Accepted by the <target> parameter of GetIntegeri_v:
    
            SAMPLE_MASK_VALUE_ANGLE                           0x8E52
    
        Accepted by the <pname> parameter of GetIntegerv:
    
            MAX_SAMPLE_MASK_WORDS_ANGLE                       0x8E59
            MAX_COLOR_TEXTURE_SAMPLES_ANGLE                   0x910E
            MAX_DEPTH_TEXTURE_SAMPLES_ANGLE                   0x910F
            MAX_INTEGER_SAMPLES_ANGLE                         0x9110
            TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE              0x9104
    
        Accepted by the <pname> parameter of GetTexLevelParameter{if}vANGLE:
    
            TEXTURE_SAMPLES_ANGLE                             0x9106
            TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE              0x9107
            TEXTURE_WIDTH                                     0x1000
            TEXTURE_HEIGHT                                    0x1001
            TEXTURE_DEPTH                                     0x8071
            TEXTURE_INTERNAL_FORMAT                           0x1003
            TEXTURE_RED_SIZE                                  0x805C
            TEXTURE_GREEN_SIZE                                0x805D
            TEXTURE_BLUE_SIZE                                 0x805E
            TEXTURE_ALPHA_SIZE                                0x805F
            TEXTURE_DEPTH_SIZE                                0x884A
            TEXTURE_STENCIL_SIZE                              0x88F1
            TEXTURE_SHARED_SIZE                               0x8C3F
            TEXTURE_RED_TYPE                                  0x8C10
            TEXTURE_GREEN_TYPE                                0x8C11
            TEXTURE_BLUE_TYPE                                 0x8C12
            TEXTURE_ALPHA_TYPE                                0x8C13
            TEXTURE_DEPTH_TYPE                                0x8C16
            TEXTURE_COMPRESSED                                0x86A1
    
        Returned by the <type> parameter of GetActiveUniform:
    
            SAMPLER_2D_MULTISAMPLE_ANGLE                      0x9108
            INT_SAMPLER_2D_MULTISAMPLE_ANGLE                  0x9109
            UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ANGLE         0x910A
    
    Additions to Chapter 2 of the OpenGL ES 3.0.5 Specification (OpenGL ES
    Operation)
    
        Add to table 2.10 "OpenGL ES Shading Language type tokens" page 64:
    
        Type Name Token                                       Keyword
        -----------------------------------------             ------------
        SAMPLER_2D_MULTISAMPLE_ANGLE                          sampler2DMS
        INT_SAMPLER_2D_MULTISAMPLE_ANGLE                      isampler2DMS
        UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ANGLE             usampler2DMS
    
        Add to section 2.12.9, after subsection "Texel Fetches":
    
        Multisample Texel Fetches
    
        Multisample buffers do not have mipmaps, and there is no level of
        detail parameter for multisample texel fetches. Instead, an integer
        parameter selects the sample number to be fetched from the buffer.
        The number identifying the sample is the same as the value used to
        query the sample location using GetMultisamplefvANGLE. Multisample
        textures are not filtered when samples are fetched, and filter state
        is ignored.
    
        If the context was created with robust buffer access enabled, the result
        of the texel fetch in the following cases is zero. If robust buffer
        access is not enabled, the result of the texel fetch is undefined if
        any of the following conditions hold:
    
        * the texel coordinate (i, j) refer to a texel outside the extents
          of the multisample texture image, where any of
                      i < 0           i >= W
                      j < 0           j >= H
          and the size parameter W and H refer to the width and height of
          the image.
    
        * the specified sample number does not exist (is negative, or greater
          than or equal to the number of samples in the texture).
    
        Additionally, these fetches may only be performed on a multisample
        texture sampler. No other sample or fetch commands may be performed
        on a multisample texture sampler.
    
    Additions to Chapter 3 of the OpenGL ES 3.0.5 Specification (Rasterization)
    
        Insert into section 3.3, "Multisampling" after the discussion of
        the query for SAMPLES:
    
        (..., and is queried by calling GetIntegerv with pname set to SAMPLES.)
    
        The location at which shading is performed for a given sample (the
        shading sample location) is queried with the command
    
            void GetMultisamplefvANGLE(enum pname, uint index, float *val);
    
        <pname> must be SAMPLE_POSITION_ANGLE, and <index> corresponds to the
        sample for which the location should be returned. The shading sample
        location (x, y) is returned as two floating-point values in (val[0],
        val[1]) respectively. x and y each lie in the range [0, 1] and
        represent a location in pixel space at which depth and associated
        data for that sample are evaluated for a fragment (e.g. where sample
        shading is performed). (0.5, 0.5) thus corresponds to the pixel center.
        If the multisample mode does not have fixed sample locations, the returned
        values may only reflect the locations of samples within some pixels.
    
        An INVALID_ENUM error is generated if <pname> is not SAMPLE_LOCATION.
        An INVALID_VALUE error is generated if <index> is greater than or equal to
        the value of SAMPLES.
    
        Modify Section 3.8.1, "Texture Objects":
    
        (modify first paragraph of section, p. 122, simply adding
         references to multisample textures)
    
        Textures in GL are represented by named objects. The name space for texture
        objects is the unsigned integers, with zero reserved by the GL to represent
        the default texture object. The default texture object is bound to each of
        the TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, and
        TEXTURE_2D_MULTISAMPLE_ANGLE targets during context initialization.
    
        (modify the last paragraph, p. 123)
    
        The texture object name space, including the initial two- and
        three-dimensional, two-dimensional array, cube map, and two-dimensional
        multisample texture objects, is shared among all texture units. A texture
        object may be bound to more than one texture unit simultaneously. After a
        texture object is bound, any GL operations on that target object affect
        any other texture units to which the same texture object is bound.
    
        Modify Section 3.8.3, "Texture Image Specification" (p. 134):
    
        (add the new target to MAX_TEXTURE_SIZE description)
    
        In a similar fashion, the maximum allowable width of a texel array
        for a two-dimensional texture, two-dimensional array texture,
        or two-dimensional multisample texture, and the maximum allowable
        height of a two-dimensional texture, two-dimensional array texture,
        or two-dimensional multisample texture, must be at least 2^(k-lod)
        for image arrays of level 0 through k, where k is the log base 2 of
        MAX_TEXTURE_SIZE.
    
        Insert new Section 3.8.5, "Multisample Textures". Renumber subsequent
        sections:
    
        In addition to the texture types described in previous sections, an
        additional type of texture is supported. A multisample texture is
        similar to a two-dimensional texture, except it contains multiple
        samples per texel. Multisample textures do not have multiple image
        levels, and are immutable.
    
        The command
    
            void TexStorage2DMultisampleANGLE(enum target, sizei samples,
                                       int sizedinternalformat,
                                       sizei width, sizei height,
                                       boolean fixedsamplelocations);
    
        establishes the data storage, format, dimensions, and number of samples
        of a multisample texture's image. <target> must be
        TEXTURE_2D_MULTISAMPLE_ANGLE. <width> and <height> are the dimensions
        in texels of the texture.
    
        <samples> represents a request for a desired minimum number of samples.
        Since different implementations may support different sample counts for
        multisampled textures, the actual number of samples allocated for the
        texture image is implementation-dependent. However, the resulting value
        for TEXTURE_SAMPLES_ANGLE is guaranteed to be greater than or equal to
        <samples> and no more than the next larger sample count supported by the
        implementation.
    
        If <fixedsamplelocations> is TRUE, the image will use identical sample
        locations and the same number of samples for all texels in the image,
        and the sample locations will not depend on the sizedinternalformat or
        size of the image.
    
        Upon success, TexStorage2DMultisampleANGLE deletes any existing image
        for <target> and the contents of texels are undefined. The values of
        TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_SAMPLES_ANGLE,
        TEXTURE_INTERNAL_FORMAT and TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE are
        set to <width>, <height>, the actual number of samples allocated,
        <sizedinternalformat>, and <fixedsamplelocations> respectively.
    
        When a multisample texture is accessed in a shader, the access takes one
        vector of integers describing which texel to fetch and an integer
        corresponding to the sample numbers described in section 3.3 describing
        which sample within the texel to fetch. No standard sampling instructions
        are allowed on the multisample texture targets, and no filtering is
        performed by the fetch. Fetching a sample number less than zero, or
        greater than or equal to the number of samples in the texture, produces
        undefined results.
    
        An INVALID_ENUM error is generated if target is not
        TEXTURE_2D_MULTISAMPLE_ANGLE.
        An INVALID_OPERATION error is generated if zero is bound to <target>.
        An INVALID_VALUE is generated if <width> or <height> is less than 1.
        An INVALID_VALUE is generated if <width> or <height> is greater than
        the value of MAX_TEXTURE_SIZE.
        An INVALID_VALUE is generated if samples is zero.
        An INVALID_ENUM error is generated if <sizedinternalformat> is not
        color-renderable, depth-renderable, or stencil-renderable (as defined
        in section 4.4.4).
        An INVALID_ENUM error is generated if <sizedinternalformat> is one of the
        unsized base internal formats listed in table 3.11.
        An INVALID_OPERATION is generated if <samples> is greater than the maximum
        number of samples supported for this <target> and <sizedinternalformat>,
        The maximum number of samples supported can be determined by calling
        GetInternalformativ with a <pname> of SAMPLES (see section 6.1.15).
        An INVALID_OPERATION is generated if the value of TEXTURE_IMMUTABLE_FORMAT
        for the texture currently bound to <target> on the active texture unit is
        TRUE.
        An OUT_OF_MEMORY error is generated if the GL is unable to create a texture
        image of the requested size.
    
        Modify Section 3.8.7, "Texture Parameters":
    
        (add TEXTURE_2D_MULTISAMPLE_ANGLE to the texture targets accepted by
        TexParameter*)
    
        <target> is the target, either TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY,
        TEXTURE_CUBE_MAP, or TEXTURE_2D_MULTISAMPLE_ANGLE.
    
        Add the following paragraph to the end of Section 3.8.7:
    
        An INVALID_ENUM is generated if <target> is TEXTURE_2D_MULTISAMPLE_ANGLE
        and <pname> is any sampler state from table 6.10. An INVALID_OPERATION
        error is generated if <target> is TEXTURE_2D_MULTISAMPLE_ANGLE, and
        <pname> TEXTURE_BASE_LEVEL is set to any value other than zero.
    
        Modify Section 3.8.14, "Texture State" (p. 162):
    
        (... the compressed flag set to FALSE, and a zero compressed size).
    
        Multisample textures also contain an integer identifying the number of
        samples in each texel, and a boolean indicating whether identical sample
        locations and number of samples will be used for all texels in the image.
    
    Additions to Chapter 4 of the OpenGL ES 3.0.5 Specification (Per-Fragment
    Operations and the Framebuffer)
    
        Modify Section 4.1.3, "Multisample Fragment Operations" (p. 174):
    
        (modify the first paragraph to include SAMPLE_MASK_ANGLE and
        SAMPLE_MASK_VALUE_ANGLE on the list of values the coverage value is
        modified based on.)
    
        This step modifies fragment alpha and coverage values based on the values
        of SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE, SAMPLE_COVERAGE_VALUE,
        SAMPLE_COVERAGE_INVERT, SAMPLE_MASK_ANGLE, and SAMPLE_MASK_VALUE_ANGLE.
    
        Add to the end of Section 4.1.3, after the discussion of SAMPLE_COVERAGE:
    
        If SAMPLE_MASK_ANGLE is enabled, the fragment coverage is ANDed
        with the coverage value SAMPLE_MASK_VALUE_ANGLE.
    
        The value of SAMPLE_MASK_VALUE_ANGLE is specified using
    
            void SampleMaskiANGLE(GLuint maskNumber, GLbitfield mask);
    
        with <mask> set to the desired mask for mask word <maskNumber>. Bit B of
        mask word M corresponds to sample 32*M+B as described in Section 3.3. The
        sample mask value is queried by calling GetIntegeri_v with <target> set to
        SAMPLE_MASK_VALUE_ANGLE and the index set to <maskNumber>.
    
        An INVALID_VALUE error is generated if <maskNumber> is greater than or
        equal to the value of MAX_SAMPLE_MASK_WORDS_ANGLE.
    
        Modify Section 4.4.2, "Attaching Images to Framebuffer Objects":
    
        (the first paragraph of RenderbufferStorageMultisample p. 204)
    
        ... If either <width> or <height> is greater than the value of
        MAX_RENDERBUFFER_SIZE, then the error INVALID_VALUE is generated. If
        <samples> is greater than the maximum number of samples supported for
        <sizedinternalformat>, then the error INVALID_OPERATION is generated (see
        GetInternalformativ in section 6.1.15). If the GL is unable to create
        a data store of the requested size, the error OUT_OF_MEMORY is generated.
    
        (the third paragraph of "Required Renderbuffer Formats" p. 205):
    
        Implementations must support creation of renderbuffers in these
        required formats with up to the value of MAX_SAMPLES multisamples,
        with the exception that the signed and unsigned integer formats are
        required only to support creation of renderbuffers with up to the
        value of MAX_INTEGER_SAMPLES_ANGLE multisamples, which must be at
        least one.
    
        (modify section 4.4.2.4 "Attaching Texture Images to a Framebuffer",
        describing FrameBufferTexture2D p. 207)
    
        If texture is not zero, then texture must either name an existing
        two-dimensional texture object and textarget must be TEXTURE_2D, texture
        must name an existing cube map texture and textarget must be one of the
        cube map face targets from table 3.21, or texture must name an existing
        multisample texture and textarget must be TEXTURE_2D_MULTISAMPLE_ANGLE.
        Otherwise, an INVALID_OPERATION error is generated.
    
        <level> specifies ...
    
        If <textarget> is TEXTURE_2D_MULTISAMPLE_ANGLE, then <level> must be zero.
        Otherwise, an INVALID_VALUE error is generated. If textarget is one of ...
    
    
        Modify Section 4.4.4.2, "Whole Framebuffer Completeness":
    
        (modify the last bullet at the top of p. 215)
    
        - The value of RENDERBUFFER_SAMPLES is the same for all attached
          renderbuffers; the value of TEXTURE_SAMPLES_ANGLE is the same for all
          attached textures; and, if the attached images are a mix of
          renderbuffers and textures, the value of RENDERBUFFER_SAMPLES
          matches the value of TEXTURE_SAMPLES_ANGLE.
    
          { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }
    
        (add one more bullet after the last bullet, p. 215)
    
        - The value of TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE is the same for all
          attached textures; and, if the attached images are a mix of renderbuffers
          and textures, the value of TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE must be
          TRUE for all attached textures.
    
          { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }
    
    Additions to Chapter 6 of the OpenGL ES 3.0.5 Specification (State and State
    Requests)
    
        Modify Section 6.1.3, "Enumerated Queries":
    
        (modify the paragraph describing the <target> parameter of
        GetTexParameter*)
    
        <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY,
        TEXTURE_CUBE_MAP, or TEXTURE_2D_MULTISAMPLE_ANGLE, indicating the
        currently bound two-dimensional, three-dimensional, two-dimensional
        array, cube map, or two-dimensional multisample texture object,
        respectively.
    
        An INVALID_ENUM is generated if <target> is not one of the texture
        targets described above.
        An INVALID_ENUM is generated if <pname> is not one of the texture
        parameters described above.
    
        Modify Section 6.1.4 "Texture Queries":
    
        (Add the following text to the end of the section)
    
        The commands
    
            void GetTexLevelParameter{if}vANGLE(enum target, int level,
                                                enum pname, T *params );
    
        place information about texture image parameter <pname> for level-of-detail
        <level> of the specified target into <params>. <pname> must be one of the
        symbolic values in table 6.11.
    
        <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, one of
        the cube map face targets from table 3.18, or TEXTURE_2D_MULTISAMPLE_ANGLE,
        indicating the two- or three-dimensional texture, two-dimensional array
        texture, one of the six distinct 2D images making up the cube map texture
        object, or two-dimensional multisample texture. Otherwise an INVALID_ENUM is
        generated.
    
        <level> determines which level-of-detail's state is returned. If <level>
        is negative or larger than the maximum allowable level-of-detail, then an
        INVALID_VALUE error is generated.
    
        Note that TEXTURE_CUBE_MAP is not a valid <target> parameter for
        GetTexLevelParameter{if}vANGLE, because it does not specify a particular
        cube map face.
    
        For texture images with uncompressed internal formats, queries of
        <pname> TEXTURE_RED_TYPE, TEXTURE_GREEN_TYPE, TEXTURE_BLUE_TYPE,
        TEXTURE_ALPHA_TYPE, and TEXTURE_DEPTH_TYPE return the data type used
        to store the component. Types NONE, SIGNED_NORMALIZED, UNSIGNED_-
        NORMALIZED, FLOAT, INT, and UNSIGNED_INT respectively indicate missing,
        signed normalized fixed-point, unsigned normalized fixed-point,
        floating-point, signed unnormalized integer, and unsigned unnormalized
        integer components. Queries of <pname> TEXTURE_RED_SIZE, TEXTURE_GREEN_SIZE,
        TEXTURE_BLUE_SIZE, TEXTURE_ALPHA_SIZE, TEXTURE_DEPTH_SIZE,
        TEXTURE_STENCIL_SIZE, and TEXTURE_SHARED_SIZE return the actual resolutions
        of the stored image components, not the resolutions specified when the image
        was defined. Invalid <pname> generate an INVALID_ENUM error.
    
        For texture images with compressed internal formats, the types returned
        specify how components are interpreted after decompression, while the
        resolutions returned specify the component resolution of an uncompressed
        internal format that produces an image of roughly the same quality as the
        compressed image in question. Since the quality of the implementation's
        compression algorithm is likely data-dependent, the returned component sizes
        should be treated only as rough approximations.
    
        Queries of <pname> TEXTURE_INTERNAL_FORMAT, TEXTURE_WIDTH, TEXTURE_HEIGHT,
        and TEXTURE_DEPTH return the internal format, width, height, and depth,
        respectively, as specified when the image array was created.
    
        Queries of <pname> TEXTURE_SAMPLES_ANGLE, and
        TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE on multisample textures return the
        number of samples and whether texture sample fixed locations are enabled,
        respectively. For non-multisample texture, the default values 0 and TRUE
        as in new added table 6.11 are returned respectively.
    
        Modify Section 6.1.15, "Internal Format Queries":
    
        (modify the paragraph describing target as follows, p. 244)
    
        <target> indicates the usage of the internalformat, and must be either
        RENDERBUFFER or TEXTURE_2D_MULTISAMPLE_ANGLE, indicating the renderbuffer,
        or two-dimensional multisample texture. Otherwise an INVALID_ENUM error
        is generated.
    
        (add the following paragraph after "Querying SAMPLES with a <bufSize>
        ...")
    
        The maximum value of SAMPLES is guaranteed to be at least the lowest of
        the value of MAX_INTEGER_SAMPLES_ANGLE if internal format is a signed or
        unsigned integer format, the value of MAX_DEPTH_TEXTURE_SAMPLES_ANGLE if
        internalformat is a depth or stencil-renderable format and target is
        TEXTURE_2D_MULTISAMPLE_ANGLE, the value of MAX_COLOR_TEXTURE_SAMPLES_ANGLE
        if internal format is a color-renderable format and target is
        TEXTURE_2D_MULTISAMPLE_ANGLE, or the value of MAX_SAMPLES.
    
        (remove the last paragraph on p. 244)
        "Since multisampling is not supported for signed and unsigned integer
        internal formats, the value of NUM_SAMPLE_COUNTS will be zero for such
        formats."
    
        (modify to the first paragraph on p. 245)
        When query every accepted <internalformat> on multisample renderbuffer or
        texture, the value of NUM_SAMPLE_COUNTS is guaranteed to be at least
        one, and the maximum value in SAMPLES is guaranteed to be at least the
        value of MAX_SAMPLES. If <target> does not support multisample (is not
        multisample renderbuffer or texture), the value of NUM_SAMPLE_COUNTS will
        be zero for any accepted <internalformat>.
    
    Errors
    
        The error INVALID_VALUE is generated by GetIntegeri_v if <target> is
        SAMPLE_MASK_VALUE_ANGLE and <index> is greater than or equal to
        MAX_SAMPLE_MASK_WORDS_ANGLE.
    
        The error INVALID_VALUE is generated by SampleMaskiANGLE if <index> is
        greater than or equal to MAX_SAMPLE_MASK_WORDS_ANGLE.
    
        The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if
        <target> is not TEXTURE_2D_MULTISAMPLE_ANGLE.
    
        The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE
        if zero is bound to <target>.
    
        The error INVALID_VALUE is generated by TexStorage2DMultisampleANGLE if
        <width> or <height> is less than 1 or greater than the value of
        MAX_TEXTURE_SIZE.
    
        The error INVALID_VALUE is generated by TexStorage2DMultisampleANGLE if
        <samples> is zero.
    
        The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if
        <sizedinternalformat> is not color-renderable, depth-renderable, or
        stencil-renderable (as defined
        in section 4.4.4).
    
        The error INVALID_ENUM is generated by TexStorage2DMultisampleANGLE if
        <sizedinternalformat> is one of the unsized base internal formats listed
        in table 3.11.
    
        The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE
        if <samples> is greater than the maximum number of samples supported for
        this <target> and <sizedinternalformat>, The maximum number of samples
        supported can be determined by calling GetInternalformativ with a <pname>
        of SAMPLES (see section 6.1.15).
    
        The error INVALID_OPERATION is generated by TexStorage2DMultisampleANGLE
        if the value of TEXTURE_IMMUTABLE_FORMAT for the texture currently bound
        to <target> on the active texture unit is TRUE.
    
        The error OUT_OF_MEMORY is generated by TexStorage2DMultisampleANGLE
        if the GL is unable to create a texture image of the requested size.
    
        The error INVALID_ENUM is generated by GetMultisamplefvANGLE if <pname>
        is not SAMPLE_POSITION_ANGLE.
    
        The error INVALID_VALUE is generated by GetMultisamplefvANGLE if <index>
        is greater than or equal to the value of SAMPLES.
    
        The error INVALID_OPERATION is generated by RenderbufferStorageMultisample
        if <sizedinternalformat> is a signed or unsigned integer format and
        <samples> is greater than the value of MAX_INTEGER_SAMPLES_ANGLE.
    
        The error INVALID_OPERATION is generated by TexParameter* if <target> is
        TEXTURE_2D_MULTISAMPLE_ANGLE, <pname> is TEXTURE_BASE_LEVEL, and <value>
        is not zero.
    
        The error INVALID_OPERATION is generated by TexParameter* if <target> is
        TEXTURE_2D_MULTISAMPLE_ANGLE and <pname> is sampler state value from table
        6.10.
    
        The error INVALID_ENUM is generated by GetTexLevelParameter{if}vANGLE
        if <target> is not one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, one of
        the cube map face targets from table 3.18, or TEXTURE_2D_MULTISAMPLE_ANGLE.
    
        The error INVALID_VALUE is generated by GetTexLevelParameter{if}vANGLE
        if <level> is negative or larger than the maximum allowable level-of-detail.
    
        The error INVALID_ENUM is generated by GetTexLevelParameter{if}vANGLE
        if <value> is not one of TEXTURE_RED_TYPE, TEXTURE_GREEN_TYPE,
        TEXTURE_BLUE_TYPE, TEXTURE_ALPHA_TYPE, TEXTURE_DEPTH_TYPE,
        TEXTURE_DEPTH_SIZE, TEXTURE_STENCIL_SIZE, TEXTURE_SHARED_SIZE,
        TEXTURE_SAMPLES_ANGLE, TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE, TEXTURE_WIDTH,
        TEXTURE_HEIGHT, TEXTURE_DEPTH, TEXTURE_INTERNAL_FORMAT, TEXTURE_RED_SIZE,
        TEXTURE_GREEN_SIZE, TEXTURE_BLUE_SIZE, TEXTURE_ALPHA_SIZE,
        or TEXTURE_COMPRESSED.
    
    New State
    
        (add to table 6.7, Multisampling p. 252)
    
                                                                   Initial
        Get Value                           Type    Get Command     Value     Description                     Sec.
        ---------                           ----    -----------    -------    ----------------------          -----
        SAMPLE_MASK_ANGLE                   B       IsEnabled      FALSE      Additional sample mask          4.1.3
        SAMPLE_MASK_VALUE_ANGLE             nxZ+    GetIntegeri_v  ~0         Additional sample mask value    4.1.3
    
        Where n is the number of sample mask words (the value of
        MAX_SAMPLE_MASK_WORDS_ANGLE) the implementation supports.
    
        (add to table 6.8, Textures (selector, state per texture unit) p. 253)
    
                                                                         Initial
        Get Value                                 Type     Get Command    Value  Description                   Sec.
        ------------------------------------      ----     -----------    ------ ---------------------------   -----
        TEXTURE_BINDING_2D_MULTISAMPLE_ANGLE        32*xZ+   GetIntegerv    0      Texture object bound to     3.8.1
                                                                                 TEXTURE_2D_MULTISAMPLE_ANGLE
    
        (add new table 6.10, Textures (state per texture image), renumber subsequent tables)
    
                                                                              Initial
        Get Value                            Type   Get Command                Value   Description                  Sec.
        ----------------------               ----   -------------------        ------  ---------------------------  ------
        TEXTURE_SAMPLES_ANGLE                 Z+    GetTexLevelParameterANGLE  0       Number of samples per texel  3.8.5
        TEXTURE_FIXED_SAMPLE_LOCATIONS_ANGLE  B     GetTexLevelParameterANGLE  TRUE    Whether the image uses a     3.8.5
                                                                                       fixed sample pattern
    
        TEXTURE_WIDTH                         Z+    GetTexLevelParameterANGLE  0       Specified width              3.8
        TEXTURE_HEIGHT                        Z+    GetTexLevelParameterANGLE  0       Specified height (2D/3D)     3.8
        TEXTURE_DEPTH                         Z+    GetTexLevelParameterANGLE  0       Specified depth (3D)         3.8
        TEXTURE_INTERNAL_FORMAT               E     GetTexLevelParameterANGLE  RGBA    Internal format              3.8
                                                                               or R8   (see section 3.8.14)
        TEXTURE_x_SIZE                        6xZ+  GetTexLevelParameterANGLE  0       Component resolution (x is   3.8
                                                                                       RED, GREEN, BLUE, ALPHA,
                                                                                       DEPTH, or STENCIL)
        TEXTURE_SHARED_SIZE                   Z+    GetTexLevelParameterANGLE  0       Shared exponent field        3.8
                                                                                       resolution
        TEXTURE_x_TYPE                        E     GetTexLevelParameterANGLE  NONE    Component type (x is RED,    6.1.4
                                                                                       GREEN, BLUE, ALPHA, or
                                                                                       DEPTH)
        TEXTURE_COMPRESSED                    B     GetTexLevelParameterANGLE  FALSE   True if image has a          3.8.6
                                                                                       compressed internal format
    
        (add to table 6.35, Framebuffer dependent Values, p. 280)
    
                                                                  Initial
        Get Value               Type        Get Command            Value           Description      Sec.
        ------------------      ----------  ------------------     --------------  ---------------  ------
        SAMPLE_POSITION_ANGLE   N*2*R[0,1]  GetMultisamplefvANGLE  implementation  Explicit sample  3.3.1
                                                                   dependent       positions
    
        Where N is the number of samples (the value of SAMPLES) the framebuffer supports.
    
    New Implementation Dependent State
    
                                                              Minimum
        Get Value                        Type    Get Command  Value   Description                Sec.
        ---------                        ------- -----------  ------- ------------------------   ------
        MAX_SAMPLE_MASK_WORDS_ANGLE      Z+      GetIntegerv  1       maximum number of sample   4.1.3
                                                                      mask words
        MAX_COLOR_TEXTURE_SAMPLES_ANGLE  Z+      GetIntegerv  1       maximum number of samples  4.1.3
                                                                      in a color multisample
                                                                      texture
        MAX_DEPTH_TEXTURE_SAMPLES_ANGLE  Z+      GetIntegerv  1       maximum number of samples  4.1.3
                                                                      in a depth/stencil
                                                                      multisample texture
        MAX_INTEGER_SAMPLES_ANGLE        Z+      GetIntegerv  1       Maximum number of samples  4.4.2
                                                                      in integer format
                                                                      multisample buffers
    
    Modifications to the OpenGL ES Shading Language Specification, Version 3.00,
    Document Revision 6
    
        Including the following line in a shader can be used to control the
        language featured described in this extension:
    
          #extension GL_ANGLE_texture_multisample : <behavior>
    
        where <behavior> is as specified in section 3.5.
    
        A new preprocessor #define is added to the OpenGL ES Shading Language:
    
          #define GL_ANGLE_texture_multisample 1
    
        Add to section 3.8 "Keywords":
    
        The following new sampler types are added:
    
          sampler2DMS, isampler2DMS, usampler2DMS,
    
        Add to section 4.1 "Basic Types":
    
        Add the following sampler type to the "Floating Point Sampler
        Types (opaque)" table:
    
          sampler2DMS    handle for accessing a 2D multisample texture
    
        Add the following sampler type to the "Unsigned Integer Sampler
        Types (opaque)" table:
    
          usampler2DMS    handle for accessing an unsigned integer 2D
                          multisample texture
    
        Add the following sampler type to the "Integer Sampler Types" table:
    
          isampler2DMS    handle for accessing an integer 2D
                          multisample texture
    
        Add to section 8.8 "Texture Lookup Functions":
    
        Add new functions to the set of allowed texture lookup functions:
    
        Syntax:
    
          gvec4 texelFetch(gsampler2DMS sampler, ivec2 P, int sample)
    
        Description:
    
          Use integer texture coordinate <P> to lookup a single sample
          <sample> on the texture bound to <sampler> as described in section
          2.12.9.3 of the OpenGL ES specification "Multisample Texel Fetches".
    
        Syntax:
    
          ivec2 textureSize(gsampler2DMS sampler)
    
        Description:
    
          Returns the dimensions, width and height of level 0 for the
          texture bound to <sampler>, as described in section 2.12.9.4 of
          the OpenGL ES specification section "Texture Size Query".
    
    Examples
    
    Issues
        None
    
    Revision History
    
        Rev.    Date    Author       Changes
        ----  --------  ----------   --------------------------------------------
        1     08/27/18   Yunchao He  First revision. Adapted from OpenGL ES
                                     specification 3.1, OpenGLSL ES specification
                                     3.10 at document revision 4, and
                                     ARB_texture_multisample at revision 12.