Name

    ARB_texture_mirror_clamp_to_edge

Name Strings

    GL_ARB_texture_mirror_clamp_to_edge

Contact

    Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com)

Contributors

    Contributors to ATI_texture_mirror_once
    Contributors to EXT_texture_mirror_clamp
    Ian Romanick, Intel
    Members of the ARB working group

Notice

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

Status

    Complete. Approved by the ARB on June 3, 2013.
    Ratified by the Khronos Board of Promoters on July 19, 2013.

Version

    Last Modified Date: April 22, 2013
    Revision 4

Number

    ARB Extension #149

Dependencies

    OpenGL 1.4 is required.

    This extension is written against the OpenGL 4.3 (Core Profile)
    Specification (October 18, 2012).

    This extension interacts with EXT_texture3D.

    This extension interacts with ARB_texture_rectangle.

    This extension interacts with ARB_sampler_objects.

Overview

    ARB_texture_mirror_clamp_to_edge extends the set of texture wrap modes to
    include an additional mode (GL_MIRROR_CLAMP_TO_EDGE) that effectively uses
    a texture map twice as large as the original image in which the additional
    half of the new image is a mirror image of the original image.

    This new mode relaxes the need to generate images whose opposite edges
    match by using the original image to generate a matching "mirror image".
    This mode allows the texture to be mirrored only once in the negative
    s, t, and r directions.

New Procedure and Functions

    None

New Tokens

    Accepted by the <param> parameter of TexParameter{if}, SamplerParameter{if}
    and SamplerParameter{if}v, and by the <params> parameter of
    TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when
    their <pname> parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or
    TEXTURE_WRAP_R:

        MIRROR_CLAMP_TO_EDGE      0x8743 (same value as MIRROR_CLAMP_TO_EDGE_ATI/EXT)

Additions to Chapter 8 if the OpenGL 4.3 (Core Profile) Specification
(Textures and Samplers)

  In section 8.2 (Sampler Objects) modify the second sentence of the
  sixth paragraph (reading "For example, if..") to read as follows:

    "For example, if TEXTURE_WRAP_S or TEXTURE_WRAP_T is set to REPEAT,
    MIRRORED_REPEAT, or MIRROR_CLAMP_TO_EDGE on the sampler object bound
    to a texture unit and the texture bond to that unit is a rectangle
    texture, the texture will be considered incomplete."

  In section 8.10 (Texture Parameters) modify the table entries for Table 8.16
  (Texture parameters and their values) for TEXTURE_WRAP_S, TEXTURE_WRAP_T,
  and TEXTURE_WRAP_R and add the following to the "Legal Values" column:

    Name             Type   Legal Values
    ---------------  ----   ------------
    TEXTURE_WRAP_S   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE
    TEXTURE_WRAP_T   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE
    TEXTURE_WRAP_R   enum   (.. as before)
                            MIRROR_CLAMP_TO_EDGE

  In section 8.14.2 (Coordinate Wrapping and Texel Selection) add the
  following row to Table 8.19 (Texel location wrap mode application):

    Wrap mode                Result of wrap(coord)
    ---------                ---------------------
    (previous entries..)
    MIRROR_CLAMP_TO_EDGE     min(1-1/(2*size), max(1/(2*size), abs(coord)))

Additions to the GLX Specification

    None

GLX Protocol

    None

Errors

    The error INVALID_ENUM is generated when TexParameter* is called
    with a target of TEXTURE_RECTANGLE and the TEXTURE_WRAP_S,
    TEXTURE_WRAP_T, or TEXTURE_WRAP_R parameter is set to REPEAT,
    MIRRORED_REPEAT, or MIRROR_CLAMP_TO_EDGE.

Dependencies on EXT_texture3D or equivalent

    If EXT_texture3D or equivalent functionality is not implemented,
    then the references to clamping of 3D textures in this file are
    invalid, and references to TEXTURE_WRAP_R should be ignored.

Dependencies on ARB_texture_rectangle or equivalent

    If ARB_texture_rectangle or equivalent functionality is not
    implemented, then ignore all references to rectangle textures.

Dependencies on ARB_sampler_objects or equivalent

    If ARB_sampler_objects or equivalent functionality is not supported,
    then ignore all references to sampler objects and SamplerParameter*
    functions.

New State

    Only the type information changes for these parameters:

    Update Table 23.14 (Textures - state per texture object)
    Get Value           Get Command       Type    Initial Value  (...)
    ---------           -----------       ----    -------------
    TEXTURE_WRAP_S      GetTexParameter   n x Z5  see sec 8.21   (...)
    TEXTURE_WRAP_T      GetTexParameter   n x Z5  see sec 8.21   (...)
    TEXTURE_WRAP_R      GetTexParameter   n x Z5  see sec 8.21   (...)

    Update Table 23.18 (Textures - state per sampler object)
    Get Value           Get Command             Type    Initial Value  (...)
    ---------           -----------             ----    -------------
    TEXTURE_WRAP_S      GetSamplerParameteriv   n x Z5  see sec 8.21   (...)
    TEXTURE_WRAP_T      GetSamplerParameteriv   n x Z5  see sec 8.21   (...)
    TEXTURE_WRAP_R      GetSamplerParameteriv   n x Z5  see sec 8.21   (...)

New Implementation Dependent State

    None

Issues

    1. Should we include MIRROR_CLAMP for compatibility profiles?
    What about MIRROR_CLAMP_TO_BORDER? (And more importantly can all
    vendors support it?)

    RESOLVED. No. Some vendors stated that they can't support
    MIRROR_CLAMP_TO_BORDER and MIRROR_CLAMP (although it's not clear if
    they'd ever ship a compatibility profile with this extension), but
    regardless we'll leave them out of this extension.

Revision History

    Revision 4, April 22, 2013 (Daniel Koch)
    - fix interactions and remove ARB suffixes
    Revision 3, April 21, 2013 (Daniel Koch)
    - formatting, updates to Table 23.14
    Revision 2, March 19, 2013 (Daniel Koch)
    - remove MIRROR_CLAMP functionality and rename extension
    Revision 1, January 20, 2013 (Daniel Koch)
    - Initial ARB version based on ATI_texture_mirror_once and
      EXT_texture_mirror_clamp.
    Revision 0.9, January 3, 2013 (Ian Romanick)
    - Add interactions with OpenGL contexts that have removed GL_CLAMP
      and friends.
