Name

    NV_texture_rectangle

Name Strings

    GL_NV_texture_rectangle

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Notice

    Copyright NVIDIA Corporation, 2000, 2001, 2002, 2003, 2004.

Status

    Implemented in NVIDIA's Release 10 drivers.

Version

    NVIDIA Date: March 5, 2004

Number

    229

Dependencies

    Written based on the OpenGL 1.2.1 specification including
    ARB_texture_cube_map wording.

    IBM_mirrored_repeat affects the definition of this extension.

    ARB_texture_border_clamp affects the definition of this extension.

    EXT_paletted_texture affects the definition of this extension.

    This extension affects the definition of the NV_texture_shader
    extension.

Overview

    OpenGL texturing is limited to images with power-of-two dimensions
    and an optional 1-texel border.  NV_texture_rectangle extension
    adds a new texture target that supports 2D textures without requiring
    power-of-two dimensions.

    Non-power-of-two dimensioned textures are useful for storing
    video images that do not have power-of-two dimensions.  Re-sampling
    artifacts are avoided and less texture memory may be required by using
    non-power-of-two dimensioned textures.  Non-power-of-two dimensioned
    textures are also useful for shadow maps and window-space texturing.

    However, non-power-of-two dimensioned (NPOTD) textures have
    limitations that do not apply to power-of-two dimensioned (POT)
    textures.  NPOTD textures may not use mipmap filtering; POTD
    textures support both mipmapped and non-mipmapped filtering.
    NPOTD textures support only the GL_CLAMP, GL_CLAMP_TO_EDGE,
    and GL_CLAMP_TO_BORDER_ARB wrap modes; POTD textures support
    GL_CLAMP_TO_EDGE, GL_REPEAT, GL_CLAMP, GL_MIRRORED_REPEAT_IBM,
    and GL_CLAMP_TO_BORDER.  NPOTD textures do not support an optional
    1-texel border; POTD textures do support an optional 1-texel border.

    NPOTD textures are accessed by non-normalized texture coordinates.
    So instead of thinking of the texture image lying in a [0..1]x[0..1]
    range, the NPOTD texture image lies in a [0..w]x[0..h] range.

    This extension adds a new texture target and related state (proxy,
    binding, max texture size).

Issues

    Should rectangular textures simply be an extension to the 2D texture
    target that allows non-power-of-two widths and heights?

      RESOLUTION:  No.  The rectangular texture is an entirely new texture
      target type called GL_TEXTURE_RECTANGLE_NV.  This is because while
      the texture rectangle target relaxes the power-of-two dimensions
      requirements of the texture 2D target, it also has limitations
      such as the absence of both mipmapping and the GL_REPEAT and
      GL_MIRRORED_REPEAT_IBM wrap modes.  Additionally, rectangular
      textures do not use [0..1] normalized texture coordinates.

    How is the image of a rectangular texture specified?

      RESOLUTION:  Using the standard OpenGL API for specifying a 2D
      texture image: glTexImage2D, glSubTexImage2D, glCopyTexImage2D,
      and glCopySubTexImage2D.  The target for these commands is
      GL_TEXTURE_RECTANGLE_NV though.

      This is similar to how the ARB_texture_cube_map extension uses
      the 2D texture image specification API though with its own texture
      target.

    Should 3D textures be allowed to be NPOTD?
    
      RESOLUTION:  No.  That should be left to another extension.

    Should cube map textures be allowed to be NPOTD?

      RESOLUTION:  No.  Probably not particularly interesting for
      cube maps.  If it becomes important, another extension should
      provide NPOTD cube maps.

    Should 1D textures be allowed to be NPOTD?

      RESOLUTION:  No.  Rectangular textures are always considered 2D
      by this extension.  You can always simulate a 1D NPOTD textures
      by using a 2D Wx1 or 1xH dimensioned rectangular texture.

    Should anything be said about performance?

      RESOLUTION:  No, but developers should not be surprised if
      conventional POTD textures will render slightly faster than NPOTD
      textures.  This is particularly likely to be true when NPOTD
      textures are minified leading to texture cache thrashing.

    How are rectangular textures enabled?

      RESOLUTION:  Since rectangular textures add a new texture target,
      you enable rectangular textures by enabling this target.  Example:

        glEnable(GL_TEXTURE_RECTANGLE_NV);

    What is the priority of the rectangular texture target enable relative to
    existing texture enables?

      RESOLUTION:  The texture rectangle target is like a 2D texture in
      many ways so its enable priority is just above GL_TEXTURE_2D.  From
      lowest priority to highest priority: GL_TEXTURE_1D, GL_TEXTURE_2D,
      GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP_ARB.

    What is the default wrap state for a texture rectangle?

      RESOLUTION:  GL_CLAMP_TO_EDGE.  The normal default wrap state is
      GL_REPEAT, but that mode is not allowed for rectangular textures?

    What is the default minification filter for a texture rectangle?

      RESOLUTION:  GL_LINEAR.  The normal default minification filter
      state is GL_NEAREST_MIPMAP_LINEAR, but that mode is not allowed
      for rectangular textures because mipmapping is not supported.

    Do paletted textures work with rectangular textures?

      RESOLUTION:  No.  Similar (but not identical) functionality can
      be accomplished using dependent texture shader operations (see
      NV_texture_shader).

      The difference between paletted texture accesses and dependent
      texture accesses is that paletted texture lookups are
      "pre-filtering" while dependent texture shader operations are
      "post-filtering".

    Can compressed texture images be specified for a rectangular texture?

      RESOLUTION:  The generic texture compression internal formats
      introduced by ARB_texture_compression are supported for rectangular
      textures because the image is not presented as compressed data and
      the ARB_texture_compression extension always permits generic texture
      compression internal formats to be stored in uncompressed form.
      Implementations are free to support generic compression internal
      formats for rectangular textures if supported but such support is
      not required.

      This extensions makes a blanket statement that specific compressed
      internal formats for use with CompressedTexImage<n>DARB are NOT
      supported for rectangular textures.  This is because several
      existing hardware implementations of texture compression formats
      such as S3TC are not designed for compressing rectangular textures.
      This does not preclude future texture compression extensions from
      supporting compressed internal formats that do work with rectangular
      extensions (by relaxing the current blanket error condition).

    Does this extension work with SGIX_shadow-style shadow mapping?

      RESOLUTION:  Yes.  The one non-obvious allowance to support
      SGIX_shadow-style shadow mapping is that the R texture coordinate
      wrap mode remains UNCHANGED for rectangular textures.  Clamping of
      the R texture coordinate for rectangular textures uses the standard
      [0,1] interval rather than the [0,ws] or [0,hs] intervals as in
      the case of S and T.  This is because R represents a depth value
      in the [0,1] range whether using a 2D or rectangular texture.

New Procedures and Functions

    None

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, IsEnabled, and
    by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev, and by the <target> parameter of BindTexture,
    GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri,
    TexParameterfv, and TexParameteriv:

        TEXTURE_RECTANGLE_NV               0x84F5

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

        TEXTURE_BINDING_RECTANGLE_NV       0x84F6

    Accepted by the <target> parameter of GetTexImage,
    GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D,
    CopyTexImage2D, TexSubImage2D, and CopySubTexImage2D:

        TEXTURE_RECTANGLE_NV

    Accepted by the <target> parameter of GetTexLevelParameteriv,
    GetTexLevelParameterfv, GetTexParameteriv, and TexImage2D:

        PROXY_TEXTURE_RECTANGLE_NV          0x84F7 

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

        MAX_RECTANGLE_TEXTURE_SIZE_NV       0x84F8

Additions to Chapter 2 of the GL Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the GL Specification (Rasterization)

 --  Section 3.6.3 "Pixel Transfer Modes" under "Color Table
     Specification" or the ColorTableEXT description in the
     EXT_paletted_texture specification (rev 1.2)

     Add the following statement after introducing ColorTableEXT:

     "The error INVALID_ENUM is generated if the target to ColorTable (or
     ColorTableEXT or the various ColorTable and ColorTableEXT alternative
     commands) is TEXTURE_RECTANGLE_NV or PROXY_TEXTURE_RECTANGLE_NV."

 --  Section 3.8.1 "Texture Image Specification"

     Change the second sentence through the rest of the paragraph
     describing TexImage2D on page 116 to:

     "<target> must be one of TEXTURE_2D for a 2D texture, or one
     of TEXTURE_RECTANGLE_NV for a rectangle texture, or one of
     TEXTURE_CUBE_MAP_POSITIVE_X_ARB, TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, or TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
     for a cube map texture.  Additionally, <target> can be either
     PROXY_TEXTURE_2D for a 2D proxy texture or PROXY_TEXTURE_RECTANGLE_NV
     for a rectangle proxy texture or PROXY_TEXTURE_CUBE_MAP_ARB for a
     cube map proxy texture as discussed in section 3.8.7.
     The other parameters match the corresponding parameters of TexImage3D."

     Add a following paragraph reading:

     "Rectangular textures do not support paletted formats.  The error
     INVALID_ENUM is generated if the target is TEXTURE_RECTANGLE_NV
     or PROXY_TEXTURE_RECTANGLE_NV and the format is COLOR_INDEX or
     the internalformat is COLOR_INDEX or one of the COLOR_INDEX<n>_EXT
     internal formats."

     Change the 14th paragraph (page 116) to read:

     "In a similar fashion, the maximum allowable width of a rectangular
     texture image, and the maximum allowable height of a rectangular
     texture image, must be at least the implementation-dependent value
     of MAX_RECTANGLE_TEXTURE_SIZE_NV."

     Add the following paragraph after the paragraph introducing
     TexImage2D (page 116):

     "When the target is TEXTURE_RECTANGLE_NV, the INVALID_VALUE error is
     generated if border is any value other than zero or the level is any
     value other than zero.  Also when the target is TEXTURE_RECTANGLE_NV,
     the texture dimension restrictions specified by equations 3.11,
     3.12, and 3.13 are ignored; however, if the width is less than zero or
     the height is less than zero, the error INVALID_VALUE is generated.
     In the case of a rectangular texture, ws and hs equal the specified
     width and height respectively of the rectangular texture image
     while ds is 1."

     Amend the following paragraph that was added by the
     ARB_texture_cube_map specification after the first paragraph on
     page 117:

     "A 2D texture consists of a single 2D texture image.  A rectangle
     texture consists of a single 2D texture image.  A cube map texture
     is a set of six 2D texture images.  The six cube map texture
     targets form a single cube map texture though each target names
     a distinct face of the cube map.  The TEXTURE_CUBE_MAP_*_ARB
     targets listed above update their appropriate cube map face 2D
     texture image.  Note that the six cube map 2D image tokens such as
     TEXTURE_CUBE_MAP_POSITIVE_X_ARB are used when specifying, updating,
     or querying one of a cube map's six 2D image, but when enabling cube
     map texturing or binding to a cube map texture object (that is when
     the cube map is accessed as a whole as opposed to a particular 2D
     image), the TEXTURE_CUBE_MAP_ARB target is specified."

     Append to the end of the third to the last paragraph in the section
     (page 118):

     "A rectangular texture array has depth dt=1, with height ht and width
     wt defined by the specified image height and width parameters."

 --  Section 3.8.2 "Alternate Texture Image Specification Commands"

     Add TEXTURE_RECTANGLE_NV to the second paragraph (page 120) to say:

     ... "Currently, <target> must be TEXTURE_2D,
     TEXTURE_RECTANGLE_NV, TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
     TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
     TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
     or TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB." ...

     Add TEXTURE_RECTANGLE_NV to the fourth paragraph (page 121) to say:

     ... "Currently the target arguments of TexSubImage1D and
     CopyTexSubImage1D must be TEXTURE_1D, the <target> arguments of
     TexSubImage2D and CopyTexSubImage2D must be one of TEXTURE_2D,
     TEXTURE_RECTANGLE_NV, TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
     TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
     TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
     or TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, and the <target> arguments of
     TexSubImage3D and CopyTexSubImage3D must be TEXTURE_3D." ...

     Also add to the end of the fourth paragraph (121):

     "If target is TEXTURE_RECTANGLE_NV and level is not zero, the error
     INVALID_VALUE is generated."

 --  Section "Compressed Texture Images" in the ARB_texture_compression
     specification

     Add the following paragraph after introducing the
     CompressedTexImage<n>DARB commands:

     "The error INVALID_ENUM is generated if the target parameter to one
     of the CompressedTexImage<n>DARB commands is TEXTURE_RECTANGLE_NV."

     Add the following paragraph after introducing the
     CompressedTexSubImage<n>DARB commands:

     "The error INVALID_ENUM is generated if the target parameter
     to one of the CompressedTexSubImage<n>DARB commands is
     TEXTURE_RECTANGLE_NV."

 --  Section 3.8.3 "Texture Parameters"

     Add TEXTURE_RECTANGLE_NV to paragraph one (page 124) to say:

     ... "<target> is the target, either TEXTURE_1D, TEXTURE_2D,
     TEXTURE_RECTANGLE_NV, TEXTURE_3D, or TEXTURE_CUBE_MAP_ARB." ...

     Add the following paragraph to the end of the section (page 134):

     "Certain texture parameter values may not be specified for textures
     with a target of TEXTURE_RECTANGLE_NV.  The error INVALID_ENUM
     is generated if the target is TEXTURE_RECTANGLE_NV and the
     TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R parameter is set to
     REPEAT or MIRRORED_REPEAT_IBM.  The error INVALID_ENUM is generated
     if the target is TEXTURE_RECTANGLE_NV and the TEXTURE_MIN_FILTER is
     set to a value other than NEAREST or LINEAR (no mipmap filtering
     is permitted).  The error INVALID_ENUM is generated if the target
     is TEXTURE_RECTANGLE_NV and TEXTURE_BASE_LEVEL is set to any value
     other than zero."

 --  Section 3.8.4 "Texture Wrap Modes"

     Add this final additional paragraph:

     "Texture coordinates are clamped differently for rectangular
     textures.  The r texture coordinate is wrapped as described above (as
     required for shadow mapping to operate correctly).  When the texture
     target is TEXTURE_RECTANGLE_NV, the s and t coordinates are wrapped
     as follows: CLAMP causes the s coordinate to be clamped to the range
     [0,ws].  CLAMP causes the t coordinate to be clamped to the range
     [0,hs].  CLAMP_TO_EDGE causes the s coordinate to be clamped to
     the range [0.5,ws-0.5].  CLAMP_TO_EDGE causes the t coordinate
     to be clamped to the range [0.5,hs-0.5].  CLAMP_TO_BORDER_ARB
     causes the s coordinate to be clamped to the range [-0.5,ws+0.5].
     CLAMP_TO_BORDER_ARB causes the t coordinate to be clamped to the
     range [-0.5,hs+0.5]."

 --  Section 3.8.5 "Texture Minification" under "Mipmapping"

     Change the second full paragraph on page 126 to read:

     "For non-rectangular textures, let u(x,y) = 2^n*s(x,y), v(x,y) =
     2^m*t(x,y), and w(x,y) = 2^l*r(x,y), where n, m, and l are defined
     by equations 3.11, 3.12, and 3.13 with ws, hs, and ds equal to
     the width, height, and depth of the image array whose level is
     TEXTURE_BASE_LEVEL.  However, for rectangular textures let u(x,y)
     = s(x,y), v(x,y) = t(x,y), and w(x,y) = r(x,y)."

     Update the last sentence in the first full paragraph on page 127
     to read:

     "Depending on whether the texture's target is rectangular or
     non-rectangular, this means the texel at location (i,j,k) becomes
     the texture value, with i given by

              /  floor(u),    s < 1
             /
        i = {    2^n-1,       s == 1, non-rectangular texture    (3.17)
             \
              \  ws-1,        s == 1, rectangular texture

     (Recall that if TEXTURE_WRAP_S is REPEAT, then 0 <= s < 1.)  Similarly,
     j is found as

              /  floor(v),    t < 1
             /
        j = {    2^m-1,       t == 1, non-rectangular texture    (3.18)
             \
              \  hs-1,        t == 1, rectangular texture

     and k is found as

              /  floor(w),    r < 1
             /
        k = {    2^l-1,       r == 1, non-rectangular texture     (3.19)
             \  
              \  0,           r == 1, rectangular texture"

     Change the last sentence in the partial paragraph after equation
     3.19 to read:

     "For a two-dimensional or rectangular texture, k is irrelevant;
     the texel at location (i,j) becomes the texture value."

     Change the sentence preceding equation 3.20 (page 128) specifying
     how to compute the value tau for a two-dimensional texture to:

     "For a two-dimensional or rectangular texture,"

     Follow the first full paragraph on page 130 with:

     "Rectangular textures do not support mipmapping (it is an error to
     specify a minification filter that requires mipmapping)."

 --  Section 3.8.7 "Texture State and Proxy State"

     Change the first sentence of the first paragraph (page 131) to say:

     "The state necessary for texture can be divided into two categories.
     First, there are the ten sets of mipmap arrays (one each for the
     one-, two-, and three-dimensional texture targets, one for the
     rectangular texture target (though the rectangular texture target
     has only one mipmap level), and six for the cube map texture targets)
     and their number." ...

     Change the fourth and third to last sentences of the first paragraph
     to say:

     "In the initial state, the value assigned to TEXTURE_MIN_FILTER
     is NEAREST_MIPMAP_LINEAR, except for rectangular textures where
     the initial value is LINEAR, and the value for TEXTURE_MAG_FILTER
     is LINEAR.  s, t, and r warp modes are all set to REPEAT, except
     for rectangular textures where the initial value is CLAMP_TO_EDGE."

     Change the second paragraph (page 132) to say:

     "In addition to the one-, two-, three-dimensional, rectangular, and
     the six cube map sets of image arrays, the partially instantiated
     one-, two-, and three-dimensional, rectangular, and one cube map
     sets of proxy image arrays are maintained." ...

     Change the third paragraph (page 132) to:

     "One- and two-dimensional and rectangular proxy arrays are operated
     on in the same way when TexImage1D is executed with target specified
     as PROXY_TEXTURE_1D, or TexImage2D is executed with target specified
     as PROXY_TEXTURE_2D or PROXY_TEXTURE_RECTANGLE_NV."

     Change the second sentence of the fourth paragraph (page 132) to:

     "Therefore PROXY_TEXTURE_1D, PROXY_TEXTURE_2D,
     PROXY_TEXTURE_RECTANGLE_NV, PROXY_TEXTURE_3D, and
     PROXY_TEXTURE_CUBE_MAP_ARB cannot be used as textures, and their
     images must never be queried using GetTexImage." ...

 --  Section 3.8.8 "Texture Objects"

     Change the first sentence of the first paragraph (page 132) to say:

     "In addition to the default textures TEXTURE_1D, TEXTURE_2D,
     TEXTURE_RECTANGLE_NV, TEXTURE_3D, and TEXTURE_CUBE_MAP_ARB, named
     one-dimensional, two-dimensional, rectangular, and three-dimensional
     texture objects and cube map texture objects can be created and
     operated on." ...

     Change the second paragraph (page 132) to say:

     "A texture object is created by binding an unused name to
     TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D, or
     TEXTURE_CUBE_MAP_ARB." ...  "If the new texture object is bound
     to TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D, or
     TEXTURE_CUBE_MAP_ARB, it remains a one-dimensional, two-dimensional,
     rectangular, three-dimensional, or cube map texture until it is
     deleted."

     Change the third paragraph (page 133) to say:

     "BindTexture may also be used to bind an existing texture object
     to either TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D,
     or TEXTURE_CUBE_MAP_ARB."

     Change paragraph five (page 133) to say:

     "In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV,
     TEXTURE_3D, and TEXTURE_CUBE_MAP have one-dimensional,
     two-dimensional, rectangular, three-dimensional, and cube map state
     vectors associated with them respectively."  ...  "The initial,
     one-dimensional, two-dimensional, rectangular, three-dimensional, and
     cube map texture is therefore operated upon, queried, and applied
     as TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D,
     and TEXTURE_CUBE_MAP_ARB respectively while 0 is bound to the
     corresponding targets."

     Change paragraph six (page 133) to say:

     ... "If a texture that is currently bound to one of the targets
     TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D, or
     TEXTURE_CUBE_MAP_ARB is deleted, it is as though BindTexture has
     been executed with the same <target> and <texture> zero." ...

 --  Section 3.8.10 "Texture Application"

     Replace the beginning sentences of the first paragraph (page 138)
     with:

     "Texturing is enabled or disabled using the generic Enable and
     Disable commands, respectively, with the symbolic constants
     TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D,
     or TEXTURE_CUBE_MAP_ARB to enable the one-dimensional,
     two-dimensional, rectangular, three-dimensional, or cube map
     texturing respectively.  If both two- and one-dimensional textures
     are enabled, the two-dimensional texture is used.  If the rectangular
     and either of the two- or one-dimensional textures is enabled, the
     rectangular texture is used.  If the three-dimensional and any of the
     rectangular, two-dimensional, or one-dimensional textures is enabled,
     the three-dimensional texture is used.  If the cube map texture
     and any of the three-dimensional, rectangular, two-dimensional,
     or one-dimensional textures is enabled, then cube map texturing is
     used. 

Additions to Chapter 4 of the GL Specification (Per-Fragment Operations
and the Framebuffer)

    None

Additions to Chapter 5 of the GL Specification (Special Functions)

 --  Section 5.4 "Display Lists"

     In the first paragraph (page 179), add PROXY_TEXTURE_RECTANGLE_NV
     to the list of PROXY_* tokens.

Additions to Chapter 6 of the GL Specification (State and State Requests)

 --  Section 6.1.3 "Enumerated Queries"

     Change the fourth paragraph (page 183) to say:

     "The GetTexParameter parameter <target> may be one of
     TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D, or
     TEXTURE_CUBE_MAP_ARB, indicating the currently bound one-dimensional,
     two-dimensional, rectangular, three-dimensional, or cube map
     texture object.  For GetTexLevelParameter, <target> may be one
     of TEXTURE_1D, TEXTURE_2D, TEXTURE_RECTANGLE_NV, TEXTURE_3D,
     TEXTURE_CUBE_MAP_POSITIVE_X_ARB, TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
     PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_RECTANGLE_NV,
     PROXY_TEXTURE_3D, or PROXY_TEXTURE_CUBE_MAP_ARB, indicating the
     one-dimensional texture object, two-dimensional texture object,
     rectangular texture object, three-dimensional texture object, or one
     of the six distinct 2D images making up the cube map texture object
     or one-dimensional, two-dimensional, rectangular, three-dimensional,
     or cube map proxy state vector.  Note that TEXTURE_CUBE_MAP_ARB is
     not a valid <target> parameter for GetTexLevelParameter because it
     does not specify a particular cube map face."

 --  Section 6.1.4 "Texture Queries"

     Change the first paragraph (page 184) to read:

     ... "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
     indicates a one-dimensional texture, TEXTURE_2D indicates a
     two-dimensional texture, TEXTURE_RECTANGLE_NV indicates a rectangular
     texture, TEXTURE_3D indicates a three-dimensional texture, and
     TEXTURE_CUBE_MAP_POSITIVE_X_ARB, TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
     TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, and TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
     indicate the respective face of a cube map texture."

     Add a final sentence to the fourth paragraph:

     "Calling GetTexImage with a lod not zero when the tex is
     TEXTURE_RECTANGLE_NV causes the error INVALID_VALUE."

Additions to the GLX Specification

    None

GLX Protocol

    None

Dependencies on ARB_texture_border_clamp

    If ARB_texture_border_clamp is not supported, references to the
    CLAMP_TO_BORDER_ARB wrap mode in this document should be ignored.

Dependencies on IBM_mirrored_repeat

    If IBM_mirrored_repeat is not supported, references to the
    MIRRORED_REPEAT_IBM wrap mode in this document should be ignored.

Dependencies on EXT_paletted_texture

    If EXT_paletted_texture is not supported, references to the
    COLOR_INDEX, COLOR_INDEX<n>_EXT, ColorTable, and ColorTableEXT should
    be ignored.

Dependencies on EXT_texture_compression_s3tc

    If EXT_texture_compression_s3tc is not supported, references
    to CompressedTexImage2DARB and CompressedTexSubImageARB and the
    COMPRESSED_*_S3TC_DXT*_EXT enumerants should be ignored.

Errors

    INVALID_ENUM is generated when ColorTable (or ColorTableEXT or the
    various ColorTable and ColorTableEXT alternative commands) is called
    and the target is TEXTURE_RECTANGLE_NV or PROXY_TEXTURE_RECTANGLE_NV.

    INVALID_ENUM is generated when TexImage2D is called and the target
    is TEXTURE_RECTANGLE_NV or PROXY_TEXTURE_RECTANGLE_NV and the format
    is COLOR_INDEX or the internalformat is COLOR_INDEX or one of the
    COLOR_INDEX<n>_EXT internal formats.

    INVALID_VALUE is generated when TexImage2D is called when the target
    is TEXTURE_RECTANGLE_NV if border is any value other than zero or
    the level is any value other than zero.

    INVALID_VALUE is generated when TexImage2D is called when the target
    is TEXTURE_RECTANGLE_NV if the width is less than zero or the height
    is less than zero.

    INVALID_VALUE is generated when TexSubImage2D or CopyTexSubImage2D
    is called when the target is TEXTURE_RECTANGLE_NV if the level is
    any value other than zero.

    INVALID_ENUM is generated when one of the CompressedTexImage<n>DARB
    commands is called when the target parameter is TEXTURE_RECTANGLE_NV.

    INVALID_ENUM is generated when one of the CompressedTexSubImage<n>DARB
    commands is called when the target parameter is TEXTURE_RECTANGLE_NV.

    INVALID_ENUM is generated when TexParameter is called with a
    target of TEXTURE_RECTANGLE_NV and the TEXTURE_WRAP_S, TEXTURE_WRAP_T,
    or TEXTURE_WRAP_R parameter is set to REPEAT or MIRRORED_REPEAT_IBM.

    INVALID_ENUM is generated when TexParameter is called with a
    target of TEXTURE_RECTANGLE_NV and the TEXTURE_MIN_FILTER is set to
    a value other than NEAREST or LINEAR.

    INVALID_VALUE is generated when TexParameter is called with a
    target of TEXTURE_RECTANGLE_NV and the TEXTURE_BASE_LEVEL is set to
    any value other than zero.

    INVALID_VALUE is generated when GetTexImage is called with a lod
    not zero when the tex is TEXTURE_RECTANGLE_NV.

New State

(table 6.12, p202) amend/add the following entries:

Get Value                     Type  Get Command  Initial Value  Description            Sec     Attribute
----------------------------  ----  -----------  -------------  ---------------------  ------  --------------
TEXTURE_RECTANGULAR_NV        B     IsEnabled    False          True if rectangular    3.8.10  texture/enable
                                                                texturing is enabled
TEXTURE_BINDING_RECTANGLE_NV  Z+    GetIntegerv  0              Texture object         3.8.8   texture
                                                                for texture rectangle
TEXTURE_RECTANGLE_NV          I     GetTexImage  see 3.8        rectangular texture    3.8     -
                                                                image for lod 0


(table 6.13, p203) amend/add the following entries:

Get Value           Type   Get Command      Initial Value          Description           Sec    Attribute
------------------  -----  ---------------  ---------------------  --------------------  -----  ---------
TEXTURE_MIN_FILTER  2+xZ6  GetTexparameter  NEAREST_MIPMAP_LINEAR  Texture minification  3.8.5  texture
                                            except for             function
                                            rectangular which is
                                            LINEAR
TEXTURE_WRAP_S      5+xZ5  GetTexParameter  REPEAT except          Texture wrap mode S   3.8    texture
                                            for rectangular
                                            which is
                                            CLAMP_TO_EDGE
TEXTURE_WRAP_T      5+xZ5  GetTexParameter  REPEAT except          Texture wrap mode T   3.8    texture
                                            for rectangular
                                            which is
                                            CLAMP_TO_EDGE
TEXTURE_WRAP_R      5+xZ5  GetTexParameter  REPEAT except          Texture wrap mode R   3.8    texture
                                            for rectangular
                                            which is
                                            CLAMP_TO_EDGE

New Implementation Dependent State

(table 6.24, p214) add the following entry:

Get Value                      Type  Get Command  Minimum Value  Description          Sec    Attribute
-----------------------------  ----  -----------  -------------  -------------------  -----  ---------
MAX_RECTANGLE_TEXTURE_SIZE_NV  Z+    GetIntegerv  64             Maximum rectangular  3.8.1  -
                                                                 texture image
                                                                 dimension

Revision History

    Jan 2, 2003 - Fix typo in 4th paragraph of Overview to read: "NPOTD
    textures are accessed by non-normalized texture coordinates."

    March 5, 2004 - Delete update to the convolution section because
    it was bogus language in the OpenGL 1.2.1 specification saying
    convolution affects glGetTexImage (it does not); this language was
    deleted in OpenGL 1.3.  Fix minor typo in 6.12 table.
