Name

    ARB_shader_image_size

Name Strings

    GL_ARB_shader_image_size

Contact

    Christophe Riccio, AMD (christophe.riccio@amd.com)

Contributors

    Jeannot Breton, NVIDIA
    
Notice

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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

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

Version

    Last Modified Date: July 19, 2012
    Revision: 3

Number

    ARB Extension #136

Dependencies

    OpenGL 4.2 is required.

    OpenGL Shading Language 4.20 is required

    This extension is written against the OpenGL 4.2 specification and 
    version 4.20 of the OpenGL Shading Language Specification.

    This extension interacts with NV_gpu_program5 and 
    EXT_shader_image_load_store.
    
Overview
    This extension provides GLSL built-in functions allowing shaders to query
    the size of an image.

New Procedures and Functions

    None.

New Tokens

    None.

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

    None.

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

    None.

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

    None.

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

    None.

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

    None.

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Modifications to The OpenGL Shading Language Specification, Version 4.20.11

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

      #extension GL_ARB_shader_image_size

    A new preprocessor #define is added to the OpenGL Shading Language:

      #define GL_ARB_shader_image_size 1

    Add to section 8.11 "Image Functions"

    Syntax:
      int imageSize(gimage1D image)
      ivec2 imageSize(gimage2D image)
      ivec3 imageSize(gimage3D image)
      ivec2 imageSize(gimageCube image)
      ivec3 imageSize(gimageCubeArray image)
      ivec2 imageSize(gimageRect image)
      ivec2 imageSize(gimage1DArray image)
      ivec3 imageSize(gimage2DArray image)
      int imageSize(gimageBuffer image)
      ivec2 imageSize(gimage2DMS image)
      ivec3 imageSize(gimage2DMSArray image)
      
Description:

    Returns the dimensions of the image or images bound to <image>.  For arrayed 
    images, the last component of the return value will hold the size of the 
    array.  Cube images return the dimensions of one face, and number of cubes 
    in the cube map array, if arrayed.

Dependencies on NV_gpu_program5 and EXT_shader_image_load_store

    If NV_gpu_program5 and EXT_shader_image_load_store are supported and 
    "OPTION ARB_shader_image_size" is specified in an assembly program, the 
    following edits are made to extend the assembly programming model 
    documented in the NV_gpu_program4 extension and extended by NV_gpu_program5 
    and EXT_shader_image_load_store.  

    If NV_gpu_program5 and EXT_shader_image_load_store are not supported, or if 
    "OPTION ARB_shader_image_size" is not specified in an assembly program, the
    contents of this dependencies section should be ignored.

    Section 2.X.2, Program Grammar

    (add the following rules to the grammar)

      <ImageInstruction>:     ::= <IMQop_instruction>

      <IMQop_instruction:>    ::= <IMQop> <opModifiers> <instResult> ","
                                       <imageAccess>
   
      <IMQop>                 ::= "IMQ"


    Modify Section 2.X.4, Program Execution Environment  

      Instr-      Modifiers 
      uction  V  F I C S H D  Out Inputs    Description
      ------- -- - - - - - -  --- --------  --------------------------------      
      IMQ     50 - - - - - S  vs  i         image size query

    (Add to "Section 2.X.6, Program Options" of the NV_gpu_program4 extension,
    as extended by NV_gpu_program5)

      + Image size query (ARB_shader_image_size)

      If a program specifies the "ARB_shader_image_size" option, it may use the
      IMQ instruction.  If this option is not specified, a program will fail to
      compile if it uses this instruction.

    Section 2.X.8.Z, IMQ:  Image size query

    The IMQ instruction returns the dimensions of the image unit specified by
    <imageUnit>.  Eleven image targets are supported:  1D, 2D, 3D, RECT, CUBE,
    BUFFER, ARRAY1D, ARRAY2D, ARRAYCUBE, 2DMS, and ARRAY2DMS. 

    For one-dimensional, one-dimensional array and buffer textures, the "x" 
    component of the result vector is filled with the width of the image(s).
    For two-dimensional, rectangle, cube map, two-dimensional array, cube map
    array, three-dimensional, two-dimensional multisample and two-dimensional 
    multisample array textures, the "x" and "y" components are filled with the
    width and height of the image(s).  
    
    Additionally, when the entire one-dimensional array texture level is bound,
    the "y" component of the result vector is filled with the number of layers
    in the image(s).  When the entire two-dimensional array or two-dimensional
    multisample array texture level is bound, the "z" component of the result 
    vector is filled with the number of layers in the image(s).  When the 
    entire cube map array texture level is bound, the "z" component of the 
    result vector is filled with the number of cubes in the cube map array.
    When the entire three-dimensional texture level is bound, the "z" component
    of the result vector is filled with the depth of the image(s).  All other
    components of the result vector are undefined.  

    IMQ supports no storage modifier, since the image size is independent of 
    the image unit format.  It supports no data type modifiers; the result 
    vector is interpreted as signed integers.

Conformance Tests

    <TBD>

Issues

    none
    
Revision History

    Revision 3, 2012/7/19 (JBreton)
      - Add interaction with NV_gpu_program5 and EXT_shader_image_load_store,
        providing a new image size query instruction to the assembly program.

    Revision 2, 2012/5/12 (JohnK)
      - Expand description to include details consistent with textureSize().

    Revision 1, 2012/03/30 (criccio)
      - First draft
