Name

    EXT_texture_cube_map_array

Name Strings

    GL_EXT_texture_cube_map_array

Contact

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

Contributors

    Daniel Koch, NVIDIA (dkoch 'at' nvidia.com)
    Dominik Witczak, Mobica
    Graham Connor, Imagination
    Ben Bowman, Imagination
    Jonathan Putsman, Imagination
    Contributors to ARB_texture_cube_map_array

Notice

    Copyright (c) 2009-2013 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: March 28, 2014
    Revision: 11

Number

    OpenGL ES Extension #184

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_geometry_shader is required.

    EXT_texture_border_clamp affects the definition of this extension.

    This extension interacts with OES_shader_image_atomic.

Overview

    OpenGL ES 3.1 supports two-dimensional array textures. An array texture
    is an ordered set of images with the same size and format. Each image in
    an array texture has a unique level. This extension expands texture
    array support to include cube map textures.

    A cube map array texture is a two-dimensional array texture that may
    contain many cube map layers. Each cube map layer is a unique cube map
    image set. Images in a cube map array have the same size and format
    limitations as two-dimensional array textures. A cube map array texture
    is specified using TexImage3D or TexStorage3D in a similar manner to
    two-dimensional arrays. Cube map array textures can be bound to a render
    targets of a frame buffer object just as two-dimensional arrays are,
    using FramebufferTextureLayer.

    When accessed by a shader, a cube map array texture acts as a single
    unit. The "s", "t", "r" texture coordinates are treated as a regular
    cube map texture fetch. The "q" texture is treated as an unnormalized
    floating-point value identifying the layer of the cube map array
    texture. Cube map array texture lookups do not filter between layers.

New Procedures and Functions

    None

New Tokens

    Accepted by the <target> parameter of TexParameter{if}, TexParameter{if}v,
    TexParameterI{i ui}vEXT, BindTexture, GenerateMipmap, TexImage3D,
    TexSubImage3D, TexStorage3D, GetTexParameter{if}v,
    GetTexParameter{i ui}vEXT, GetTexLevelParameter{if}v,
    CompressedTexImage3D, CompressedTexSubImage3D and CopyTexSubImage3D:

        TEXTURE_CUBE_MAP_ARRAY_EXT                      0x9009

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

        TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT              0x900A

    Returned by the <type> parameter of GetActiveUniform,
    and by the <params> parameter of GetProgramResourceiv
    when <props> is TYPE:

        SAMPLER_CUBE_MAP_ARRAY_EXT                      0x900C
        SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT               0x900D
        INT_SAMPLER_CUBE_MAP_ARRAY_EXT                  0x900E
        UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT         0x900F
        IMAGE_CUBE_MAP_ARRAY_EXT                        0x9054
        INT_IMAGE_CUBE_MAP_ARRAY_EXT                    0x905F
        UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT           0x906A

Additions to the OpenGL ES 3.1 Specification

    Add to table 7.3 "OpenGL ES Shading Language type tokens..." on p. 86:

        Type Name Token                         Keyword                Buffer
        --------------------------------------- ---------------------- ------
        SAMPLER_CUBE_MAP_ARRAY_EXT              samplerCubeArray
        SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT       samplerCubeArrayShadow
        INT_SAMPLER_CUBE_MAP_ARRAY_EXT          isamplerCubeArray
        UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT usamplerCubeArray
        IMAGE_CUBE_MAP_ARRAY_EXT                imageCubeArray
        INT_IMAGE_CUBE_MAP_ARRAY_EXT            iimageCubeArray
        UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT   uimageCubeArray


    Add to the fourth paragraph of chapter 8, "Textures and Samplers", on p.
    128:

    ... A cube map array is a collection of cube map layers stored as a
    two-dimensional array texture. When accessing a cube map array, the
    texture coordinate "s", "t", "r" are applied similarly as cube maps
    while the last texture coordinate "q" is used as the index of one the
    cube map slices.


    Modify the first paragraph of section 8.1, "Texture Objects" on p. 129:

    ... The default texture object is bound to each of the TEXTURE_2D,
    TEXTURE_3D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_EXT,
    and TEXTURE_2D_MULTISAMPLE targets ...


    Modify the paragraph following IsTexture on p. 131:

    The texture object name space, including the initial two-, and three-
    dimensional, two-dimensional array, cube map, cube map array, and
    two-dimensional multisample texture objects, is shared among all texture
    units. ...


    Modify section 8.5, "Texture Image Specification"

    Change the description of TexImage3D in the first paragraph of the
    section, on p. 147:

    ... <target> must be one of TEXTURE_3D for a three-dimensional texture,
    TEXTURE_2D_ARRAY for an two-dimensional array texture, or
    TEXTURE_CUBE_MAP_ARRAY_EXT for a cube map array texture. ...


    Change the sixth paragraph on p. 148:

    Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL
    are supported by texture image specification commands only if <target>
    is TEXTURE_2D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or
    TEXTURE_CUBE_MAP_ARRAY_EXT. Using these formats ...


    Add following the first paragraph of section 8.5.3, "Texture Image
    Structure", on p. 154:

    ... image is indexed with the highest value of <k>.

    When <target> is TEXTURE_CUBE_MAP_ARRAY_EXT. specifying a cube map array
    texture, <k> refers to a layer-face. The layer is given by

        <layer> = floor(<k> / 6),

    and the face is given by

        <face> = <k> mod 6

    The face number corresponds to the cube map faces as shown in table 9.2.

    If the internal data type ...


    Add following the third paragraph on p. 155:

    ... specified sizes can be supported.

    An INVALID_VALUE error is generated if target is
    TEXTURE_CUBE_MAP_ARRAY_EXT, and <width> and <height> are not equal, or
    <depth> is not a multiple of six, indicating 6 * <N> layer-faces in the
    cube map array.


    Modify the sixth paragraph on p. 155:

    The maximum allowable width and height of a cube map or cube map array
    texture must be the same, and must be at least 2^(k-lod) ...


    Modify the fourth paragraph on p. 156:

    ... but may not correspond to any actual texel. See figure 8.3. If
    <target> is TEXTURE_CUBE_MAP_ARRAY_EXT, the texture value is determined
    by (s, t, r, q) coordinates where "s", "t", "r" is defined to be the
    same as for TEXTURE_CUBE_MAP and "q" is defined as the index of a
    specific cube map in the cube map array.


    Modify section 3.8.5 "Alternate Texture Image Specification Commands"

    Change the second paragraph on p. 162:

    ... and the <target> arguments of TexSubImage3D and CopyTexSubImage3D
    must be TEXTURE_3D, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_EXT.


    Change the sixth paragraph on p. 162:

    Arguments <xoffset>, <yoffset>, and <zoffset> of TexSubImage3D and
    CopyTexSubImage3D specify the lower left texel coordinates of a
    <width>-wide by <height>-high by <depth>-deep rectangular subregion of the
    texel array. For cube map array textures, <zoffset> is the first
    layer-face to update, and <depth> is the number of layer-faces to
    update. The <depth> argument associated with CopyTexSubImage3D ...


    Modify section 8.9 "Texture Parameters" to change the first paragraph of
    the section, on p. 170:

    <target> is the target, and must be one of TEXTURE_2D, TEXTURE_3D,
    TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_EXT, or
    TEXTURE_2D_MULTISAMPLE. <pname> is ...


    Modify section 8.10.2 "Texture Parameter Queries" in the second
    paragraph of the section, on p. 172:

    <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY,
    TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_EXT, or TEXTURE_2D_MULTISAMPLE,
    indicating the currently bound two-dimensional, three-dimensional,
    two-dimensional array, cube map, cube map array, or two-dimensional
    multisample texture object, respectively.


    Modify section 8.10.3 "Texture Level Parameter Queries" in the second
    paragraph of the section, on p. 173:

    <target> may be one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, one of
    the cube map face targets from table 8.21, TEXTURE_CUBE_MAP_ARRAY_EXT, or
    TEXTURE_2D_MULTISAMPLE, indicating the currently bound two- or
    three-dimensional, two-dimensional array, one of the six distinct 2D
    images making up the cube map texture object, cube map array, or
    two-dimensional multisample texture.

    <lod> determines ...


    Modify section 8.13.1 "Scale Factor and Level of Detail" to change the
    first paragraph in the description of equation 8.6, on p. 177:

    ... For a two-dimensional, two-dimensional array, cube map, or cube map
    array texture, define w(x,y) == 0.


    Modify section 8.13.3 "Mipmapping" to change the first clause in the
    equation for <maxsize> on p. 182 to:

        ... max(w_t,h_t)    for 2D, 2D array, cube map, and cube map
                            array textures


    Modify section 8.13.4, "Manual Mipmap Generation" to change the
    description of GenerateMipmap starting with the first paragraph, on p.
    185:

    ... where <target> is one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY,
    TEXTURE_CUBE_MAP, or TEXTURE_CUBE_MAP_ARRAY_EXT.

    Mipmap generation affects the texture image attached to <target>.

    If <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY_EXT, the texture
    bound to <target> must be cube complete or cube array complete,
    respectively, as defined in section 8.17.

    ...

    The contents of the derived arrays are computed by repeated, filtered
    reduction of the level_base array. For two-dimensional array and cube
    map array textures, each layer is filtered independently. ...

    Errors

    ...

    An INVALID_OPERATION error is generated if <target> is TEXTURE_CUBE_MAP
    or TEXTURE_CUBE_MAP_ARRAY_EXT, and the texture bound to <target> is not
    cube complete or cube array complete respectively.

    ...


    Modify section 8.16, "Texture Completeness"

    Add a new paragraph definition before the final paragraph (starting
    "Using the preceding ...") in the introduction to the section, on p.
    186:

    A cube map array texture is <cube array complete> if it is complete when
    treated as a two-dimensional array and cube complete for every cube map
    slice within the array texture.


    Add a new bullet point to the final paragraph of the section, on p. 186:

    Using the preceding definitions, a texture is complete unless any of the
    following conditions hold true:
      ...
      * The texture is a cube map array texture, and is not cube array
        complete.


    Modify section 8.17 "Immutable-Format Texture Images"

    Change the description of TexStorage3D on p. 189:

    The command

        void TexStorage3D(enum target ...

    specifies all the levels of a three-dimensional, two-dimensional array,
    or cube map array texture. The pseudocode depends on <target>:

    ...


    Change the <target>s allowed in the second code example for
    TexStorage3D, at the top of p. 190:

    <target> TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_EXT:


    Change the second bullet point in the Errors section on p. 190:

      * <target> is TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_EXT and
        <levels> is greater than floor(log2(max(width,height))) + 1


    Modify section 8.18, "Texture State"

    Change the first paragraph of the section, on p. 191:

    ... First, there are the multiple sets of texel arrays ... and six sets
    of mipmap arrays each for the cube map and cube map array texture
    targets) and their number. Each array has associated with it a width,
    height, and depth (three-dimensional, two-dimensional array, and cube
    map array only), ...

    Change the fourth paragraph of the section, on p. 191:

    Next, there are the five sets of texture properties, corresponding to
    the two-dimensional, two-dimensional array, three-dimensional, cube
    map, and cube map array texture targets. Each set consists of ...


    Modify section 8.22, "Texture Image Loads and Stores":

    Change starting with the third paragraph of the section, on p. 195:

    If the texture identified by <texture> is a two-dimensional array,
    three-dimensional, cube map, or cube map array texture, it is possible
    to bind either the entire texture level or a single layer or face of the
    texture level. If <layered> is TRUE, the entire level is bound. If
    <layered> is FALSE, only the single layer identified by <layer> will be
    bound. When <layered> is FALSE, the single bound layer is treated as a
    different texture target for image accesses:

      * two-dimensional array, three-dimensional, cube map, and cube map
        array texture layers are treated as two-dimensional textures

    For cube map textures where <layered> is FALSE, the face is taken by
    mapping the layer number to a face according to table 8.25. For cube map
    array textures where <layered> is FALSE, the selected layer number is
    mapped to a texture layer and cube face using the following equations
    and mapping <face> to a face according to table 8.25:

        layer = floor(layer_orig / 6)

        face = layer_orig - (layer * 6)

    If the texture identified by <texture> does not have multiple layers or
    faces ...


    Add to table 8.26, "Mapping of image load and store...", on p. 196:

        Texture target               face/
                                   i  j  k  layer
        -------------------------- -- -- -- -----
        TEXTURE_CUBE_MAP_ARRAY_EXT x  y  -  z


    Split the third paragraph on p. 196, starting "If the texture target",
    into two paragraphs:

    If the texture target has layers or cube map faces, the layer or face
    number is taken from the <layer> argument of BindImageTexture if the
    texture is bound with <layered> set to FALSE, or from the coordinate
    identified by table 8.26 otherwise.

    For cube map and cube map array textures with <layered> set to TRUE, the
    coordinate is mapped to a layer and face in the same manner as the
    <layer> argument of BindImageTexture.

    If the individual texel ...


    Add to the bullet list in section 9.2.2, "Attaching Images to
    Framebuffer Objects", and add a new final paragraph of the introduction
    to the section on p. 208:

    There are several types of framebuffer-attachable images
        ...
      * A single layer-face of a cube map array texture, which is treated as
        a two-dimensional image.

    Additionally, an entire level of a three-dimensional, cube map, cube map
    array, two-dimensional array, or ...


    Modify section 9.2.8, "Attaching Texture Images to a Framebuffer" to
    change the description of FramebufferTextureLayer on p. 219:

    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, cube map
    array, or two-dimensional multisample array texture level.

    ...

    <layer> specifies the layer of a two-dimensional image within <texture>
    except for cube map array textures, where <layer> is translated into an
    array layer and a cube map face as described in section 8.22 for
    layer-face numbers passed to BindImageTexture.

    ...

    Errors

    ...

    An INVALID_OPERATION error is generated if <texture> is non-zero and is
    not the name of a three dimensional, two-dimensional array, or cube map
    array texture.


    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, two-dimensional array or cube map
      array texture and the attachment is not layered, the selected layer is
      less than the depth or layer count of the texture.

    * If <image> is a three-dimensional, two-dimensional array or cube map
      array texture and the attachment is layered, the depth or layer count
      of the texture is less than or equal to the value of
      MAX_FRAMEBUFFER_LAYERS_EXT.


    Modify the final bullet point in section 9.4.2 "Whole Framebuffer
    Completeness", as modified by EXT_geometry_shader (starting "If any
    framebuffer attachment is layered") 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,
      cube map array, two-dimensional array, or two-dimensional multisample
      array textures).

      { FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT }


    Add to the end of section 9.7gs, "Layered Framebuffers":

    When cube map array texture levels are attached to a layered
    framebuffer, the layer number corresponds to a layer-face. The
    layer-face is be translated into an array layer and a cube map face as
    described in section 8.22 for layer-face numbers passed to
    BindImageTexture.


Dependencies on EXT_texture_border_clamp

    If EXT_texture_buffer is not supported, then remove all references
    to TexParameterI{i ui}vEXT and GetTexParameter{i ui}vEXT.

Dependencies on OES_shader_image_atomic

    When OES_shader_image_atomic is supported, all the imageAtomic* functions
    are supported on cube array images.

New State

    Add to table 20.8 "Textures (selector, state per texture unit)"

                                                              Initial
    Get Value                           Type     Get Command  Value       Description                    Sec.
    ----------------------------------  -------- -----------  ----------  -----------------------------  ----
    TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT  48* x Z+ GetIntegerv  0           texture object bound           8.1
                                                                          to TEXTURE_CUBE_MAP_ARRAY_EXT

Modification to the OpenGL ES Shading Language Specification, Version 3.10

    #extension GL_EXT_texture_cube_map_array: <behavior>

    The above line is needed to control the GLSL features described in
    this section.


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

      #define GL_EXT_texture_cube_map_array 1


    Modifications to Section 3.7 (Keywords)

    Remove from the list of reserved keywords, and add to the list of
    keywords on p. 14:

    iimageCubeArray
    imageCubeArray
    isamplerCubeArray
    samplerCubeArray
    samplerCubeArrayShadow
    uimageCubeArray
    usamplerCubeArray


    Add to section 4.1 "Basic Types"

    Add to table "Floating Point Sampler Types (opaque)" on p. 20:

    Type                         Meaning
    --------------------------   ---------------------------------------
    samplerCubeArray             a handle for accessing a cube map array
    imageCubeArray               texture

    samplerCubeArrayShadow       a handle for accessing a cube map array
                                 depth texture with comparison

    Add to table "Signed Integer Sampler Types (opaque)" on p. 21:

    Type                    Meaning
    ----------------------- -----------------------------------------------
    isamplerCubeArray       a handle for accessing an integer cube map
    iimageCubeArray         array texture

    Add to table "Unsigned Integer Sampler Types (opaque)" on p. 21:

    Type                    Meaning
    ----------------------- -----------------------------------------------
    usamplerCubeArray       a handle for accessing an unsigned integer
    uimageCubeArray         cube map array texture


    Modify the second paragraph of section 4.1.7.2 "Images" on p. 27:

    ... Image accesses should use an image type that matches the target of
    the texture whose level is bound to the image unit, or for non-layered
    bindings of 3D or array images should use the image type that matches
    the dimensionality of the layer of the image (i.e. a layer of 3D,
    2DArray, Cube, or CubeArray should use image2D). If the ...

    Modify section 4.7.4 "Default Precision Qualifiers"

    Add the following types to the list of types which have no default
    precision qualifiers at the top of p. 65:

    samplerCubeArray
    samplerCubeArrayShadow
    isamplerCubeArray
    usamplerCubeArray
    imageCubeArray
    iimageCubeArray
    uimageCubeArray


    Modify section 7.1.1gs.2, "Geometry Shader Output Variables" to add to
    the description of gl_Layer:

    gl_Layer takes on a special value when used with an array of cube map
    textures. Instead of only refering to the layer, it is used to select a
    cube map face and a layer. Setting gl_Layer to the value (layer*6+face)
    will render to the face <face> of the cube defined in layer <layer>. The
    face values are defined in table 8.25 of the OpenGL ES Specification.

    For example, to render to the positive <y> cube map face located in the
    5th layer of the cube map array, gl_Layer should be set to 5*6 + 2.


    Modify section 8.9 "Texture Functions"

    Add to the table of texture query functions in section 8.9.1
    on p. 120:

      highp ivec3 textureSize(gsamplerCubeArray sampler, int lod)
      highp ivec3 textureSize(gsamplerCubeArrayShadow sampler, int lod)


    Add to the table of texel lookup functions in section 8.9.2 on p. 121:

      gvec4 texture(gsamplerCubeArray sampler, vec4 P [, float bias])
      float texture(samplerCubeArrayShadow sampler, vec4 P,
                    float compare)

    Modify the description of the texture functions:

      Use the texture coordinate P to do a texture lookup in the texture
      currently bound to <sampler>.

      For shadow forms: When <compare> is present, it is used as D_ref and the
      array layer comes from the last component of P. When compare is not
      present, the last component of P is used as D_ref and the array layer
      comes from the second to last component of P.

      For non-shadow forms: the array layer comes from the last component of P.

    Add to the same table on p. 121:

      gvec4 textureLod(gsamplerCubeArray sampler, vec4 P, float lod)

    And add to the same table on p. 124:

      gvec4 textureGrad(gsamplerCubeArray sampler, vec4 P,
                        vec3 dPdx, vec3 dPdy);


    Add to the table of texture gather functions in section 8.9.3 on p. 126:

      gvec4 textureGather(gsamplerCubeArray sampler, vec4 P [, int comp])
      vec4 textureGather(samplerCubeArrayShadow sampler, vec4 P,
                         float refZ)


    Modify section 8.14 "Texture Lookup Functions" to add to the list of
    IMAGE_INFO placeholder parameter lists on p. 132:

        ...
        gimageCubeArray image, ivec3 P


    Add to the list of image size functions in the table on p. 133:

        highp ivec3 imageSize(readonly writeonly gimageCubeArray image)

Issues

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

    (1) What functionality was removed from ARB_texture_cube_map_array?

      - Interactions with features not supported by the underlying
        ES 3.1 API and Shading Language, including:
          * one-dimensional and rectangular textures
          * texture image readback (GetTexImage)

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

      - EXT_texture_cube_map_array more closely matches OpenGL 4.4 language,
        rather than ARB_texture_cube_map_array language.
      - Interactions were added with OpenGL ES 3.1 and other EXT extension
        functionality, including minor interactions with
        EXT_geometry_shader.

    (3) What should the rules on GLSL suffixing be?

    RESOLVED: The new sampler and image types are not reserved keywords in
    ESSL 3.00, but they are keywords in GLSL 4.40. ESSL 3.10 updates the
    reserved keyword list to include all keywords used or reserved in GLSL
    4.40 (but not otherwise used in ES), and thus we can use the image
    and sampler keywords directly by moving them from the reserved keywords
    section. See bug 11179.

    (4) Should cube map array textures be supported for both mutable and
        immutable textures?

    RESOLVED: Yes. Per Daniel Koch's reasoning: although 2D multisample
    textures are only supported as immutable textures in ES 3.1, they
    require new entry points and the ES Working Group prefers having a
    single way of doing things.

    However, the ES WG also considered only supporting texture gather and
    stencil texturing on immutable textures and decided against it, on the
    basis that the only difference was a texture format, texture parameter
    or how the texture was sampled and thus it was a subtle distinction.

    For cube map array textures, a new texture target is midway between just
    an access method/format and a whole new entry point. However, a cube map
    array is similar to a 2D texture array that has a layer size that is a
    multiple of 6. 2D texture array support for mutable textures already
    exists in ES 3.0 and it would be odd to not have cube map arrays
    supported on the same set of entry points.

    Conclusion: support cube map arrays for both types of textures.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------- ----------------------------------------------
      1   11/11/13  Jon Leech Initial version based on
                              ARB_texture_cube_map_array.
      2   11/12/13  Jon Leech Add description of texture state for
                              cube map arrays and fix description
                              of binding state for cube map arrays.
      3   11/20/13  Jon Leech Refer to ES 3.1 instead of 3plus.
      4   11/21/13  dkoch     Add interactions with EXT_texture_border_clamp
                              Update functions taking new tokens, etc.
                              Assume SL keywords will be reserved in ES 3.1.
      5   12/18/13  dkoch     minor editorial changes
      6   01/09/14  dkoch     align page numbers with ES 3.0.2, fix typos.
      7   02/12/14  dkoch     Resolved issue 4.
      8   03/10/14  Jon Leech Rebase on OpenGL ES 3.1 and change suffix
                              to EXT.
      9   03/26/14  dkoch     Update contributors, clarify no default precision.
      10  03/26/14  Jon Leech Sync with released ES 3.1 specs.
      11  03/28/14  dkoch     Add interactions with OES_shader_image_atomic.

