Name

    NV_texture_multisample

Name Strings

    GL_NV_texture_multisample

Contact

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

Status

    Shipping on NVIDIA GPUs (GeForce 8 and up) since Release 190.

Version

    Last Modified Date:         09/10/09
    Revision:                   2

Number

    403

Dependencies

    OpenGL 2.0 is required.

    This extension is written against the OpenGL 3.1 specification and the 
    NV_gpu_program4 extension.

    ARB_texture_multisample is required.

    This extension interacts with NV_explicit_multisample.

    This extension interacts with NV_framebuffer_multisample_coverage.

    This extension interacts with EXT_direct_state_access.

Overview

    This specification extends NV_gpu_program4 to support per-sample fetching
    from multisample textures described in ARB_texture_multisample.
    Specifically, it adds:

      * The TXFMS sample fetch instruction.

      * Texture targets corresponding to the multisample textures added by
        ARB_texture_multisample.

      * A program option to enable these features.
      
    This specification also extends the ARB_texture_multisample extension
    by adding support for EXT_direct_state_access and VCAA multisample
    coverage with seperate <colorSamples> and <coverageSamples> parameters.

New Procedures and Functions

    void TexImage2DMultisampleCoverageNV(enum target,
                                         sizei coverageSamples, sizei colorSamples,
                                         int internalFormat,
                                         sizei width, sizei height,
                                         boolean fixedSampleLocations);
                                         
    void TexImage3DMultisampleCoverageNV(enum target,
                                         sizei coverageSamples, sizei colorSamples,
                                         int internalFormat,
                                         sizei width, sizei height, sizei depth,
                                         boolean fixedSampleLocations);
                                         
    void TextureImage2DMultisampleNV(uint texture, enum target,
                                     sizei samples, int internalFormat,
                                     sizei width, sizei height,
                                     boolean fixedSampleLocations);
                                     
    void TextureImage3DMultisampleNV(uint texture, enum target,
                                     sizei samples, int internalFormat,
                                     sizei width, sizei height, sizei depth,
                                     boolean fixedSampleLocations);
                                     
    void TextureImage2DMultisampleCoverageNV(uint texture, enum target,
                                             sizei coverageSamples, sizei colorSamples,
                                             int internalFormat,
                                             sizei width, sizei height,
                                             boolean fixedSampleLocations);
                                             
    void TextureImage3DMultisampleCoverageNV(uint texture, enum target,
                                             sizei coverageSamples, sizei colorSamples,
                                             int internalFormat,
                                             sizei width, sizei height, sizei depth,
                                             boolean fixedSampleLocations);

New Tokens

    Accepted by the <pname> parameter of GetTexLevelParameter:

        TEXTURE_COVERAGE_SAMPLES_NV              0x9045
        TEXTURE_COLOR_SAMPLES_NV                 0x9046

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

    Modify Section 2.X.2, Program Grammar

    If a program specifies the NV_texture_multisample program option, add to
    existing grammar rules if not already present:

    <texTarget>             ::= "2DMS"
                              | "ARRAY2DMS"

    <TEXop>                 ::= "TXFMS"

    Add to section 2.X.4.4, Program Texture Access

    Add row to table X.17

                                                           coordinates used
      texTarget          Texture Type                     s t r  layer  shadow
      ----------------   ---------------------            -----  -----  ------
      2DMS               TEXTURE_2D_MULTISAMPLE             <not supported>
      ARRAY2DMS          TEXTURE_2D_MULTISAMPLE_ARRAY       <not supported>

    Add row to table X.18

                                      coordinates used
      texTarget          supported      i j k  layer  lod
      ----------------   ---------      -----  -----  ---
      2DMS                  no          - - -    -     -
      ARRAY2DMS             no          - - -    -     -

    Replace or add language explaining TexelFetchMultisample after the
    discussion of TexelFetch

    The TXFMS instruction provides the ability to extract a single sample from
    a specified renderbuffer, two-dimensional multisample, or two-dimensional
    multisample array texture image using the function:

      result_t_vec TexelFetchMultisample(int_vec coord, int_vec offset);

    The extracted texel is converted to an (R,G,B,A) vector according to Table
    3.20.  The result vector is interpreted as floating-point, signed integer,
    or unsigned integer, according to the data type modifier of the
    instruction.  If the internal format of the texture is not compatible with
    the instruction's data type modifier, the extracted texel value is
    undefined.

    <coord> is a four-component signed integer vector used to identify the
    single sample accessed. For the 2DMS and RENDERBUFFER targets, the x and y
    components are used to select the pixel and the w component is used to
    select the sample. For the ARRAY2DMS target, the x, y, and z components are
    used to select the texel and the w component is used to select the sample.
    All of the restrictions of TexelFetch apply to TexelFetchMultisample, with
    the additional requirement that it must be called on a RENDERBUFFER, 2DMS,
    or ARRAY2DMS texture target. If the sample number is greater than or equal
    to the value of SAMPLES for the multisample texture, the results are
    undefined.

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

    Add to the end of Section 3.8.4 (Multisample Textures):
    
    The commands
    
        void TexImage2DMultisampleCoverageNV(enum target,
                                         sizei coverageSamples, sizei colorSamples,
                                         int internalFormat,
                                         sizei width, sizei height,
                                         boolean fixedSampleLocations);
                                         
        void TexImage3DMultisampleCoverageNV(enum target,
                                         sizei coverageSamples, sizei colorSamples,
                                         int internalFormat,
                                         sizei width, sizei height, sizei depth,
                                         boolean fixedSampleLocations);
                                         
    establish the data storage, format, dimensions, and number of samples of a
    multisample texture's image where the number of <colorSamples> and
    <coverageSamples> can be explicitly specified.
    
    If <coverageSamples> is zero, then TEXTURE_COVERAGE_SAMPLES_NV 
    is set to zero.  Otherwise <coverageSamples> represents a request 
    for a desired minimum number of coverage samples. Since different 
    implementations may support different coverage sample counts for 
    multisampled rendering, the actual number of coverage samples 
    allocated for the renderbuffer image is implementation dependent.  
    However, the resulting value for TEXTURE_COVERAGE_SAMPLES_NV is
    guaranteed to be greater than or equal to <coverageSamples> and no 
    more than the next larger coverage sample count supported by the 
    implementation.

    If <colorSamples> is zero then TEXTURE_COLOR_SAMPLES_NV is set
    to zero.  Otherwise, <colorSamples> represents a request for a 
    desired minimum number of colors samples.  Since different 
    implementations may support different color sample counts for 
    multisampled rendering, the actual number of color samples 
    allocated for the renderbuffer image is implementation dependent.
    Furthermore, a given implementation may support different color 
    sample counts for each supported coverage sample count.  The
    resulting value for TEXTURE_COLOR_SAMPLES_NV is determined
    after resolving the value for TEXTURE_COVERAGE_SAMPLES_NV.
    If the requested color sample count exceeds the maximum number of
    color samples supported by the implementation given the value of
    TEXTURE_COVERAGE_SAMPLES_NV, the implementation will set
    TEXTURE_COLOR_SAMPLES_NV to the highest supported value.  
    Otherwise, the resulting value for TEXTURE_COLOR_SAMPLES_NV is
    guaranteed to be greater than or equal to <colorSamples> and no 
    more than the next larger color sample count supported by the 
    implementation given the value of TEXTURE_COVERAGE_SAMPLES_NV.

    If <colorSamples> is greater than <coverageSamples>, the error
    INVALID_VALUE is generated.

    If <coverageSamples> or <colorSamples> is greater than 
    MAX_SAMPLES_EXT, the error INVALID_VALUE is generated.

    If <coverageSamples> is greater than zero, and <colorSamples> is
    zero, RENDERBUFFER_COLOR_SAMPLES_NV is set to an implementation
    dependent value based on RENDERBUFFER_COVERAGE_SAMPLES_NV.
    
    An implementation may only support a subset of the possible
    combinations of coverage samples and color samples.  Requests for
    combinations not supported by the implementation are resolved to
    a supported combination using the rules above.  The number of 
    supported combinations is MAX_MULTISAMPLE_COVERAGE_MODES_NV.
    MULTISAMPLE_COVERAGE_MODES_NV is an array of 
    MAX_MULTISAMPLE_COVERAGE_MODES_NV pairs of integers representing
    the combinations of coverage samples and color samples supported
    by the implementation.  The first integer in each pair corresponds
    to coverage samples, while the second corresponds to color samples.
    
    (Note: MULTISAMPLE_COVERAGE_MODES_NV and MAX_MULTISAMPLE_COVERAGE_MODES_NV
    are specified in the NV_framebuffer_multisample_coverage extension.)

    Add to the end of section 3.8.14 (Texture Objects):
        
    The following multisample texture update commands:
    
        void TextureImage2DMultisampleNV(uint texture, enum target,
                                     sizei samples, int internalFormat,
                                     sizei width, sizei height,
                                     boolean fixedSampleLocations);
                                         
        void TextureImage3DMultisampleNV(uint texture, enum target,
                                     sizei samples, int internalFormat,
                                     sizei width, sizei height, sizei depth,
                                     boolean fixedSampleLocations);
                                         
        void TextureImage2DMultisampleCoverageNV(uint texture, enum target,
                                             sizei coverageSamples, sizei colorSamples,
                                             int internalFormat,
                                             sizei width, sizei height,
                                             boolean fixedSampleLocations);
                                                 
        void TextureImage3DMultisampleCoverageNV(uint texture, enum target,
                                             sizei coverageSamples, sizei colorSamples,
                                             int internalFormat,
                                             sizei width, sizei height, sizei depth,
                                             boolean fixedSampleLocations);        

    operate identically to the corresponding command where "Texture"
    is substituted for "Tex" (and extension suffixes are dropped or
    updated appropriately) except, rather than updating the current bound
    texture for the texture unit indicated by the current active texture
    state and the target parameter, these "Texture" commands update the
    texture object named by the initial texture parameter.  If the
    texture parameter is zero, then the target parameter selects the
    default texture of the specified target to update.  The remaining
    parameters following the initial texture parameter for the listed
    "Texture" commands match the parameters for the corresponding "Tex"
    command and are interpreted as they are for the "Tex" command.
    If the texture parameter is for an unused name, the name becomes
    used and the named texture object is set to a new state vector,
    comprising all the state values listed in section 3.8.11, set
    to the same initial values prior to the command's state update.
    If the texture parameter is for a used name and that named texture
    object has a different target than the specified target parameter,
    the INVALID_OPERATION error is generated.  One consequence of this
    error for commands that accepts TEXTURE_PROXY_* as a valid target
    parameter is TEXTURE_PROXY_* target tokens generate errors if used
    with a non-zero texture parameter because the target of a non-default
    (non-zero) texture object is never a proxy target."

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

    None.

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

    None.

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

    None.

Additions to the AGL/GLX/WGL Specifications

    None.
    
New State

    (add to table 6.14, Textures (state per texture image p. 252)
                                                                           Initial
    Get Value                         Type  Get Command                    Value    Description          Section
    --------------------------------  ----  -----------------------------  -------  -------------------  ------------
    TEXTURE_COVERAGE_SAMPLES_NV        Z+   GetTexLevelParameter              0     Number of coverage   3.8.4
                                                                                    samples per texel
    TEXTURE_COLOR_SAMPLES_NV           Z+   GetTexLevelParameter              0     Number of color      3.8.4
                                                                                    samples per texel

Interactions with NV_explicit_multisample

    If NV_explicit_multisample is not present, the language following the discussion
    of Texelfetch in section 2.X.4.4, Program Texture Access will be new and should
    omit any mention of sampling from renderbuffers.
    
Dependencies on EXT_direct_state_access

    If EXT_direct_state_access is not supported, remove references to the
    TextureImage* commands added by this extension.
    
Issues

    (1) What should this extension be called?

    RESOLVED: NV_texture_multisample. It contains the NVIDIA specific portions
    of ARB_texture_multisample.

    (2) What should the multisample texel fetch opcode be called?

    RESOLVED: TEXFMS. It is currently called TXFMS to correspond to the GLSL
    builtin, TexelFetchMultisample. It has been suggested that this builtin be
    renamed. Even if it is, TEXFMS matches the opcode added via
    NV_explicit_multisample. It is better to mismatch GLSL than have two opcodes
    for the same operation.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
    1     6/23/09   groth     Extracted from portions of an earlier version of
                              ARB_texture_multisample 

    2     9/10/09   pdaniell  Add support for VCAA and DSA
