Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. Name
  2.  
  3.     MESA_texture_array
  4.  
  5. Name Strings
  6.  
  7.     GL_MESA_texture_array
  8.  
  9. Contact
  10.  
  11.     Ian Romanick, IBM (idr 'at' us.ibm.com)
  12.  
  13. IP Status
  14.  
  15.     No known IP issues.
  16.  
  17. Status
  18.  
  19.     Shipping in Mesa 7.1
  20.  
  21. Version
  22.  
  23.  
  24. Number
  25.  
  26.     TBD
  27.  
  28. Dependencies
  29.  
  30.     OpenGL 1.2 or GL_EXT_texture3D is required.
  31.  
  32.     Support for ARB_fragment_program is assumed, but not required.
  33.  
  34.     Support for ARB_fragment_program_shadow is assumed, but not required.
  35.  
  36.     Support for EXT_framebuffer_object is assumed, but not required.
  37.  
  38.     Written based on the wording of the OpenGL 2.0 specification and
  39.     ARB_fragment_program_shadow but not dependent on them.
  40.  
  41. Overview
  42.  
  43.     There are a number of circumstances where an application may wish to
  44.     blend two textures out of a larger set of textures.  Moreover, in some
  45.     cases the selected textures may vary on a per-fragment basis within
  46.     a polygon.  Several examples include:
  47.  
  48.        1. High dynamic range textures.  The application stores several
  49.        different "exposures" of an image as different textures.  On a
  50.        per-fragment basis, the application selects which exposures are
  51.        used.
  52.  
  53.        2. A terrain engine where the altitude of a point determines the
  54.        texture applied to it.  If the transition is from beach sand to
  55.        grass to rocks to snow, the application will store each texture
  56.        in a different texture map, and dynamically select which two
  57.        textures to blend at run-time.
  58.  
  59.        3. Storing short video clips in textures.  Each depth slice is a
  60.        single frame of video.
  61.  
  62.     Several solutions to this problem have been proposed, but they either
  63.     involve using a separate texture unit for each texture map or using 3D
  64.     textures without mipmaps.  Both of these options have major drawbacks.
  65.  
  66.     This extension provides a third alternative that eliminates the major
  67.     drawbacks of both previous methods.  A new texture target,
  68.     TEXTURE_2D_ARRAY, is added that functions identically to TEXTURE_3D in
  69.     all aspects except the sizes of the non-base level images.  In
  70.     traditional 3D texturing, the size of the N+1 LOD is half the size
  71.     of the N LOD in all three dimensions.  For the TEXTURE_2D_ARRAY target,
  72.     the height and width of the N+1 LOD is halved, but the depth is the
  73.     same for all levels of detail. The texture then becomes an array of
  74.     2D textures.  The per-fragment texel is selected by the R texture
  75.     coordinate.
  76.  
  77.     References:
  78.  
  79.         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011557
  80.         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=000516
  81.         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011903
  82.         http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm
  83.  
  84. New Procedures and Functions
  85.  
  86.     All functions come directly from EXT_texture_array.
  87.  
  88.     void FramebufferTextureLayerEXT(enum target, enum attachment,
  89.                                     uint texture, int level, int layer);
  90.  
  91. New Tokens
  92.  
  93.     All token names and values come directly from EXT_texture_array.
  94.  
  95.     Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, by
  96.     the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
  97.     GetDoublev, and by the <target> parameter of TexImage3D, GetTexImage,
  98.     GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and
  99.     GetTexParameterfv:
  100.  
  101.         TEXTURE_1D_ARRAY_EXT                            0x8C18
  102.         TEXTURE_2D_ARRAY_EXT                            0x8C1A
  103.  
  104.     Accepted by the <target> parameter of TexImage2D, TexSubImage2D,
  105.     CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D,
  106.     CompressedTexSubImage2D, GetTexLevelParameteriv, and
  107.     GetTexLevelParameterfv:
  108.  
  109.         TEXTURE_1D_ARRAY_EXT
  110.         PROXY_TEXTURE_1D_ARRAY_EXT                      0x8C19
  111.  
  112.     Accepted by the <target> parameter of TexImage3D, TexSubImage3D,
  113.     CopyTexSubImage3D, CompressedTexImage3D, CompressedTexSubImage3D,
  114.     GetTexLevelParameteriv, and GetTexLevelParameterfv:
  115.  
  116.         TEXTURE_2D_ARRAY_EXT
  117.         PROXY_TEXTURE_2D_ARRAY_EXT                      0x8C1B
  118.  
  119.     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
  120.     GetFloatv, and GetDoublev
  121.  
  122.         TEXTURE_BINDING_1D_ARRAY_EXT                    0x8C1C
  123.         TEXTURE_BINDING_2D_ARRAY_EXT                    0x8C1D
  124.         MAX_ARRAY_TEXTURE_LAYERS_EXT                    0x88FF
  125.  
  126.     Accepted by the <param> parameter of TexParameterf, TexParameteri,
  127.     TexParameterfv, and TexParameteriv when the <pname> parameter is
  128.     TEXTURE_COMPARE_MODE_ARB:
  129.  
  130.         COMPARE_REF_DEPTH_TO_TEXTURE_EXT                0x884E
  131.  
  132.     (Note:  COMPARE_REF_DEPTH_TO_TEXTURE_EXT is simply an alias for the
  133.     existing COMPARE_R_TO_TEXTURE token in OpenGL 2.0; the alternate name
  134.     reflects the fact that the R coordinate is not always used.)
  135.  
  136.     Accepted by the <internalformat> parameter of TexImage3D and
  137.     CompressedTexImage3D, and by the <format> parameter of
  138.     CompressedTexSubImage3D:
  139.  
  140.         COMPRESSED_RGB_S3TC_DXT1_EXT
  141.         COMPRESSED_RGBA_S3TC_DXT1_EXT
  142.         COMPRESSED_RGBA_S3TC_DXT3_EXT
  143.         COMPRESSED_RGBA_S3TC_DXT5_EXT
  144.  
  145.     Accepted by the <pname> parameter of
  146.     GetFramebufferAttachmentParameterivEXT:
  147.  
  148.         FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT          0x8CD4
  149.  
  150.     (Note:  FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is simply an alias for the
  151.     FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT token provided in
  152.     EXT_framebuffer_object.  This extension generalizes the notion of
  153.     "<zoffset>" to include layers of an array texture.)
  154.  
  155. Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)
  156.  
  157.     None
  158.  
  159. Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
  160.  
  161.     -- Section 3.8.1 "Texture Image Specification"
  162.  
  163.        Change the first paragraph (page 150) to say (spec changes identical to
  164.        EXT_texture_array):
  165.  
  166.        "The command
  167.  
  168.          void TexImage3D(enum target, int level, int internalformat,
  169.                          sizei width, sizei height, sizei depth, int border,
  170.                          enum format, enum type, void *data);
  171.  
  172.        is used to specify a three-dimensional texture image. target must be one
  173.        one of TEXTURE_3D for a three-dimensional texture or
  174.        TEXTURE_2D_ARRAY_EXT for an two-dimensional array texture.
  175.        Additionally, target may be either PROXY_TEXTURE_3D for a
  176.        three-dimensional proxy texture, or PROXY_TEXTURE_2D_ARRAY_EXT for a
  177.        two-dimensional proxy array texture."
  178.  
  179.        Change the fourth paragraph on page 151 to say (spec changes identical
  180.        to EXT_texture_array):
  181.  
  182.        "Textures with a base internal format of DEPTH_COMPONENT are supported
  183.        by texture image specification commands only if target is TEXTURE_1D,
  184.        TEXTURE_2D, TEXTURE_1D_ARRAY_EXT, TEXTURE_2D_ARRAY_EXT,
  185.        PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_1D_ARRAY_EXT, or
  186.        PROXY_TEXTURE_2D_ARRAY_EXT. Using this format in conjunction with any
  187.        other target will result in an INVALID_OPERATION error."
  188.  
  189.  
  190.        Change the fourth paragraph on page 156 to say (spec changes identical
  191.        to EXT_texture_array):
  192.        
  193.        "The command
  194.  
  195.          void TexImage2D(enum target, int level,
  196.                          int internalformat, sizei width, sizei height,
  197.                          int border, enum format, enum type, void *data);
  198.  
  199.        is used to specify a two-dimensional texture image. target must be one
  200.        of TEXTURE_2D for a two-dimensional texture, TEXTURE_1D_ARRAY_EXT for a
  201.        one-dimensional array texture, or one of TEXTURE_CUBE_MAP_POSITIVE_X,
  202.        TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_POSITIVE_Y,
  203.        TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, or
  204.        TEXTURE_CUBE_MAP_NEGATIVE_Z for a cube map texture. Additionally,
  205.        target may be either PROXY_TEXTURE_2D for a two-dimensional proxy
  206.        texture, PROXY_TEXTURE_1D_ARRAY_EXT for a one-dimensional proxy array
  207.        texture, or PROXY TEXTURE_CUBE_MAP for a cube map proxy texture in the
  208.        special case discussed in section 3.8.11.  The other parameters match
  209.        the corresponding parameters of TexImage3D.
  210.  
  211.        For the purposes of decoding the texture image, TexImage2D is
  212.        equivalent to calling TexImage3D with corresponding arguments and depth
  213.        of 1, except that
  214.  
  215.          * The border depth, d_b, is zero, and the depth of the image is
  216.            always 1 regardless of the value of border.
  217.  
  218.          * The border height, h_b, is zero if <target> is
  219.            TEXTURE_1D_ARRAY_EXT, and <border> otherwise.
  220.  
  221.          * Convolution will be performed on the image (possibly changing its
  222.            width and height) if SEPARABLE 2D or CONVOLUTION 2D is enabled.
  223.  
  224.          * UNPACK SKIP IMAGES is ignored."
  225.  
  226.     -- Section 3.8.2 "Alternate Texture Image Specification Commands"
  227.  
  228.        Change the second paragraph (page 159) (spec changes identical
  229.        to EXT_texture_array):
  230.  
  231.        "The command
  232.  
  233.          void CopyTexImage2D(enum target, int level,
  234.                              enum internalformat, int x, int y, sizei width,
  235.                              sizei height, int border);
  236.  
  237.        defines a two-dimensional texture image in exactly the manner of
  238.        TexImage2D, except that the image data are taken from the framebuffer
  239.        rather than from client memory. Currently, target must be one of
  240.        TEXTURE_2D, TEXTURE_1D_ARRAY_EXT, TEXTURE_CUBE_MAP_POSITIVE_X,
  241.        TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE MAP_POSITIVE_Y,
  242.        TEXTURE_CUBE_MAP_NEGATIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, or
  243.        TEXTURE_CUBE_MAP_NEGATIVE_Z.
  244.  
  245.  
  246.        Change the last paragraph on page 160 to say (spec changes identical
  247.        to EXT_texture_array):
  248.  
  249.        "Currently the target arguments of TexSubImage1D and CopyTexSubImage1D
  250.        must be TEXTURE_1D, the target arguments of TexSubImage2D and
  251.        CopyTexSubImage2D must be one of TEXTURE_2D, TEXTURE_1D_ARRAY_EXT,
  252.        TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
  253.        TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
  254.        TEXTURE_CUBE_MAP_POSITIVE_Z, or TEXTURE_CUBE_MAP_NEGATIVE_Z, and the
  255.        target arguments of TexSubImage3D and CopyTexSubImage3D must be
  256.        TEXTURE_3D or TEXTURE_2D_ARRAY_EXT. ..."
  257.  
  258.  
  259.     -- Section 3.8.4 "Texture Parameters"
  260.  
  261.        Change the first paragraph (page 166) to say:
  262.  
  263.        "Various parameters control how the texel array is treated when
  264.        specified or changed, and when applied to a fragment. Each parameter is
  265.        set by calling
  266.  
  267.          void TexParameter{if}(enum target, enum pname, T param);
  268.          void TexParameter{if}v(enum target, enum pname, T params);
  269.  
  270.        target is the target, either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
  271.        TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT."
  272.  
  273.  
  274.     -- Section 3.8.8 "Texture Minification" in the section "Scale Factor and Level of Detail"
  275.  
  276.        Change the first paragraph (page 172) to say:
  277.  
  278.        "Let s(x,y) be the function that associates an s texture coordinate
  279.        with each set of window coordinates (x,y) that lie within a primitive;
  280.        define t(x,y) and r(x,y) analogously.  Let u(x,y) = w_t * s(x,y),
  281.        v(x,y) = h_t * t(x,y), and w(x,y) = d_t * r(x,y), where w_t, h_t,
  282.        and d_t are as defined by equations 3.15, 3.16, and 3.17 with
  283.        w_s, h_s, and d_s equal to the width, height, and depth of the
  284.        image array whose level is level_base.  For a one-dimensional
  285.        texture or a one-dimensional array texture, define v(x,y) = 0 and
  286.        w(x,y) = 0; for a two-dimensional texture or a two-dimensional array
  287.        texture, define w(x,y) = 0..."
  288.  
  289.     -- Section 3.8.8 "Texture Minification" in the section "Mipmapping"
  290.  
  291.        Change the third paragraph (page 174) to say:
  292.        
  293.        "For a two-dimensional texture, two-dimensional array texture, or
  294.        cube map texture,"
  295.  
  296.        Change the fourth paragraph (page 174) to say:
  297.  
  298.        "And for a one-dimensional texture or a one-dimensional array texture,"
  299.  
  300.        After the first paragraph (page 175) add:
  301.  
  302.        "For one-dimensional array textures, h_b and d_b are treated as 1,
  303.        regardless of the actual values, when performing mipmap calculations.
  304.        For two-dimensional array textures, d_b is always treated as one,
  305.        regardless of the actual value, when performing mipmap calculations."
  306.  
  307.     -- Section 3.8.8 "Automatic Mipmap Generation" in the section "Mipmapping"
  308.  
  309.        Change the third paragraph (page 176) to say (spec changes identical
  310.        to EXT_texture_array):
  311.  
  312.        "The contents of the derived arrays are computed by repeated, filtered
  313.        reduction of the level_base array.  For one- and two-dimensional array
  314.        textures, each layer is filtered independently.  ..."
  315.  
  316.     -- Section 3.8.8 "Manual Mipmap Generation" in the section "Mipmapping"
  317.  
  318.        Change first paragraph to say (spec changes identical to
  319.        EXT_texture_array):
  320.  
  321.        "Mipmaps can be generated manually with the command
  322.  
  323.          void GenerateMipmapEXT(enum target);
  324.  
  325.        where <target> is one of TEXTURE_1D, TEXTURE_2D, TEXTURE_CUBE_MAP,
  326.        TEXTURE_3D, TEXTURE_1D_ARRAY, or TEXTURE_2D_ARRAY.  Mipmap generation
  327.        affects the texture image attached to <target>.  ..."
  328.  
  329.     -- Section 3.8.10 "Texture Completeness"
  330.  
  331.        Change the second paragraph (page 177) to say (spec changes identical
  332.        to EXT_texture_array):
  333.  
  334.        "For one-, two-, or three-dimensional textures and one- or
  335.        two-dimensional array textures, a texture is complete if the following
  336.        conditions all hold true:"
  337.  
  338.     -- Section 3.8.11 "Texture State and Proxy State"
  339.  
  340.        Change the second and third paragraphs (page 179) to say (spec changes
  341.        identical to EXT_texture_array):
  342.  
  343.        "In addition to image arrays for one-, two-, and three-dimensional
  344.        textures, one- and two-dimensional array textures, and the six image
  345.        arrays for the cube map texture, partially instantiated image arrays
  346.        are maintained for one-, two-, and three-dimensional textures and one-
  347.        and two-dimensional array textures.  Additionally, a single proxy image
  348.        array is maintained for the cube map texture.  Each proxy image array
  349.        includes width, height, depth, border width, and internal format state
  350.        values, as well as state for the red, green, blue, alpha, luminance,
  351.        and intensity component resolutions. Proxy image arrays do not include
  352.        image data, nor do they include texture properties. When TexImage3D is
  353.        executed with target specified as PROXY_TEXTURE_3D, the
  354.        three-dimensional proxy state values of the specified level-of-detail
  355.        are recomputed and updated. If the image array would not be supported
  356.        by TexImage3D called with target set to TEXTURE 3D, no error is
  357.        generated, but the proxy width, height, depth, border width, and
  358.        component resolutions are set to zero. If the image array would be
  359.        supported by such a call to TexImage3D, the proxy state values are set
  360.        exactly as though the actual image array were being specified. No pixel
  361.        data are transferred or processed in either case.
  362.  
  363.        Proxy arrays for one- and two-dimensional textures and one- and
  364.        two-dimensional array textures are operated on in the same way when
  365.        TexImage1D is executed with target specified as PROXY_TEXTURE_1D,
  366.        TexImage2D is executed with target specified as PROXY_TEXTURE_2D or
  367.        PROXY_TEXTURE_1D_ARRAY_EXT, or TexImage3D is executed with target
  368.        specified as PROXY_TETXURE_2D_ARRAY_EXT."
  369.  
  370.     -- Section 3.8.12 "Texture Objects"
  371.  
  372.        Change section (page 180) to say (spec changes identical to
  373.        EXT_texture_array):
  374.  
  375.        "In addition to the default textures TEXTURE_1D, TEXTURE_2D,
  376.        TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and TEXTURE_2D_EXT,
  377.        named one-, two-, and three-dimensional, cube map, and one- and
  378.        two-dimensional array texture objects can be created and operated upon.
  379.        The name space for texture objects is the unsigned integers, with zero
  380.        reserved by the GL.
  381.  
  382.        A texture object is created by binding an unused name to TEXTURE_1D,
  383.        TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
  384.        TEXTURE_2D_ARRAY_EXT. The binding is effected by calling
  385.  
  386.          void BindTexture(enum target, uint texture);
  387.  
  388.        with <target> set to the desired texture target and <texture> set to
  389.        the unused name.  The resulting texture object is a new state vector,
  390.        comprising all the state values listed in section 3.8.11, set to the
  391.        same initial values. If the new texture object is bound to TEXTURE_1D,
  392.        TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
  393.        TEXTURE_2D_ARRAY_EXT, it is and remains a one-, two-,
  394.        three-dimensional, cube map, one- or two-dimensional array texture
  395.        respectively until it is deleted.
  396.  
  397.        BindTexture may also be used to bind an existing texture object to
  398.        either TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
  399.        TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT. The error
  400.        INVALID_OPERATION is generated if an attempt is made to bind a texture
  401.        object of different dimensionality than the specified target. If the
  402.        bind is successful no change is made to the state of the bound texture
  403.        object, and any previous binding to target is broken.
  404.  
  405.        While a texture object is bound, GL operations on the target to which
  406.        it is bound affect the bound object, and queries of the target to which
  407.        it is bound return state from the bound object. If texture mapping of
  408.        the dimensionality of the target to which a texture object is bound is
  409.        enabled, the state of the bound texture object directs the texturing
  410.        operation.
  411.  
  412.        In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
  413.        TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and TEXTURE_2D_ARRAY_EXT have
  414.        one-, two-, three-dimensional, cube map, and one- and two-dimensional
  415.        array texture state vectors respectively associated with them. In order
  416.        that access to these initial textures not be lost, they are treated as
  417.        texture objects all of whose names are 0. The initial one-, two-,
  418.        three-dimensional, cube map, one- and two-dimensional array textures
  419.        are therefore operated upon, queried, and applied as TEXTURE_1D,
  420.        TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, and
  421.        TEXTURE_2D_ARRAY_EXT respectively while 0 is bound to the corresponding
  422.        targets.
  423.  
  424.        Change second paragraph on page 181 to say (spec changes identical to
  425.        EXT_texture_array):
  426.        
  427.        "...  If a texture that is currently bound to one of the targets
  428.        TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
  429.        TEXTURE_1D_ARRAY_EXT, or TEXTURE_2D_ARRAY_EXT is deleted, it is as
  430.        though BindTexture had been executed with the same target and texture
  431.        zero. ..."
  432.  
  433.        Change second paragraph on page 182 to say (spec changes identical to
  434.        EXT_texture_array):
  435.        
  436.        "The texture object name space, including the initial one-, two-, and
  437.        three dimensional, cube map, and one- and two-dimensional array texture
  438.        objects, is shared among all texture units. ..."
  439.  
  440.  
  441.     -- Section 3.8.14 "Depth Texture Comparison Modes" in "Texture Comparison Modes"
  442.  
  443.        Change second through fourth paragraphs (page 188) to say:
  444.  
  445.        "Let D_t be the depth texture value, in the range [0, 1].  For
  446.        texture lookups from one- and two-dimensional, rectangle, and
  447.        one-dimensional array targets, let R be the interpolated <r>
  448.        texture coordinate, clamped to the range [0, 1].  For texture lookups
  449.        from two-dimensional array texture targets, let R be the interpolated
  450.        <q> texture coordinate, clamped to the range [0, 1].  Then the
  451.        effective texture value L_t, I_t, or A_t is computed as follows:
  452.  
  453.        If the value of TEXTURE_COMPARE_MODE is NONE, then
  454.  
  455.           r = Dt
  456.  
  457.        If the value of TEXTURE_COMPARE_MODE is
  458.        COMPARE_REF_DEPTH_TO_TEXTURE_EXT), then r depends on the texture
  459.        comparison function as shown in table 3.27."
  460.  
  461.     -- Section 3.8.15 "Texture Application"
  462.  
  463.        Change the first paragraph (page 189) to say:
  464.  
  465.        "Texturing is enabled or disabled using the generic Enable and Disable
  466.        commands, respectively, with the symbolic constants TEXTURE_1D,
  467.        TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_ARRAY_EXT, or
  468.        TEXTURE_2D_ARRAY_EXT to enable one-, two-, three-dimensional, cube
  469.        map, one-dimensional array, or two-dimensional array texture,
  470.        respectively.  If both two- and one-dimensional textures are enabled,
  471.        the two-dimensional texture is used.  If the three-dimensional and
  472.        either of the two- or one-dimensional textures is enabled, the
  473.        three-dimensional texture is used.  If the cube map texture and any of
  474.        the three-, two-, or one-dimensional textures is enabled, then cube map
  475.        texturing is used.  If one-dimensional array texture is enabled and any
  476.        of cube map, three-, two-, or one-dimensional textures is enabled,
  477.        one-dimensional array texturing is used.  If two-dimensional array
  478.        texture is enabled and any of cube map, three-, two-, one-dimensional
  479.        textures or one-dimensional array texture is enabled, two-dimensional
  480.        array texturing is used..."
  481.  
  482.     -- Section 3.11.2 of ARB_fragment_program (Fragment Program Grammar and Restrictions):
  483.  
  484.        (mostly add to existing grammar rules)
  485.  
  486.        <optionName>           ::= "MESA_texture_array"
  487.  
  488.        <texTarget>            ::= "1D"
  489.                                | "2D"
  490.                                | "3D"
  491.                                | "CUBE"
  492.                                | "RECT"
  493.                                | <arrayTarget> (if program option is present)
  494.                                | <shadowTarget> (if program option is present)
  495.  
  496.        <arrayTarget>          ::= "ARRAY1D"
  497.                                | "ARRAY2D"
  498.  
  499.        <shadowTarget>         ::= "SHADOW1D"
  500.                                | "SHADOW2D"
  501.                                | "SHADOWRECT"
  502.                                | <shadowArrayTarget> (if program option is present)
  503.  
  504.        <shadowArrayTarget>    ::= "SHADOWARRAY1D"
  505.                                | "SHADOWARRAY2D"
  506.  
  507.  
  508.     -- Add Section 3.11.4.5.4 "Texture Stack Option"
  509.  
  510.        "If a fragment program specifies the "MESA_texture_array" program
  511.        option, the <texTarget> rule is modified to add the texture targets
  512.        ARRAY1D and ARRAY2D (See Section 3.11.2)."
  513.  
  514.     -- Section 3.11.6 "Fragment Program Texture Instruction Set"
  515.  
  516.        (replace 1st and 2nd paragraphs with the following paragraphs)
  517.  
  518.        "The first three texture instructions described below specify the
  519.        mapping of 4-tuple input vectors to 4-tuple output vectors.
  520.        The sampling of the texture works as described in section 3.8,
  521.        except that texture environments and texture functions are not
  522.        applicable, and the texture enables hierarchy is replaced by explicit
  523.        references to the desired texture target (i.e., 1D, 2D, 3D, cube map,
  524.        rectangle, ARRAY1D, ARRAY2D).  These texture instructions specify
  525.        how the 4-tuple is mapped into the coordinates used for sampling.  The
  526.        following function is used to describe the texture sampling in the
  527.        descriptions below:
  528.  
  529.          vec4 TextureSample(vec4 coord, float lodBias, int texImageUnit,
  530.                             enum texTarget);
  531.  
  532.        Note that not all four components of the texture coordinates <coord>
  533.        are used by all texture targets.  Component usage for each <texTarget>
  534.        is defined in table X.
  535.  
  536.                                                         coordinates used
  537.          texTarget          Texture Type               s t r  layer  shadow
  538.          ----------------   ---------------------      -----  -----  ------
  539.          1D                 TEXTURE_1D                 x - -    -      -
  540.          2D                 TEXTURE_2D                 x y -    -      -
  541.          3D                 TEXTURE_3D                 x y z    -      -
  542.          CUBE               TEXTURE_CUBE_MAP           x y z    -      -
  543.          RECT               TEXTURE_RECTANGLE_ARB      x y -    -      -
  544.          ARRAY1D            TEXTURE_1D_ARRAY_EXT       x - -    y      -
  545.          ARRAY2D            TEXTURE_2D_ARRAY_EXT       x y -    z      -
  546.          SHADOW1D           TEXTURE_1D                 x - -    -      z
  547.          SHADOW2D           TEXTURE_2D                 x y -    -      z
  548.          SHADOWRECT         TEXTURE_RECTANGLE_ARB      x y -    -      z
  549.          SHADOWARRAY1D      TEXTURE_1D_ARRAY_EXT       x - -    y      z
  550.          SHADOWARRAY2D      TEXTURE_2D_ARRAY_EXT       x y -    z      w
  551.  
  552.          Table X:  Texture types accessed for each of the <texTarget>, and
  553.          coordinate mappings.  The "coordinates used" column indicate the
  554.          input values used for each coordinate of the texture lookup, the
  555.          layer selector for array textures, and the reference value for
  556.          texture comparisons."
  557.  
  558.     -- Section 3.11.6.2 "TXP: Project coordinate and map to color"
  559.    
  560.        Add to the end of the section:
  561.        
  562.        "A program will fail to load if the TXP instruction is used in
  563.        conjunction with the SHADOWARRAY2D target."
  564.  
  565. Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment Operations)
  566.  
  567.     -- Section 4.4.2.3 "Attaching Texture Images to a Framebuffer"
  568.  
  569.        Add to the end of the section (spec changes identical to
  570.        EXT_texture_array):
  571.  
  572.        "The command
  573.  
  574.          void FramebufferTextureLayerEXT(enum target, enum attachment,
  575.                                          uint texture, int level, int layer);
  576.  
  577.        operates identically to FramebufferTexture3DEXT, except that it
  578.        attaches a single layer of a three-dimensional texture or a one- or
  579.        two-dimensional array texture.  <layer> is an integer indicating the
  580.        layer number, and is treated identically to the <zoffset> parameter in
  581.        FramebufferTexture3DEXT.  The error INVALID_VALUE is generated if
  582.        <layer> is negative.  The error INVALID_OPERATION is generated if
  583.        <texture> is non-zero and is not the name of a three dimensional
  584.        texture or one- or two-dimensional array texture.  Unlike
  585.        FramebufferTexture3D, no <textarget> parameter is accepted.
  586.  
  587.        If <texture> is non-zero and the command does not result in an error,
  588.        the framebuffer attachment state corresponding to <attachment> is
  589.        updated as in the other FramebufferTexture commands, except that
  590.        FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT is set to <layer>."
  591.  
  592.     -- Section 4.4.4.1 "Framebuffer Attachment Completeness"
  593.  
  594.       Add to the end of the list of completeness rules (spec changes
  595.       identical to EXT_texture_array):
  596.  
  597.         "* If FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE and
  598.            FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT names a one- or
  599.            two-dimensional array texture, then
  600.            FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT must be smaller than the
  601.            number of layers in the texture."
  602.  
  603. Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)
  604.  
  605.     -- Section 5.4 "Display Lists"
  606.  
  607.        Change the first paragraph on page 242 to say (spec changes
  608.        identical to EXT_texture_array):
  609.  
  610.        "TexImage3D, TexImage2D, TexImage1D, Histogram, and ColorTable are
  611.        executed immediately when called with the corresponding proxy arguments
  612.        PROXY_TEXTURE_3D or PROXY_TEXTURE_2D_ARRAY_EXT; PROXY_TEXTURE_2D,
  613.        PROXY_TEXTURE_CUBE_MAP, or PROXY_TEXTURE_1D_ARRAY_EXT;
  614.        PROXY_TEXTURE_1D; PROXY_HISTOGRAM; and PROXY_COLOR_TABLE,
  615.        PROXY_POST_CONVOLUTION_COLOR_TABLE, or
  616.        PROXY_POST_COLOR_MATRIX_COLOR_TABLE."
  617.  
  618. Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State Requests)
  619.  
  620.     -- Section 6.1.3 "Enumerated Queries"
  621.  
  622.        Add after the line beginning "If the value of
  623.        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT is TEXTURE" (spec changes
  624.        identical to EXT_texture_array):
  625.  
  626.        "If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT and the
  627.        texture object named FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT is a
  628.        three-dimensional texture or a one- or two-dimensional array texture,
  629.        then <params> will contain the number of texture layer attached to the
  630.        attachment point.  Otherwise, <params> will contain the value zero."
  631.  
  632.     -- Section 6.1.4 "Texture Queries"
  633.    
  634.        Change the first three paragraphs (page 248) to say (spec changes
  635.        identical to EXT_texture_array):
  636.  
  637.        "The command
  638.  
  639.          void GetTexImage(enum tex, int lod, enum format,
  640.                           enum type, void *img);
  641.  
  642.        is used to obtain texture images. It is somewhat different from the
  643.        other get commands; tex is a symbolic value indicating which texture
  644.        (or texture face in the case of a cube map texture target name) is to
  645.        be obtained.  TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY_EXT,
  646.        and TEXTURE_2D_ARRAY_EXT indicate a one-, two-, or three-dimensional
  647.        texture, or one- or two-dimensional array texture, respectively.
  648.        TEXTURE_CUBE_MAP_POSITIVE_X, ...
  649.  
  650.        GetTexImage obtains... from the first image to the last for
  651.        three-dimensional textures.  One- and two-dimensional array textures
  652.        are treated as two- and three-dimensional images, respectively, where
  653.        the layers are treated as rows or images.  These groups are then...
  654.  
  655.        For three-dimensional and two-dimensional array textures, pixel storage
  656.        operations are applied as if the image were two-dimensional, except
  657.        that the additional pixel storage state values PACK_IMAGE_HEIGHT and
  658.        PACK_SKIP_IMAGES are applied. ..."
  659.  
  660. Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)
  661.  
  662.     None
  663.  
  664. Additions to the AGL/GLX/WGL Specifications
  665.  
  666.     None
  667.  
  668. GLX Protocol
  669.  
  670.     None
  671.  
  672. Dependencies on ARB_fragment_program
  673.  
  674.     If ARB_fragment_program is not supported, the changes to section 3.11
  675.     should be ignored.
  676.  
  677. Dependencies on EXT_framebuffer_object
  678.  
  679.     If EXT_framebuffer_object is not supported, the changes to section
  680.     3.8.8 ("Manual Mipmap Generation"), 4.4.2.3, and 6.1.3 should be ignored.
  681.  
  682. Dependencies on EXT_texture_compression_s3tc and NV_texture_compression_vtc
  683.  
  684.     (Identical dependency as EXT_texture_array.)
  685.  
  686.     S3TC texture compression is supported for two-dimensional array textures.
  687.     When <target> is TEXTURE_2D_ARRAY_EXT, each layer is stored independently
  688.     as a compressed two-dimensional textures.  When specifying or querying
  689.     compressed images using one of the S3TC formats, the images are provided
  690.     and/or returned as a series of two-dimensional textures stored
  691.     consecutively in memory, with the layer closest to zero specified first.
  692.     For array textures, images are not arranged in 4x4x4 or 4x4x2 blocks as in
  693.     the three-dimensional compression format provided in the
  694.     EXT_texture_compression_vtc extension.  Pixel store parameters, including
  695.     those specific to three-dimensional images, are ignored when compressed
  696.     image data are provided or returned, as in the
  697.     EXT_texture_compression_s3tc extension.
  698.  
  699.     S3TC compression is not supported for one-dimensional texture targets in
  700.     EXT_texture_compression_s3tc, and is not supported for one-dimensional
  701.     array textures in this extension.  If compressed one-dimensional arrays
  702.     are needed, use a two-dimensional texture with a height of one.
  703.  
  704.     This extension allows the use of the four S3TC internal format types in
  705.     TexImage3D, CompressedTexImage3D, and CompressedTexSubImage3D calls.
  706.  
  707. Errors
  708.  
  709.     None
  710.  
  711. New State
  712.  
  713.     (add to table 6.15, p. 276)
  714.  
  715.                                                      Initial
  716.     Get Value                     Type   Get Command  Value Description           Sec.    Attribute
  717.     ----------------------------  -----  -----------  ----- --------------------  ------  ---------
  718.     TEXTURE_BINDING_1D_ARRAY_EXT  2*xZ+  GetIntegerv    0   texture object bound  3.8.12  texture
  719.                                                             to TEXTURE_1D_ARRAY
  720.     TEXTURE_BINDING_2D_ARRAY_EXT  2*xZ+  GetIntegerv    0   texture object bound  3.8.12  texture
  721.                                                             to TEXTURE_2D_ARRAY
  722.  
  723.  
  724. New Implementation Dependent State
  725.  
  726.     (add to Table 6.32, p. 293)
  727.  
  728.                                                     Minimum
  729.     Get Value                     Type  Get Command  Value  Description         Sec.  Attribute
  730.     ----------------------------  ----  ----------- ------- ------------------  ----- ---------
  731.     MAX_TEXTURE_ARRAY_LAYERS_EXT   Z+   GetIntegerv   64    maximum number of   3.8.1     -
  732.                                                             layers for texture
  733.                                                             arrays
  734.  
  735. Issues
  736.  
  737.     (1) Is "texture stack" a good name for this functionality?
  738.  
  739.         NO.  The name is changed to "array texture" to match the
  740.         nomenclature used by GL_EXT_texture_array.
  741.  
  742.     (2) Should the R texture coordinate be treated as normalized or
  743.     un-normalized?  If it were un-normalized, floor(R) could be thought
  744.     of as a direct index into the array texture.  This may be more
  745.     convenient for applications.
  746.  
  747.         RESOLVED.  All texture coordinates are normalized.  The issue of
  748.         un-normalized texture coordinates has been discussed in the ARB
  749.         before and should be left for a layered extension.
  750.  
  751.         RE-RESOLVED.  The R coordinate is un-normalized.  Accessing an array
  752.         using [0, layers-1] coordinates is much more natural.
  753.  
  754.     (3) How does LOD selection work for stacked textures?
  755.  
  756.         RESOLVED.  For 2D array textures the R coordinate is ignored, and
  757.         the LOD selection equations for 2D textures are used.  For 1D
  758.         array textures the T coordinate is ignored, and the LOD selection
  759.         equations for 1D textures are used.  The expected usage is in a
  760.         fragment program with an explicit LOD selection.
  761.  
  762.     (4) What is the maximum size of a 2D array texture?  Is it the same
  763.     as for a 3D texture, or should a new query be added?  How about for 1D
  764.     array textures?
  765.  
  766.         RESOLVED.  A new query is added.
  767.  
  768.     (5) How are array textures exposed in GLSL?
  769.    
  770.         RESOLVED.  Use GL_EXT_texture_array.
  771.        
  772.     (6) Should a 1D array texture also be exposed?
  773.  
  774.         RESOLVED.  For orthogonality, yes.
  775.  
  776.     (7) How are stacked textures attached to framebuffer objects?
  777.  
  778.         RESOLVED.  Layers of both one- and two-dimensional array textures
  779.         are attached using FreambufferTextureLayerEXT.  Once attached, the
  780.         array texture layer behaves exactly as either a one- or
  781.         two-dimensional texture.
  782.  
  783.     (8) How is this extension related to GL_EXT_texture_array?
  784.    
  785.         This extension adapats GL_MESAX_texture_stack to the notation,
  786.         indexing, and FBO access of GL_EXT_texture_array.  This extension
  787.         replaces the GLSL support of GL_EXT_texture_array with
  788.         GL_ARB_fragment_program support.
  789.  
  790.         Assembly program support is also provided by GL_NV_gpu_program4.
  791.         GL_NV_gpu_program4 also adds support for other features that are
  792.         specific to Nvidia hardware, while this extension adds only support
  793.         for array textures.
  794.  
  795.         Much of text of this extension that has changed since
  796.         GL_MESAX_texture_stack comes directly from either
  797.         GL_EXT_texture_array or GL_NV_gpu_program4.
  798.  
  799. Revision History
  800.  
  801.     ||2005/11/15||0.1||idr||Initial draft MESAX version.||
  802.     ||2005/12/07||0.2||idr||Added framebuffer object interactions.||
  803.     ||2005/12/12||0.3||idr||Updated fragment program interactions.||
  804.     ||2007/05/16||0.4||idr||Converted to MESA_texture_array.  Brought in line with EXT_texture_array and NV_gpu_program4.||
  805.