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.
