Name

    NV_texture_multisample

Name Strings

    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
