Name

    ARB_texture_cube_map_array

Name Strings

    GL_ARB_texture_cube_map_array

Contact

    Nick Haemel, AMD (nick.haemel 'at' amd.com)

Contributors
    Jeff Bolz,       NVIDIA
    Yunjun Zhang,    AMD
    Bill Licea-Kane, AMD
    Graham Sellers,  AMD
    Daniel Koch,     TransGaming
    Mark Young,      AMD

Notice

    Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by the ARB on July 3, 2009.

Version

    Last Modified Date: 12/07/2009
    Author revision:    9

Number

    ARB Extension #71

Dependencies

    This extension is written against the OpenGL 3.0 specification and
    version 1.30.08 of the OpenGL Shading Language specification.

Overview

    The GL_EXT_texture_array extension, and subsequently OpenGL 3.0 have
    introduced the concept of one- and 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 2-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 one- and two-dimensional array textures. A
    cube map array texture is specified using TexImage3D in a similar
    manner to two-dimensional arrays. Cube map array textures can be
    bound to a render targets of a frame buffer object as
    two-dimensional arrays are using FramebufferTextureLayer.

    When accessed by a programmable 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.

    This extension does not provide for the use of cube map array
    textures with fixed-function fragment processing.

New Procedures and Functions

    None

New Tokens

    Accepted by the <target> parameter of TexParameteri, TexParameteriv,
    TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap:

        TEXTURE_CUBE_MAP_ARRAY_ARB                      0x9009

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

        TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB              0x900A

    Accepted by the <target> parameter of TexImage3D, TexSubImage3D,
    CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D:

        TEXTURE_CUBE_MAP_ARRAY_ARB
        PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB                0x900B

    Accepted by the <tex> parameter of GetTexImage:

        TEXTURE_CUBE_MAP_ARRAY_ARB

    Returned by the <type> parameter of GetActiveUniform:

        SAMPLER_CUBE_MAP_ARRAY_ARB                      0x900C
        SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB               0x900D
        INT_SAMPLER_CUBE_MAP_ARRAY_ARB                  0x900E
        UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB         0x900F

Additions to Chapter 2 of OpenGL 3.0 Specification (OpenGL Operation)

    Modify section 2.20.3 "Shader Variables", page 91

    (Add the following new return type to the 3rd paragraph on p.97)

      SAMPLER_CUBE_MAP_ARRAY_ARB,
      SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB,
      INT_SAMPLER_CUBE_MAP_ARRAY_ARB,
      UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB,

Addition to Chapter 3 of OpenGL 3.0 Specification (Rasterization)

    Modify section 3.9, "Texturing", page 175

    (modify the 3rd paragraph, p.175)

    Six types of texture are supported; each is a collection of images
    built from one-, two-, or three-dimensional array of image elements
    referred to as texels. One-, two-, and three-dimensional textures
    consist respectively of one-, two-, or three-dimensional texel
    arrays. One- and two-dimensional array textures are arrays of one-
    or two-dimensional images, consisting of one or more layers. A cube
    map is a special two-dimensional array texture with six layers that
    represent the faces of a cube. When accessing a cube map, the
    texture coordinates are projected onto one of the six faces of the
    cube. Finally 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 map while the last texture coordinate "q" is used as the index
    of on the cube map slices.


    Modify Section 3.9.1, Texture Image Specification, page 176

    (modify the first paragraph of section, p. 176)

    The command

      void TexImage3D( enum target, int level, int internalformat,
                       sizei width, sizei height, sizei depth, int border,
                       enum format, enum type, void *data );

    is used to specify a three-dimensional texture image. <target> must
    be one of TEXTURE_3D for a three-dimensional texture or
    TEXTURE_2D_ARRAY for a two-dimensional array texture or
    TEXTURE_CUBE_MAP_ARRAY_ARB. Additionally, target may be
    PROXY_TEXTURE_3D for a three-dimensional proxy texture,
    PROXY_TEXTURE_2D_ARRAY for a two-dimensional proxy array texture, or
    PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB for a proxy cube map array texture.
    If target is TEXTURE_CUBE_MAP_ARRAY_ARB or
    PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB, specifying a depth value that is
    not a multiple of six results in an error of INVALID_VALUE.
    INVALID_VALUE is also generated if the width and the height
    parameters are not equal. ...

    When <target> is TEXTURE_CUBE_MAP_ARRAY_ARB or
    PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB <width> and <height> must be equal,
    otherwise the error INVALID_VALUE is generated. Also, <depth> must
    be a multiple of six indicating 6N layer-faces in the cube map
    array, otherwise the error INVALID_VALUE is generated.


    (modify the third paragraph of section, p. 177)

    Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL are supported by texture image specification commands
    only if target is TEXTURE_1D, TEXTURE_2D, TEXTURE_1D_ARRAY,
    TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_ARB,
    PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_1D_ARRAY,
    PROXY_TEXTURE_2D_ARRAY, PROXY_TEXTURE_CUBE_MAP or
    PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB. ...


    (modify the second paragraph of section, p.186)

    and w_b, h_b, and d_b are the specified border width, height, and
    depth. wb and hb are the specified border value; d_b is the
    specified border value if target is TEXTURE_3D, or zero if target is
    TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_ARB. Thus the last
    two-dimensional image slice of the three-dimensional image is
    indexed with the highest value of k. When <target> is
    TEXTURE_CUBE_MAP_ARRAY_ARB. 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

    When

        face = 0: TEXTURE_CUBE_MAP_POSITVE_X,
        face = 1: TEXTURE_CUBE_MAP_NEGATIVE_X,
        face = 2: TEXTURE_CUBE_MAP_POSITVE_Y,
        face = 3: TEXTURE_CUBE_MAP_NEGATIVE_Y,
        face = 4: TEXTURE_CUBE_MAP_POSITVE_Z,
        face = 5: TEXTURE_CUBE_MAP_NEGATIVE_Z.


    (modify the fifth paragraph of section, p. 187)

    ... 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) + 2 *
    b_t for image arrays level 0 through k, where k is the log base 2 of
    MAX_CUBE_MAP_TEXTURE_SIZE. The maximum number of layers for one- and
    two-dimensional array textures (height or depth, respectively), and
    the maximum number of layer-faces for cube map array textures
    (depth) must be at least MAX_ARRAY_TEXTURE_LAYERS_EXT for all
    levels.

    (modify the second last paragraph, p. 189)

    An element (i, j, k) of the texel array is called a texel (for a
    two-dimensional texture or one-dimensional array texture, k is
    irrelevant; for a one-dimensional texture, j and k are both
    irrelevant). If target is TEXTURE_2D_ARRAY or TEXTURE_3D, the
    texture value for a fragment is determined by that fragment's
    associated (s, t, r) coordinates, but may not correspond to any
    actual texel. See figure 3.10. If target is
    TEXTURE_CUBE_MAP_ARRAY_ARB, 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 the first paragraph, p. 193)

    ... and the target arguments of TexSubImage3D and CopyTexSubImage3D
    must be TEXTURE_3D, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB.
    The level parameter of each command specifies the level of the texel
    array that is modified. If level is less than zero or greater than
    the base 2 logarithm of the maximum texture width, height, or depth,
    the error INVALID VALUE is generated.

    (modify the second to last paragraph, p. 193)

    Arguments <xoffset>, <yoffset>, and <zoffset> of TexSubImage3D and
    CopyTex- SubImage3D 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 layer-faces to
    update. The depth argument ...


    Modify Section 3.9.4, Texture Parameters, page 200

    (modify the first paragraph of section, p. 200)

    ... target is the target, either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP or
    TEXTURE_CUBE_MAP_ARRAY_ARB. ...


    (modify third paragraph, p. 204)

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


    (modify the first paragraph of "Mipmapping", p.209)

    If the image array of level level_base, excluding its border, has
    dimensions, w_t x h_t x d_t, then there are floor(log2(maxsize)) + 1
    levels in the mipmap, where

      maxsize = w_t,        for one-dimensional and one-dimensional
                            array textures,

      max(w_t, h_t),        for two-dimensional, two-dimensional array,
                            cube map and cube map array textures,

      max(w_t, h_t, d_t),   for three dimensional textures.


    (modify the third paragraph in the "Automatic Mipmap Generation", p. 211)

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


    (modify the first paragraph in the "Manual Mipmap Generation", p. 211)
    Mipmaps can be generated manually with the command

        void GenerateMipmap( enum target );

    where target is one of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or
    TEXTURE_CUBE_MAP_ARRAY_ARB. ...


    Modify Section 3.9.10, Texture Completeness, page 212

    (add a new paragraph in the end of the section, p. 213)

    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.


    Modify Section 3.9.11, Texture State and Proxy State, page 214

    (modify second and third paragraphs, p. 214)

    In addition to image arrays for one-, two-, and three-dimensional
    textures, one- and two-dimensional array textures, and the six image
    arrays for the cube map texture, partially instantiated image arrays
    are maintained for one-, two-, and three-dimensional textures and
    one- and two-dimensional array textures, and cube map array
    textures. Additionally, a single proxy image array is maintained for
    the cube map texture. Each proxy image array includes width, height,
    depth, border width, and internal format state values, as well as
    state for the red, green, blue, alpha, luminance, and intensity
    component resolutions. Proxy image arrays do not include image data,
    nor do they include texture properties. ...


    (update the first paragraph, p. 215)

    Proxy arrays for one- and two-dimensional textures and one- and
    two-dimensional array textures and cube map array textures are
    operated on in the same way when TexImage1D is executed with target
    specified as PROXY_TEXTURE_1D, TexImage2D is executed with target
    specified as PROXY_TEXTURE_2D or PROXY_TEXTURE_1D_ARRAY, or
    TexImage3D is executed with target specified as
    PROXY_TETXURE_2D_ARRAY or PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB.


    Modify Section 3.9.12 Texture Objects, page 215

    (update the beginning to add cube map array textures, p. 215)

    In addition to the default textures TEXTURE_1D, TEXTURE_2D,
    TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY,
    and TEXTURE_CUBE_MAP_ARRAY_ARB, named one-, two-, and
    three-dimensional, cube map, and one- , two-dimensional array
    texture and cube map array texture objects can be created and
    operated upon. The name space for texture objects is the unsigned
    integers, with zero reserved by the GL.

    A texture object is created by binding an unused name to TEXTURE_1D,
    TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY,
    TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB. The binding is
    effected by calling

      void BindTexture( enum target, uint texture );

    with <target> set to the desired texture target and <texture> set to
    the unused name. The resulting texture object is a new state vector,
    comprising all the state values listed in section 3.8.11, set to the
    same initial values. If the new texture object is bound to
    TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB,
    it is and remains a one-, two-, three-dimensional, cube map, one- ,
    two-dimensional array texture OR cube map array texture respectively
    until it is deleted.

    BindTexture may also be used to bind an existing texture object to
    either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB.
    The error INVALID_OPERATION is generated if an attempt is made to
    bind a texture object of different dimensionality than the specified
    target. If the bind is successful no change is made to the state of
    the bound texture object, and any previous binding to target is
    broken.

    While a texture object is bound, GL operations on the target to
    which it is bound affect the bound object, and queries of the target
    to which it is bound return state from the bound object. If texture
    mapping of the dimensionality of the target to which a texture
    object is bound is enabled, the state of the bound texture object
    directs the texturing operation.

    In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
    TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, and
    TEXTURE_CUBE_MAP_ARRAY_ARB have one-, two-, three-dimensional, cube
    map, and one- and two-dimensional array and cube map array texture
    state vectors respectively associated with them. In order that
    access to these initial textures not be lost, they are treated as
    texture objects all of whose names are 0. The initial one-, two-,
    three-dimensional, cube map, one- and two-dimensional array and cube
    map array textures are therefore operated upon, queried, and applied
    as TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, and TEXTURE_CUBE_MAP_ARRAY_ARB
    respectively while 0 is bound to the corresponding targets.


    (modify the first paragraph, p. 217)

    ... a texture that is currently bound to one of the targets
    TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB is
    deleted, it is as though BindTexture had been executed with the same
    target and texture zero. ...


    (modify the second paragraph, p. 218)

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

Additions to Chapter 4 of the OpenGL 3.0 Specification (Per-fragment Operations and the Frame Buffer)

    Modify Section 4.4.2, Attaching Images to Framebuffer Objects, page 281

    (modify the third paragraph in the section, p. 287)

    The command

      void FramebufferTextureLayer(enum target, enum attachment,
                                   uint texture, int level, int layer);

    operates identically to FramebufferTexture3D, except that it
    attaches a single layer of a three-dimensional texture or a one- or
    two-dimensional array texture, or a cube map array texture. <layer>
    is an integer indicating the layer number, and is treated
    identically to the <zoffset> parameter in FramebufferTexture3D for
    three-dimensional textures, one- and two-dimensional textures. For
    cube map array textures, <layer> mod 6 indicates a face of a cube
    map slice within the cube map array. the order of the face is
    defined as in 3.9.1. The error INVALID_VALUE is generated if <layer>
    is negative. The error INVALID_OPERATION is generated if <texture>
    is non-zero and is not the name of a three dimensional texture, one-
    or two-dimensional array texture, or cube map array texture. Unlike
    FramebufferTexture3D, no <textarget> parameter is accepted.

    (modify last condition for framebuffer attachment completeness, p. 291)

     * If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and
        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names a one-dimensional,
        two-dimensional or cube map array texture, then
        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER must be smaller than the
        number of layers in the texture.

    Modify Section 4.4.4.2, Framebuffer Completeness

    (modify the completeness requirements of layered framebuffer
    completeness added by GL_ARB_geometry_shader4)

    * If any framebuffer attachment is layered, ... (i.e., three-
      dimensional, cube map, one- or two dimensional array, or cube map
      array textures).
      { FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_{EXT|ARB} }

    * If any framebuffer attachment is layered, ... For one- and two-
      dimensional array textures, and cube map array textures, the layer
      count is the number of layers in the array texture.
      { FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_{EXT|ARB} }

    Modify Section 4.4.7, Layered Framebuffers

    (add the following paragraph following table X.4, Layer numbers
    for cube map texture faces)

    When cube map array texture levels are attached to a layered
    framebuffer, the layer number corresponds to a layer-face. The
    layer-face can be translated into an array layer and a cube map face
    by

        array_layer = floor(layer/6), and
        face = layer mod 6.

    The face number correspond to the cube map faces as listed in
    table X.4.

Additions to Chapter 5 of the OpenGL 3.0 specification (Special Functions)

    Modify Section 5.4, Display List, page 306

    (modify the fifth paragraph in the section, p. 311)

    TexImage3D, TexImage2D, TexImage1D, Histogram, and ColorTable are
    executed immediately when called with the corresponding proxy
    arguments PROXY_TEXTURE_3D or PROXY_TEXTURE_2D_ARRAY or
    PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB; ...

Additions to Chapter 6 of the OpenGL 3.0 specification (State and State Requests)

    Modify Section 6.1.3, Enumerated Queries, page 316

    (modify the last paragraph, p. 317)

    GetTexParameter parameter <target> may be one of TEXTURE_1D,
    TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY,
    TEXTURE_2D_ARRAY, or TEXTURE_CUBE_MAP_ARRAY_ARB, indicating the
    currently bound one-, two-, three-dimensional, cube map, or one- or
    two-dimensional array texture or cube map array texture.
    GetTexLevelParameter parameter target may be one of TEXTURE_1D,
    TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP_POSITIVE_X,
    TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
    TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z,
    TEXTURE_CUBE_MAP_NEGATIVE_Z, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY,
    PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_3D,
    PROXY_TEXTURE_CUBE_MAP, PROXY_TEXTURE_1D_ARRAY,
    PROXY_TEXTURE_2D_ARRAY, or PROXY_TEXTURE_CUBE_MAP_ARRAY, indicating
    the one-, two-, or three-dimensional texture, one of the six
    distinct 2D images making up the cube map texture, the one- or
    two-dimensional array texture, or the one-, two-, three-dimensional,
    cube map, or one- or two-dimensional array or cube map array proxy
    state vector. ...


    Modify Section 6.1.4, Texture Queries, page 322

    (modify the first paragraph, p. 322)

    The command

      void GetTexImage( enum tex, int lod, enum format,
                        enum type, void *img );

    is used to obtain texture images. It is somewhat different from the
    other get commands; tex is a symbolic value indicating which texture
    (or texture face in the case of a cube map texture target name) is
    to be obtained. TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY and TEXTURE_CUBE_MAP_ARRAY_ARB
    indicate a one-, two-, or three-dimensional texture, or one- or
    two-dimensional array texture, or cube map array texture,
    respectively. ...

    (modify the third paragraph, p. 322)

    GetTexImage obtains... from the first image to the last for
    three-dimensional textures. One- and two-dimensional array textures
    and cube map array textures are treated as two-dimensional
    three-dimensional and three-dimensional images, respectively, where
    the layers are treated as rows or images. These groups are then...

    (modify the first paragraph, p. 323)

    For three-dimensional ,two-dimensional array and cube map array
    textures, pixel storage operations are applied as if the image were
    two-dimensional, except that the additional pixel storage state
    values PACK_IMAGE_HEIGHT and PACK_SKIP_IMAGES are applied. ...

Dependencies on EXT_gpu_shader4 and the OpenGL Shading Language (GLSL)

    Because there is no fixed-function pipeline access for cube map
    array textures, this extension is only valid when EXT_gpu_shader4
    and GLSL is supported. if GLSL is not supported, the shading
    language modifications and references to SAMPLER_CUBE_MAP_ARRAY_ARB
    and SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB should be removed.

Errors

    TexImage3D generates the error INVALID_VALUE if <target> is
    TEXTURE_CUBE_MAP_ARRAY_ARB and <depth> is not a multiple of 6.

    TexImage3D generates the error INVALID_VALUE if <target> is
    TEXTURE_CUBE_MAP_ARRAY_ARB and <width> and <height> are not equal.

New State

    (add to table 6.19, p. 357)
                                                              Initial
    Get Value                           Type     Get Command  Value       Description                       Sec.    Attribute
    ----------------------------------  -------  -----------  ----------  -----------------------------  ------  ---------
    TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB  2*x3xZ+  GetIntegerv    0         texture object bound              3.9.12  texture
                                                                          to TEXTURE_CUBE_MAP_ARRAY_ARB

    TEXTURE_CUBE_MAP_ARRAY_ARB          nxI      GetTexImage   see 3.9.1  cube map array texture image      3.9.1    -
                                                                          at lod i

Modification to the OpenGL shading Language Specification, Version 1.30.08

    #extension GL_ARB_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 Shading Language:

     #define GL_ARB_texture_cube_map_array 1


    Add to Section 3.6 "Keywords"

    (add new sampler type )

    samplerCubeArray, samplerCubeArrayShadow, isamplerCubeArray,
    usamplerCubeArray


    Add to Section 4.1 "Basic Types"

    (add the following entries to the table: Floating Point Sampler Types)

    samplerCubeArray         handle for accessing a cube map array texture

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

    (add the following entries to the table: Signed Integer Sampler Types)

    isamplerCubeArray        handle for accessing an integer cube map
                             array texture

    (add the following entries to the table: Unsigned Integer Sampler Types)

    usamplerCubeArray        handle for accessing an unsigned integer
                             cube map array texture

    Add at the end of Section 7.1
       "Vertex and Geometry Shader Special Variables"

    (after last paragraph already talking about gl_Layer)

    The output variable gl_Layer takes on a special value when used with
    an array of cubemap textures. Instead of simply refering to the
    layer, it is used to reference a cube map face inside a particular
    layer as well. Setting gl_Layer to the value (layer*6+face) will
    render to the appropriate <face> of the cube defined in <layer>. The
    face values are defined in Table 4.x of Section 4.4.7 'Layered
    Framebuffers' of the GL spec, but repeated here for clarity:

          face value            resulting target
        --------------   ------------------------------
              0            TEXTURE_CUBE_MAP_POSITVE_X
              1            TEXTURE_CUBE_MAP_NEGATIVE_X
              2            TEXTURE_CUBE_MAP_POSITVE_Y
              3            TEXTURE_CUBE_MAP_NEGATIVE_Y
              4            TEXTURE_CUBE_MAP_POSITVE_Z
              5            TEXTURE_CUBE_MAP_NEGATIVE_Z

    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).

    Add to section 8.7 "Texture Lookup Functions"

    (Add new functions to the set of allowed texture lookup functions p. 85):
    Syntax:

      ivec3 textureSize(samplerCubeArray sampler, int lod)
      gvec4 texture(gsamplerCubeArray sampler, vec4 coord
                    [, float bias])
      gvec4 textureLod(gsamplerCubeArray sampler, vec4 coord, float lod)
      ivec3 textureSize(samplerCubeArrayShadow sampler, int lod)
      float texture(samplerCubeArrayShadow sampler, vec4 coord, float compare)
      gvec4 textureGrad(gsamplerCubeArray sampler, vec4 coord,
                        vec3 ddx, vec3 ddy);

    Description:

      Cube map array functions are similar to the equivalent cube map or
      2D array functions. The value of coord.w is used to select the
      layer of the array and the value coord.xyz is used to select the
      location within the selected layer of the cubemap. See section 3.8
      for more details. The shadow comparison texture functions take the
      comparison value from a separate input rather than from the
      primary coord vector.

    Modify the Description of the textureSize function.

       For the array forms, the last component of the return value is
       the number of layers in the texture array, or the number of cubes
       in the texture cube map array.

Issues

    (1) When fetching the Cubemap array texture in shader, should the
        "q" coordinate be used to index a single layer of the whole
        array as 2D array texture does, or to index a specific cubemap
        within the array?

      RESOLVED: "q" is used to index a specific cubemap in the array.
      This is an intuitive selection because otherwise the it only need
      2 coordinates instead of 3 to fetch a value in one layer of the
      array.


    (2) When specifying and indexing cube map array texture, should the
        depth(layer) be the absolute number of layers in the array or
        the number of cube maps?

      RESOLVED: To support the indexing of cube map in cube map array, a
      list of new api calls needs to be added, which may not be a
      preferred direction.


    (3) Should partial updates to a cube map set in a cube map array
        texture be allowed?

      RESOLVED: No, maintain the same restriction as updating a cube map
      texture to retain orthogonality.


    (4) Are cube map arrays cube maps where each "face" is an array or
        arrays where each layer is a cube map? Should the API follow the
        cube map or texture array paradigm? Should the data organization
        for cube map arrays be exposed to or hidden from applications?

      RESOLVED: Cube map arrays are specified in a manner similar to
      two-dimensional array textures (as described in the
      EXT_texture_array extension), where each mipmap level is
      represented as a set of two-dimensional images. Each of these
      two-dimensional images corresponds to a single face of a single
      layer of the full cube map array, referred to as a "layer-face".
      The first six two-dimensional images of the mipmap level
      correspond to the six faces of the first layer of the cube map
      array, and subsequent groups of six layer-faces correspond to
      subsequent cube map array layers. For each cube map array layer,
      the six two-dimensional images correspond to the positive X,
      negative X, positive Y, negative Y, positive Z and negative Z
      faces, respectively. A valid cube map array texture will thus
      always have a multiple of 6 texture layers.

      Cube maps and array textures use different paradigms for texture
      image specification. Cube maps are specified one face at a time
      (using TEXTURE_CUBE_MAP_POSITIVE_X, etc.). Sub-texture updates to
      cube maps are also performed one face at a time. On the other
      hand, array textures are specified entirely at once, and
      sub-texture updates can span a subset of layers.

      Cube map arrays follow the array texture paradigm. Cube map arrays
      are specified all layer-faces at once or as a subset of
      layer-faces. This avoids adding complexity to the API and targets
      higher performance by lowering the number of calls necessary to
      build a cube map array texture. It also ensures that there will
      not be any texture completeness problems because of missing faces
      or faces with mismatched sizes.

      Since cube map array textures use the array texture paradigm, it
      is necessary for applications to understand the data organization
      of a cube map array. The data organization is exposed both at the
      bitmap level and at the depth/zoffset/layer level. The <depth>
      parameter used when specifying cube map array data is the number
      of layer-faces. The <zoffset> parameter used for sub-texture
      updates is also given as a layer-face. The <layer> parameter used
      with the FBO API is also a layer-face.


    (5) Should this organization be exposed when using geometry
        programs/shaders to select layer-faces for rendering?

      RESOLVED: Yes. Since layer-faces (layer*6+face) are exposed at the
      API level, it is reasonable to expose this at the shader level.
      The single layer output is preserved, and the value written to it
      is interpreted as a layer-face.

      Since the cube map array is treated as a special array of 2
      dimensional textures, the user may render to it inside of a
      geometry shader using the layered rendering functionality. The
      user must first attach the cube map texture array to a framebuffer
      color attachment using:

            void FramebufferTextureARB(enum target, enum attachment,
                                       uint texture, int level)

      where <texture> defines the texture object containing a cube map
      array texture.

      Inside of the geometry shader, setting 'gl_Layer' to the value
      (layer*6+face) will render to the appropriate <face> of the cube
      defined in <layer>. The face values are defined in Table 4.x of
      Section 4.4.7 'Layered Framebuffers' of the GL spec, but repeated
      here for clarity:

          face value            resulting target
        --------------   ------------------------------
              0            TEXTURE_CUBE_MAP_POSITVE_X
              1            TEXTURE_CUBE_MAP_NEGATIVE_X
              2            TEXTURE_CUBE_MAP_POSITVE_Y
              3            TEXTURE_CUBE_MAP_NEGATIVE_Y
              4            TEXTURE_CUBE_MAP_POSITVE_Z
              5            TEXTURE_CUBE_MAP_NEGATIVE_Z

      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).


    (6) Should TexImage3D be enhanced to take TEXTURE_CUBE_MAP as a
        <target> where the data is the whole cube map?

      RESOLVED: No. From an implementation perspective this may be quite
      simple (a cube map is a cube map array with one layer). However,
      there is not much value added by doing this. An abundance of
      existing code that uses cube maps would not benefit from the
      change.


    (7) Should the FBO API provide a mechanism for attaching a single
        cube map from an array as an attachment for layered rendering?

     RESOLVED: No. This is an interesting idea, but it doesn't provide
     much functionality. This can easily be done as part of the geometry
     program/shader. A more interesting idea for future versions of
     OpenGL or as an extension is to allow texture data specified with
     one texture target to be "typecast" or viewed as if specified with
     a different target. Such an extension would allow an application to
     view an array (or subset of an array) of two-dimensional texture
     images as a two-dimensional array, a three-dimensional texture, or
     a cube map array.


    (8) How do you determine the maximum number of cube map array
        texture layers allowed by an implementation?

      RESOLVED: This extension treats cube map array textures like
      two-dimensional array textures, except that the number of
      layer-faces must be a multiple of six, and the width and height
      must be equal. There is no separate query for the number of layers
      in a cube map array, but the limit on the number of layers in an
      array texture (EXT_texture_array) also applies to the total number
      of layer-faces in a cube map array texture.

      For example, if an implementation supporting this extension has a
      limit of 512 layers for array, a cube map array texture may have
      no more than floor(512/6) = 85 layers.

    (9) Do we really need to define integer versions of cube map array
        sampler types?

      RESOLVED: Yes. It's not clear if they will be useful to any
      applications, but there is no real reason no to provide them.

    (10) Should we provide texture LOD functions for shadow sampler
         targets?

      RESOLVED: Yes. The level of detail computations for a texture used
      as a shadow map are completely identical to that for other
      textures.

      However, we provide separate data types for the two textures
      (e.g., sampler2D vs. sampler2DShadow), and there is no mechanism
      to cast from one to the other. If we didn't provide these
      functions, the only way to perform an LOD computation for a
      texture used as a shadow map would be to bind the same texture
      object to two different texture image units, one associated with a
      shadow sampler and the other associated with a normal sampler.

    (11) What built-in functions are available for 2D arrays that are
         not provided for cube map arrays?

      RESOLVED: Functions equivalent to the following 2D array functions
      are not available for cube map arrays:

        vec4 texelFetch2DArray(sampler2DArray sampler, ivec3 coord, int lod)
        vec4 shadow2DArrayGrad(sampler2DArrayShadow sampler, vec4 coord,
                               vec2 ddx, vec2 ddy);
        vec4 texelFetch2DArrayOffset(sampler2DArray sampler, ivec3 coord,
                                     int lod, ivec2 offset)
        vec4 shadow2DArrayGradOffset(sampler2DArrayShadow sampler,
                                     vec4 coord, vec2 ddx, vec2 ddy,
                                     ivec2 offset);

    (12) What does ivec3 textureSize(samplerCubeArray sampler, int lod)
         in the z component?

      Resolved: array_layer (that is, number of cube maps in the array).

      The spec is currently ambiguous, and can be interpreted as
      layer (the number of cube map faces) or array_layer = floor(layer/6),
      the number of cube maps.
 
Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
     9    12/07/09  wwlk      Edit texture function table description
                              as resolved in issue 12
     8    12/07/09  wwlk      Resolved issue 12
     7    11/13/09  wwlk      Added array size returned issue 12
     6    11/11/09  wwlk      Correct more mistaken GLSL prototypes
                              gSamplerCube takes vec3 ddx and ddy
                              gSamplerCube do not have offsets
                              gSamplerCubeArray should match.
     5    09/09/09  groth     Correct some mistaken GLSL prototypes
     4    08/02/09  Jon Leech Reformat to 80 columns and assign ARB
                              extension number.
     3    07/22/09  myoung    Fix gl_layer interaction description
     2    06/30/09  gsellers  Fix enumerant values
     1    05/06/09  nickh     First draft
