Name

    ARB_texture_view

Name Strings

    GL_ARB_texture_view

Contact

    Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com)

Contributors

    Pat Brown, NVIDIA
    Daniel Koch, TransGaming
    Jon Leech

Notice

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

Status

    Complete.
    Approved by the ARB on 2012/06/12.

Version

    Last Modified Date: July 15, 2013
    Revision: 4

Number

    ARB Extension #124

Dependencies

    This extension is written against the OpenGL 4.2 Core profile 
    specification.

    ARB_texture_storage or OpenGL 4.2 is required.

    ARB_internalformat_query2 interacts with this extension.

    EXT_texture_compression_s3tc interacts with this extension.

    EXT_texture_sRGB interacts with this extension.

    ARB_texture_storage_multisample interacts with this extension.

Overview

    This extension allows a texture's data store to be "viewed" in multiple 
    ways, either reinterpreting the data format/type as a different format/
    type with the same element size, or by clamping the mipmap level range 
    or array slice range. 
    
    The goals of this extension are to avoid having these alternate views 
    become shared mutable containers of shared mutable objects, and to add 
    the views to the API in a minimally invasive way.

    No new object types are added. Conceptually, a texture object is split
    into the following parts:
    
        - A data store holding texel data.
        - State describing which portions of the data store to use, and how
          to interpret the data elements.
        - An embedded sampler object.
        - Various other texture parameters.

    With this extension, multiple textures can share a data store and have 
    different state describing which portions of the data store to use and how
    to interpret the data elements. The data store is refcounted and not 
    destroyed until the last texture sharing it is deleted.

    This extension leverages the ARB_texture_storage concept of an "immutable 
    texture". Views can only be created of textures created with TexStorage.


New Procedures and Functions

    void TextureView(uint texture, enum target, uint origtexture, 
                     enum internalformat,
                     uint minlevel, uint numlevels, 
                     uint minlayer, uint numlayers);

New Tokens

    Accepted by the <pname> parameters of GetTexParameterfv and 
    GetTexParameteriv:

        TEXTURE_VIEW_MIN_LEVEL                          0x82DB
        TEXTURE_VIEW_NUM_LEVELS                         0x82DC
        TEXTURE_VIEW_MIN_LAYER                          0x82DD
        TEXTURE_VIEW_NUM_LAYERS                         0x82DE
        TEXTURE_IMMUTABLE_LEVELS                        0x82DF

    Used as compatibility class names in table 3.X.2 (see the "Interactions
    with ARB_internalformat_query2" section below).

        VIEW_CLASS_128_BITS                             
        VIEW_CLASS_96_BITS                              
        VIEW_CLASS_64_BITS                              
        VIEW_CLASS_48_BITS                              
        VIEW_CLASS_32_BITS                              
        VIEW_CLASS_24_BITS                              
        VIEW_CLASS_16_BITS                              
        VIEW_CLASS_8_BITS                               
        VIEW_CLASS_S3TC_DXT1_RGB                        
        VIEW_CLASS_S3TC_DXT1_RGBA                       
        VIEW_CLASS_S3TC_DXT3_RGBA                       
        VIEW_CLASS_S3TC_DXT5_RGBA                       
        VIEW_CLASS_RGTC1_RED                            
        VIEW_CLASS_RGTC2_RG                             
        VIEW_CLASS_BPTC_UNORM                           
        VIEW_CLASS_BPTC_FLOAT                           


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

    None.

Additions to Chapter 3 of the OpenGL 4.2 Specification (Rasterization)

    Modify subsection 3.9.8 (Texture Parameters)

    Add the following to the end of the paragraph on p. 240:

    If the texture was created with TextureView, then the TEXTURE_BASE_LEVEL
    and TEXTURE_MAX_LEVEL parameters are interpreted relative to the view and 
    not relative to the original data store.

    Modify subsection 3.9.15 (Texture State and Proxy State)

    Add to the second paragraph on p. 256:

    The values of TEXTURE_IMMUTABLE_LEVELS, TEXTURE_VIEW_MIN_LEVEL,
    TEXTURE_VIEW_NUM_LEVELS, TEXTURE_VIEW_MIN_LAYER, TEXTURE_VIEW_NUM_LAYERS
    are 0.

    Modify subsection 3.9.16 (Immutable-Format Texture Images)

    Modify the second to last bullet on p. 258:

    If the command is successful, TEXTURE_IMMUTABLE_FORMAT becomes TRUE, 
    TEXTURE_IMMUTABLE_LEVELS and TEXTURE_VIEW_NUM_LEVELS become <levels>.
    If the texture target is TEXTURE_1D_ARRAY then TEXTURE_VIEW_NUM_LAYERS 
    becomes <height>. If the texture target is TEXTURE_2D_ARRAY, 
    TEXTURE_CUBE_MAP_ARRAY, or TEXTURE_2D_MULTISAMPLE_ARRAY then 
    TEXTURE_VIEW_NUM_LAYERS becomes <depth>. If the texture target is 
    TEXTURE_CUBE_MAP, then TEXTURE_VIEW_NUM_LAYERS becomes 6. For any other
    texture target, TEXTURE_VIEW_NUM_LAYERS becomes 1.

    Add a new subsection at the end of 3.9 (Texturing)

    3.9.X  Texture Views

    A texture can be created which references the data store of another texture
    and interprets the data with a different format, and/or selects a subset of
    the levels and/or layers of the other texture. The data store for such a 
    texture is shared with the data store of the original texture.  Updating 
    the shared data store using the original texture affects texture values read
    using the new texture, and vice versa.  A texture data store remains in 
    existence until all textures that reference it are deleted.

    The command:

        void TextureView(uint texture, enum target, uint origtexture, 
                         enum internalformat,
                         uint minlevel, uint numlevels, 
                         uint minlayer, uint numlayers);
    
    initializes the texture named <texture> to the target specified by
    <target>. <texture>'s data store is inherited from the texture named 
    <origtexture>, but elements of the data store are interpreted according 
    to the internal format specified by <internalformat>. Additionally, if the
    original texture is an array or has multiple mipmap levels, the parameters 
    <minlayer>, <numlayers>, <minlevel>, and <numlevels> control which of those 
    slices and levels are considered part of the texture.

    The <minlevel> and <minlayer> parameters are relative to the view of the 
    original texture. If <numlayers> or <numlevels> extend beyond the original 
    texture, they are clamped to the max extent of the original texture. If 
    <minlevel> or <minlayer> are larger than the greatest level or layer of the 
    original texture, the error INVALID_VALUE is generated.

    If the command is successful, the texture parameters in <texture> are 
    updated as follows:
    
     - TEXTURE_IMMUTABLE_FORMAT is set to TRUE.

     - TEXTURE_IMMUTABLE_LEVELS is set to the value of TEXTURE_IMMUTABLE_LEVELS 
       from the original texture.

     - TEXTURE_VIEW_MIN_LEVEL is set to <minlevel> plus the value of 
       TEXTURE_VIEW_MIN_LEVEL from the original texture.

     - TEXTURE_VIEW_MIN_LAYER is set to <minlayer> plus the value of 
       TEXTURE_VIEW_MIN_LAYER from the original texture.

     - TEXTURE_VIEW_NUM_LEVELS is set to the lesser of <numlevels> and the 
       value of TEXTURE_VIEW_NUM_LEVELS from the original texture minus 
       <minlevels>.

     - TEXTURE_VIEW_NUM_LAYERS is set to the lesser of <numlayers> and the 
       value of TEXTURE_VIEW_NUM_LAYERS from the original texture minus 
       <minlayer>.

    The new texture's target must be "compatible" with the target of the 
    original texture, or else an INVALID_OPERATION error is generated. 
    Compatibility is defined by Table 3.X.1:

        ---------------------------------------------------------------------------------------------------------
        | Original target             |  Valid new targets                                                      |
        ---------------------------------------------------------------------------------------------------------
        | TEXTURE_1D                  |  TEXTURE_1D, TEXTURE_1D_ARRAY                                           |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_2D                  |  TEXTURE_2D, TEXTURE_2D_ARRAY                                           |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_3D                  |  TEXTURE_3D                                                             |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_CUBE_MAP            |  TEXTURE_CUBE_MAP, TEXTURE_2D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_RECTANGLE           |  TEXTURE_RECTANGLE                                                      |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_BUFFER              |  <none>                                                                 |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_1D_ARRAY            |  TEXTURE_1D_ARRAY, TEXTURE_1D                                           |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_2D_ARRAY            |  TEXTURE_2D_ARRAY, TEXTURE_2D, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_CUBE_MAP_ARRAY      |  TEXTURE_CUBE_MAP_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_2D, TEXTURE_CUBE_MAP |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_2D_MULTISAMPLE      |  TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY                   |
        |-------------------------------------------------------------------------------------------------------|
        | TEXTURE_2D_MULTISAMPLE_ARRAY|  TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY                   |
        ---------------------------------------------------------------------------------------------------------
        
        Table 3.X.1: Legal texture targets for TextureView.

    If the new texture's target is TEXTURE_CUBE_MAP, the clamped <numlayers> 
    must be equal to 6. If the new texture's target is TEXTURE_CUBE_MAP_ARRAY, 
    then <numlayers> counts layer-faces rather than layers, and the clamped 
    <numlayers> must be a multiple of 6. Otherwise, the error INVALID_VALUE is
    generated. If the new texture's target is TEXTURE_CUBE_MAP or 
    TEXTURE_CUBE_MAP_ARRAY, the width and height of the original texture's 
    levels must be equal otherwise the error INVALID_OPERATION is generated.

    When the original texture's target is TEXTURE_CUBE_MAP, the layer 
    parameters are interpreted in the same order as if it were a 
    TEXTURE_CUBE_MAP_ARRAY with 6 layer-faces. 

    If <target> is TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_RECTANGLE, or 
    TEXTURE_2D_MULTISAMPLE and <numlayers> does not equal 1, the error
    INVALID_VALUE is generated.

    If the dimensions of the original texture are larger than the maximum 
    supported dimensions of the new target, the error INVALID_OPERATION is 
    generated. For example, if the original texture has a TEXTURE_2D_ARRAY 
    target and its width is greater than MAX_CUBE_MAP_TEXTURE_SIZE, an error 
    will be generated if TextureView is called to create a TEXTURE_CUBE_MAP 
    view.

    The two textures' internal formats must be compatible according to Table 
    3.X.2 (Compatible internal formats for TextureView) if the internal format
    exists in that table and the internal formats must be identical if not in 
    that table, or else an INVALID_OPERATION error is generated.

    ---------------------------------------------------------------------------
    | Class                 | Internal formats                                | 
    ---------------------------------------------------------------------------
    | VIEW_CLASS_128_BITS   | RGBA32F, RGBA32UI, RGBA32I                      |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_96_BITS    | RGB32F, RGB32UI, RGB32I                         |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_64_BITS    | RGBA16F, RG32F, RGBA16UI, RG32UI, RGBA16I,      |
    |                       | RG32I, RGBA16, RGBA16_SNORM                     |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_48_BITS    | RGB16, RGB16_SNORM, RGB16F, RGB16UI, RGB16I     |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_32_BITS    | RG16F, R11F_G11F_B10F, R32F,                    |
    |                       | RGB10_A2UI, RGBA8UI, RG16UI, R32UI,             |
    |                       | RGBA8I, RG16I, R32I, RGB10_A2, RGBA8, RG16,     |
    |                       | RGBA8_SNORM, RG16_SNORM, SRGB8_ALPHA8, RGB9_E5  |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_24_BITS    | RGB8, RGB8_SNORM, SRGB8, RGB8UI, RGB8I          |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_16_BITS    | R16F, RG8UI, R16UI, RG8I, R16I, RG8, R16,       |
    |                       | RG8_SNORM, R16_SNORM                            |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_8_BITS     | R8UI, R8I, R8, R8_SNORM                         |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_RGTC1_RED  | COMPRESSED_RED_RGTC1,                           |
    |                       | COMPRESSED_SIGNED_RED_RGTC1                     |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_RGTC2_RG   | COMPRESSED_RG_RGTC2,                            |
    |                       | COMPRESSED_SIGNED_RG_RGTC2                      |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_BPTC_UNORM | COMPRESSED_RGBA_BPTC_UNORM,                     |
    |                       | COMPRESSED_SRGB_ALPHA_BPTC_UNORM                |
    ---------------------------------------------------------------------------
    | VIEW_CLASS_BPTC_FLOAT | COMPRESSED_RGB_BPTC_SIGNED_FLOAT,               |
    |                       | COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT              |
    ---------------------------------------------------------------------------

        Table 3.X.2: Compatible internal formats for TextureView. Formats in 
        the same entry may be cast to each other.

    If the internal format does not exactly match the internal format of the 
    original texture, the contents of the memory are reinterpreted in the same
    manner as for image bindings described in section 3.9.20 (Texture Image 
    Loads and Stores).

    If <texture> has already been bound and given a target, then the error
    INVALID_OPERATION is generated. If <texture> is 0, INVALID_VALUE is
    generated. If <texture> is not a valid name returned by GenTextures, the
    error INVALID_OPERATION is generated.

    If <origtexture> is not the name of a texture, INVALID_VALUE is generated. 
    If <origtexture>'s TEXTURE_IMMUTABLE_FORMAT value is not TRUE, 
    INVALID_OPERATION is generated. 

    Texture commands that take a <level> or <layer> parameter, such as 
    TexSubImage2D, interpret that parameter to be relative to the view of the 
    texture. i.e. the mipmap level of the data store that would be updated via 
    TexSubImage2D would be the sum of <level> and the value of 
    TEXTURE_VIEW_MIN_LEVEL.


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

    None.

Additions to Chapter 5 of the OpenGL 4.2 Specification (Special Functions)

    None.

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

    Modify subsection 6.1.3 (Enumerated Queries)

    Modify the paragraph after GetTexParameter on p. 350:

    ... <value> must be IMAGE_FORMAT_COMPATIBILITY_TYPE, 
    TEXTURE_IMMUTABLE_FORMAT, TEXTURE_VIEW_MIN_LEVEL,
    TEXTURE_VIEW_NUM_LEVELS, TEXTURE_VIEW_MIN_LAYER, 
    TEXTURE_VIEW_NUM_LAYERS, or TEXTURE_IMMUTABLE_LEVELS.

Additions to Appendix D of the OpenGL 4.2 Specification (Shared Objects and
Multiple Contexts)

    Modify section D.3 (Propagating Changes to Objects) 

    Modify the second bullet point on p 461:

      - The contents of the data stores of textures and renderbuffers.

    Add the following sentence to the paragraph that begins "When the contents
    of an object <T>":

    When <T> is a texture, "the contents of an object <T>" should be construed
    to include the contents of the data store of <T>, even if <T>'s data store
    was modified via a different view of the data store.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    TBD

Dependencies on EXT_texture_compression_s3tc

    If EXT_texture_compression_s3tc and EXT_texture_sRGB are supported, then
    Table 3.X.2 is updated to add the following rows:

    -------------------------------------------------------------------
    | Class                     | Internal formats                    |
    -------------------------------------------------------------------
    | VIEW_CLASS_S3TC_DXT1_RGB  | COMPRESSED_RGB_S3TC_DXT1_EXT,       |
    |                           | COMPRESSED_SRGB_S3TC_DXT1_EXT       |
    -------------------------------------------------------------------
    | VIEW_CLASS_S3TC_DXT1_RGBA | COMPRESSED_RGBA_S3TC_DXT1_EXT,      |
    |                           | COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT |
    -------------------------------------------------------------------
    | VIEW_CLASS_S3TC_DXT3_RGBA | COMPRESSED_RGBA_S3TC_DXT3_EXT,      |
    |                           | COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT |
    -------------------------------------------------------------------
    | VIEW_CLASS_S3TC_DXT5_RGBA | COMPRESSED_RGBA_S3TC_DXT5_EXT,      |
    |                           | COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT |
    -------------------------------------------------------------------

Interactions with ARB_internalformat_query2

    The VIEW_CLASS_* tokens used as compatibility class names in table 3.X.2
    are the same tokens returned by the VIEW_COMPATIBILITY_CLASS query in
    ARB_internalformat_query2. In this extension they are simply a labelling
    mechanism and serve no functional purpose in the API, so their numeric
    values are not specified.

Dependencies on ARB_texture_storage_multisample

    Views are only supported for textures created by TexStorage. The original 
    ARB_texture_storage extension did not include TexStorage commands for 
    multisample textures. These are added by ARB_texture_storage_multisample, 
    so without that extension multisample textures cannot be used with views.

Errors

    TODO

New State

    Changes to table 6.16, p. 277 (Texture, state per texture object)

                                                     Initial
    Get Value                Type   Get Command      Value    Description                   Sec.      Attribute
    ---------                ----   -----------      -------  -----------                   ----      ---------
    TEXTURE_VIEW_MIN_LEVEL    Z+    GetTexParameter  0        view base texture level       3.9.X     texture
    TEXTURE_VIEW_NUM_LEVELS   Z+    GetTexParameter  0        view number of texture levels 3.9.X     texture
    TEXTURE_VIEW_MIN_LAYER    Z+    GetTexParameter  0        view min array layer          3.9.X     texture
    TEXTURE_VIEW_NUM_LAYERS   Z+    GetTexParameter  0        view number of array layers   3.9.X     texture
    TEXTURE_IMMUTABLE_LEVELS  Z+    GetTexParameter  0        storage number of levels      3.9.X     texture

New Implementation Dependent State

    None.

Examples

    TODO

Issues

    (1) What internal formats can be cast to what other formats?

    RESOLVED: In general, we try to follow the precedent from 
    ARB_shader_image_load_store where formats with the same element size can
    be cast to each other. Some specific issues with that:

     - Depth formats cannot be cast to other formats. D3D1x handles depth
       formats differently than GL, depth formats are not texturable and
       instead there are equivalent "RG" formats for each depth format. In GL,
       depth formats are all texturable and we don't have equivalent RG 
       formats for most of them (we only have R32F and R16). Since these can
       be textured from in GL, there's no great need to cast them.

     - Compressed formats can only be cast to other compressed formats with
       nearly identical encodings. Only the sRGB/signed-ness can change. See 
       also issue (10).

     - RGB formats cannot be cast to/from RGBA. For the case of RGBA->RGB, 
       the same can be accomplished using ARB_texture_swizzle. For the case
       of RGB->RGBA, an RGB texture may have been allocated without storage
       for alpha bits so this needs to be disallowed.

    (2) Should TEXTURE_IMMUTABLE_FORMAT be renamed?

    ARB_texture_storage isn't really about the format being immutable, it's 
    more about the data store not needing to be reallocated. This extension 
    allows interpreting the data store with a different format, so this enum
    now feels poorly named.

    RESOLVED: Leave it as is.

    (3) Is it possible to create a texture view using an original texture
    which is itself a view? And if so, how are the level/layer values 
    interpreted?

    RESOLVED: It is legal. For example, let's say texture 1 is a 2D_ARRAY
    texture with 200 layers. It will have TEXTURE_VIEW_MIN_LAYER=0, 
    TEXTURE_VIEW_NUM_LAYERS=200. Then we create texture 2 from texture 1 using 
    <minlayer>=100, <numlayers>=100. It will have TEXTURE_VIEW_MIN_LAYER=100, 
    TEXTURE_VIEW_NUM_LAYERS=100. Then we create texture 3 from texture 2 using
    <minlayer>=50, <numlayers>=50. It will have TEXTURE_VIEW_MIN_LAYER=150, 
    TEXTURE_VIEW_NUM_LAYERS=50.

    (4) Should we allow views of textures not created through TexStorage?

    RESOLVED: No. It might be possible, but if TexImage is called on a texture
    whose data store is shared it would likely require orphaning the old data
    store and creating/copying to a new data store. That's not desirable.

    (5) How are TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL interpreted if 
    TEXTURE_VIEW_MIN_LEVEL is non-zero?

    RESOLVED: The intent is that TEXTURE_BASE_LEVEL is relative to the view,
    i.e. the base level is TEXTURE_BASE_LEVEL+TEXTURE_VIEW_MIN_LEVEL relative
    to the data store.

    (6) Do we need any new "typeless" formats?

    RESOLVED: No. Any "compatible" format can be used in place of a typeless
    format.

    (7) Why aren't BUFFER textures supported?

    RESOLVED: The same can be accomplished with the contemporaneous 
    GL_ARB_texture_buffer_range extension.

    (8) This extension requires TEXTURE_IMMUTABLE_FORMAT to be TRUE,
    but we don't have TexStorage*Multisample. Should we add these 
    commands, or not require immutable format?

    RESOLVED: Add TexStorage*Multisample. This is done by
    ARB_texture_storage_multisample.

    (9) Should it be possible to create a 2D view from a RECTANGLE texture
    or vice versa?

    RESOLVED: No. These targets may have different max dimensions, or may be 
    allocated in memory with different tiling/swizzling.

    (10) Should it be possible to view a compressed texture in such a way
    that a block of the compressed view corresponds to a texel of an 
    uncompressed view? For example, taking a 256x256 DXT1 texture and viewing
    it as a 64x64 RG32UI texture?

    RESOLVED: No. The different mipmap stack sizes would be a problem, and 
    it's unclear whether all hardware could support this. Maybe a future 
    extension could enable this, but only allowing the view to have a single
    level?

    (11) Interaction between TEXTURE_IMMUTABLE_LEVELS and View textures?

    RESOLVED: There are several new TexParameter queries, and the values they
    return depend on how the texture was created:

      - If the texture is in its initial state or the data store was created 
        with TexImage, then all five new parameters are zero.

      - If the texture was created with TexStorage, then the parameters take 
        their values from the arguments, with both MIN parameters being zero,
        both LEVELS parameters being <levels>, and NUM_LAYERS being the number
        of layers if it's an array texture.

      - If the texture was created with TextureView, then the VIEW parameters
        describe the texture's subset of the entire data store, and 
        IMMUTABLE_LEVELS is inherited from the original texture.

    (12) Are uses of two different views of the same data store automatically
    coherent?

    RESOLVED: Yes, to the extent that they were for a single texture. A few 
    examples of this are:

      - TexSubImage to view A followed by texturing from view B.

      - Rendering to view A attached to an FBO followed by texturing from
        view B.

      - Shader image stores to view A followed by texturing from view B.

    The first two cases would automatically work correctly if A and B were
    the same texture, as described in Appendix D, so they continue to work
    with separate views. If an implementation were (for example) tracking
    uses of the texture to do cache invalidations, it should do such 
    tracking on the data store instead. 

    The third case would not automatically work if A and B were the same
    texture, instead requiring a MemoryBarrier call to force coherency. This
    same solution applies with texture views.

    (13) Are interactions with ETC2/EAC compressed texture formats defined?

    RESOLVED: No. It is likely that these formats are emulated with
    uncompressed internal formats on older hardware, and the resulting
    complications make defining texture view classes for these formats too
    difficult for too little functionality.


Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
      5   10/08/13  Jon Leech Add issue 13 discussing why ETC2/EAC view
                              classes aren't supported (Bug 11011).
      4   07/15/13  Jon Leech Change "Class" column of table 3.X.2 from
                              abstract names to VIEW_CLASS_* enums from
                              ARB_internalformat_query2 (Bug 10518).
      3   08/13/12  Jon Leech Renumbered from #142 to #124
      2   05/07/12  dgkoch    Added class names to Table 3.X.2
      1             jbolz     Internal revisions.
