Name

    AMD_shader_image_load_store_lod

Name Strings

    GL_AMD_shader_image_load_store_lod

Contact

    Rex Xu, AMD (rex.xu 'at' amd.com)

Contributors

    Rex Xu, AMD
    Zhou Jin, AMD
    Qun Lin, AMD
    Daniel Rakos, AMD

Status

    Shipping.

Version

    Last Modified Date:         07/03/2017
    Author Revision:            2

Number

    513

Dependencies

    This extension is written against the OpenGL 4.5 (Core Profile)
    Specification.

    This extension is written against version 4.50 of the OpenGL Shading
    Language Specification.

    OpenGL 4.0 and GLSL 4.00 are required.

    This extension interacts with ARB_sparse_texture2.

Overview

    This extension was developed based on the ARB_shader_image_load_store
    extension to allow implementations supporting loads and stores on
    mipmap texture images.

New Procedures and Functions

    None.

New Tokens

    None.

Modifications to the OpenGL Shading Language Specification, Version 4.50

    Including the following line in a shader can be used to control the
    language features described in this extension:

        #extension GL_AMD_shader_image_load_store_lod : <behavior>

    where <behavior> is as specified in section 3.3.

    New preprocessor #defines are added to the OpenGL Shading Language:

        #define GL_AMD_shader_image_load_store_lod    1

Additions to Chapter 8 of the OpenGL Shading Language Specification (Built-in
Functions)

    Modify Section 8.12 Image Functions

    (insert a new paragraph, following the fourth paragraph on p. 179)

    ... "Texture Image Loads and Stores" of the OpenGL specification.

    Loads and stores could also be done on mipmap texture images with the
    level-of-detail specified explicitly. In such case, the IMAGE_LOD_PARAMS
    is used instead. Similar to IMAGE_PARAMS, the IMAGE_LOD_PARAMS in the
    prototypes below is a placeholder representing 21 separate functions, each
    for a different type of image variable. The IMAGE_LOD_PARAMS placeholder is
    replaced by one of the following parameter list:

        gimage1D image, int P, int lod
        gimage2D image, ivec2 P, int lod
        gimage3D image, ivec3 P, int lod
        gimageCube image, ivec3 P, int lod
        gimage1DArray image, ivec2 P, int lod
        gimage2DArray image, ivec3 P, int lod
        gimageCubeArray image, ivec3 P, int lod

    (insert new functions to the "Syntax" table cell of each image memory
     function group on p. 180-181)

    +-----------------------------------------+-------------------------------+
    | Syntax                                  | Description                   |
    +-----------------------------------------+-------------------------------+
    | gvec4 imageLoadLodAMD(readonly          | Loads the texel at the        |
    |                       IMAGE_LOD_PARAMS) | coordinate <P> from the image |
    |                                         | unit <image> (in              |
    |                                         | IMAGE_MIP_PARAMS). When       |
    |                                         | <image>, <P>, <lod> identify  |
    |                                         | a valid texel, the bits used  |
    |                                         | to represent the selected     |
    |                                         | texel in the memory are       |
    |                                         | converted to a vec4, ivec4,   |
    |                                         | uvec4 in the manner described |
    |                                         | in the section 8.25 "Texture  |
    |                                         | Image Loads and Stores" of    |
    |                                         | the OpenGL Specification and  |
    |                                         | returned.                     |
    +-----------------------------------------+-------------------------------+
    | void imageStoreLodAMD(writeonly         | Store <data> into the texel   |
    |                       IMAGE_LOD_PARAMS, | at the coordinate <P> from    |
    |                       gvec4 data)       | the image specified by        |
    |                                         | <image>. When <image>, <P>,   |
    |                                         | <lod> identify a valid texel, |
    |                                         | the bits used to represent    |
    |                                         | <data> are converted to the   |
    |                                         | format of the image unit in   |
    |                                         | the manner described in       |
    |                                         | section 8.25 "Texture Image   |
    |                                         | Loads and Stores" of the      |
    |                                         | OpenGL Specification and      |
    |                                         | stored to the specified texel.|
    +-----------------------------------------+-------------------------------+

Dependencies on ARB_sparse_texture2

    If the shader enables ARB_sparse_texture2, this extension adds additional
    image load functions.

    +-------------------------------------------------+-----------------------+
    | Syntax                                          | Description           |
    +-------------------------------------------------+-----------------------+
    | int sparseImageLoadLodAMD(gimage2D image,       | Loads a texel from    |
    |                           ivec2 P, int lod,     | the image <image> as  |
    |                           out gvec4 texel)      | in imageLoadLodAMD(), |
    | int sparseImageLoadLodAMD(gimage3D image,       | but return texture    |
    |                           ivec3 P, int lod,     | access residency      |
    |                           out gvec4 texel)      | information from the  |
    | int sparseImageLoadLodAMD(gimageCube image,     | function and the      |
    |                           ivec3 P, int lod,     | filtered lookup       |
    |                           out gvec4 texel)      | result in the out     |
    | int sparseImageLoadLodAMD(gimage2DArray image,  | parameter <texel>.    |
    |                           ivec3 P, int lod,     |                       |
    |                           out gvec4 texel)      |                       |
    | int sparseImageLoadLodAMD(gimageCuberray image, |                       |
    |                           ivec3 P, int lod,     |                       |
    |                           out gvec4 texel)      |                       |
    +-------------------------------------------------+-----------------------+

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Issues

    (1) What is the intention of this extension?

      RESOLVED: This extension is designed to support loads and stores on
      mipmap texture images with the level-of-detail specified explicitly.

Revision History

    Rev.  Date      Author    Changes
    ----  --------  --------  -------------------------------------------------
     2    07/03/17  rexu      Rename this extension and use suffix "lod" to
                              keep the consistency with existing texture and
                              image functions. Remove gimage2DRect and
                              gimageBuffer dimensions for these new built-in
                              functions in that they do not support mipmapping.

     1    06/30/17  rexu      Initial draft.
