Name

    ARB_shader_texture_image_samples

Name Strings

    GL_ARB_shader_texture_image_samples

Contact

    Piers Daniell, NVIDIA (pdaniell@nvidia.com)
    Mathias Schott, NVIDIA (mschott@nvidia.com)
    
Contributors

    Tristan Lorach, NVIDIA (tlorach@nvidia.com)
    Christophe Riccio, Unity (christophe.riccio@unity3d.com)
    Evan Hart, NVIDIA (ehart@nvidia.com)
    Jeannot Breton, NVIDIA (jbreton@nvidia.com)
    
Notice

    Copyright (c) 2014 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 June 26, 2014.
    Ratified by the Khronos Board of Promoters on August 7, 2014.

Version

    Last Modified Date: May 28, 2014
    Revision: 7

Number

    ARB Extension #166

Dependencies

    Either GLSL 1.50 or ARB_texture_multisample is required.

    This extension is written against the OpenGL 4.4 specification and 
    version 4.40 of the OpenGL Shading Language Specification.

    This extension interacts with ARB_shader_image_load_store and GLSL 4.20.

    This extension interacts with NV_gpu_program5, EXT_shader_image_load_store 
    and NV_texture_multisample.
    
Overview

    This extension provides GLSL built-in functions allowing shaders to query
    the number of samples of a texture.

New Procedures and Functions

    None.

New Tokens

    None.

Additions to the OpenGL 4.4 (Core Profile) Specification

    None.

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Modifications to The OpenGL Shading Language Specification, Version 4.40.08

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

      #extension GL_ARB_shader_texture_image_samples

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

      #define GL_ARB_shader_texture_image_samples 1

  Add to table in section 8.9.1 "Texture Query Functions"

    Syntax:
     
        int textureSamples(gsampler2DMS sampler)
        int textureSamples(gsampler2DMSArray sampler)
  
    Description:

        Returns the number of samples of the texture or textures bound to
        <sampler>. 
    
Add to table in section 8.12 "Image Functions"

    Syntax:

        int imageSamples(gimage2DMS image)
        int imageSamples(gimage2DMSArray image)
 
    Description:

        Returns the number of samples of the image or images bound to <image>. 
     
Dependencies on ARB_shader_image_load_store and GLSL 4.20.

    If neither ARB_shader_image_load_store nor GLSL 4.20 is enabled in the
    shader, then all overloads of imageSamples are removed.

Dependencies on NV_gpu_program5, EXT_shader_image_load_store and 
NV_texture_multisample

    If NV_gpu_program5, EXT_shader_image_load_store and NV_texture_multisample
    are supported, and "OPTION ARB_shader_texture_image_samples" 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, EXT_shader_image_load_store and NV_texture_multisample.  

    If NV_gpu_program5, EXT_shader_image_load_store or NV_texture_multisample
    are not supported, or if "OPTION ARB_shader_texture_image_samples" 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>    ::= <IMQSop_instruction>

      <IMQSop_instruction>  ::= <IMQSop> <opModifiers> <instResult> ","
                                <imageAccess>
   
      <IMQSop>              ::= "IMQS"
      
      <TEXop_instruction>   ::= <TXQSop> <opModifiers> <instResult> "," 
                                <texAccess>

      <TXQSop>              ::= "TXQS"
      
      
    Modify Section 2.X.4, Program Execution Environment  

      Instr-      Modifiers 
      uction  V  F I C S H D  Out Inputs    Description
      ------- -- - - - - - -  --- --------  --------------------------------      
      IMQS    50 - - - - - S  s   i         image sample query
      TXQS    50 - - - - - S  s   t         texture sample query

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

      + Texture and image sample query (ARB_shader_texture_image_samples)

      If a program specifies the "ARB_shader_texture_image_samples" option, it
      may use the instructions TXQS and IMQS.  If this option is not specified,
      a program will fail to compile if it uses one of those two instructions.
      
      
    Section 2.X.8.Z, IMQS:  Image sample query

    The IMQS instruction returns the number of samples of the image unit 
    specified by <imageUnit>.  Two image targets are supported:  2DMS and
    ARRAY2DMS.  If the texture bound to the image unit has a TEXTURE_SAMPLES
    value of 0, the instruction will return 1.  IMQS supports no data type
    modifiers; the result scalar is interpreted as a signed integer.  IMQS
    supports no storage modifier, since the number of sample is independent of 
    the image unit format.  

    
    Section 2.X.8.Z, TXQS:  Texture sample query

    The TXQS instruction returns the number of samples of the texture image
    unit specified by <texImageUnit>.  Two texture targets are supported:
    2DMS and ARRAY2DMS.  If the texture has a TEXTURE_SAMPLES value of 0, the
    instruction will return 1.  TXQS supports no data type modifiers; the
    result scalar is interpreted as a signed integer.
    
    
Conformance Tests

    <TBD>

Issues

    (1) What should we call this extension?
        
        GL_ARB_shader_image_size added imageSize which apparently was missed 
            from GL_ARB_shader_image_load_store
        GL_ARB_texture_multisample had textureSize built in, so no precedence
      
        Ideas: 
            * GL_ARB_shader_sample_count_query
            * GL_ARB_shader_samples_query
            * GL_ARB_shader_texture_image_sample_count_query
            * GL_ARB_shader_texture_image_samples
            * GL_ARB_shader_texture_image_size_multisample
            * GL_ARB_shader_texture_image_samples
            * GL_ARB_shader_texture_samples
    
        RESOLVED: ARB_shader_texture_image_samples for now to 
            follow the precedent set by GL_ARB_shader_image_size. 
            
            Might change depending on what the final resolution is for Issue (2)
            
    (2) How should we expose this?
    
        (A) separate  textureSamples/imageSamples functions to query 
            just the number of samples
            
            orthogonal to other functions, makes it also easy to add non-awkward
            versions for non MS textures that return 1.
        
        (B) (like that other API): extend textureSize/imageSize to return another
            component in the returned (vec) value
            
            impossible to overload functions based on return type
        
        (C) textureSizeMS/imageSizeMS functions that return the number
            of samples in the last component of the returned (vec) value
            
            Closer to that other API, but ugly and awkward to have non-ms textures
            as arguments for a *SizeMS function.
   
        GL_ARB_texture_multisample Issue (5) suggests A) or (C) as options
        
        RESOLVED: Option A
    
    (3) Do we need overloads for g*Shadow samplers
    
        For consistency with textureSize.
        
        RESOLVED: No, see issue (5).
        
    (4) What other extensions interact with this

        NV_gpu_program5, EXT_shader_image_load_store, and NV_texture_multisample.

        What's the minimal GL/GLSL version we need to depend on.
        
        RESOLVED: The functionality added by this extension is
        perfectly well defined in any shading language version that
        supports multisample textures.  If the shading language, with
        extensions, does not support images, then imageSamples is not
        available.
    
    (5) Do we need overloads for non-MS textures and images

        RESOLVED: No, since the always would return 1. If required, users can create 
        their own overloads that return 1 for non-MS samplers.
        
    (6) Should we add functions to query the position of a sample
    
        RESOLVED: No because of the complexity and implementation burden
        of supporting queries of multisample texture created with
        fixedsamplelocation as false. In that case each pixel might have
        different sample locations. If the app really needs to know the
        sample location inside the shader it can pass in this data as
        a uniforms initialized from GetMultisamplefv(SAMPLE_POSITION)
        queries.
        
Revision History
    Revision 8, 2015/09/08 (idr)
      - Add interactions with various GLSL versions and extensions so
        that this extension can be used with any GLSL version.

    Revision 7, 2014/05/28 (mschott)
      - Minor cleanups of NV_gpu_program5 dependencies in issue 5 and the introduction

    Revision 6, 2014/05/27 (jbreton)
      - Add NV_gpu_program5 dependencies

    Revision 5, 2014/04/16 (pdaniell)
      - Removed textureSamplePosition and imageSamplePosition
      - Resolved issue 6

    Revision 4, 2014/04/09 (mschott)
      - added textureSamplePosition and imageSamplePosition
      - added issue 6

    Revision 3, 2014/03/31 (mschott)
      - removed non-MS overloads
      - added issue 5
    
    Revision 2, 2013/12/13 (mschott)
      - Renamed to GL_ARB_texture_image_samples
      - added shadow sampler overloads
      
    Revision 1, 2013/12/13 (mschott)
      - First draft
