Name

    OES_texture_cube_map_array

Name Strings

    GL_OES_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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

    Portions Copyright (c) 2013-2014 NVIDIA Corporation.

Status

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

Version

    Last Modified Date: June 18, 2014
    Revision: 1

Number

    OpenGL ES Extension #217

Dependencies

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

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

    OES_geometry_shader or EXT_geometry_shader is required.

    OES_texture_border_clamp or EXT_texture_border_clamp affect 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}vOES, BindTexture, GenerateMipmap, TexImage3D,
    TexSubImage3D, TexStorage3D, GetTexParameter{if}v,
    GetTexParameter{i ui}vOES, GetTexLevelParameter{if}v,
    CompressedTexImage3D, CompressedTexSubImage3D and CopyTexSubImage3D:

        TEXTURE_CUBE_MAP_ARRAY_OES                      0x9009

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

        TEXTURE_BINDING_CUBE_MAP_ARRAY_OES              0x900A

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

        SAMPLER_CUBE_MAP_ARRAY_OES                      0x900C
        SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES               0x900D
        INT_SAMPLER_CUBE_MAP_ARRAY_OES                  0x900E
        UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES         0x900F
        IMAGE_CUBE_MAP_ARRAY_OES                        0x9054
        INT_IMAGE_CUBE_MAP_ARRAY_OES                    0x905F
        UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES           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_OES              samplerCubeArray
        SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES       samplerCubeArrayShadow
        INT_SAMPLER_CUBE_MAP_ARRAY_OES          isamplerCubeArray
        UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES usamplerCubeArray
        IMAGE_CUBE_MAP_ARRAY_OES                imageCubeArray
        INT_IMAGE_CUBE_MAP_ARRAY_OES            iimageCubeArray
        UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES   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_OES,
    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 a two-dimensional array texture, or
    TEXTURE_CUBE_MAP_ARRAY_OES 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_OES. 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_OES. 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_OES, 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_OES, 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_OES.


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

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

    If <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY_OES, 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_OES, 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_OES:


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

      * <target> is TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_OES 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_OES 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_OES.


    Modify the final bullet point in section 9.4.2 "Whole Framebuffer
    Completeness", as modified by OES_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_OES }


    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 OES_texture_border_clamp or EXT_texture_border_clamp

    If OES_texture_border_clamp or EXT_texture_border_clamp is not supported,
    then remove all references to TexParameterI{i ui}vOES,
    GetTexParameter{i ui}vOES, 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_OES  48* x Z+ GetIntegerv  0           texture object bound           8.1
                                                                          to TEXTURE_CUBE_MAP_ARRAY_OES

Modification to the OpenGL ES Shading Language Specification, Version 3.10

    #extension GL_OES_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_OES_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
    OES_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?

      - OES_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 OES extension
        functionality, including minor interactions with
        OES_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    06/18/2014   dkoch     Initial OES version based on EXT.
                                 No functional changes.
