Name

    NV_framebuffer_multisample

Name Strings

    GL_NV_framebuffer_multisample

Contributors

    Contributors to EXT_framebuffer_multisample
    Contributors from ANGLE_framebuffer_multisample

    Gregory Roth, NVIDIA
    Mathias Heyer, NVIDIA
    Xi Chen, NVIDIA

Contacts

    Mathias Heyer, NVIDIA (mheyer 'at' nvidia 'dot' com)

Status

    Complete

Version

    Last Modified Date: March 03, 2015
    Author Revision: #5

Number

    OpenGL ES Extension #143

Dependencies

    Requires OpenGL ES 2.0.

    Requires GL_NV_framebuffer_blit.

    The extension is written against the OpenGL ES 2.0.25
    (November 2, 2010) specification.

    OES_texture_3D affects the definition of this extension.
    NV_texture_array affects the definition of this extension.

    This extension interacts with OpenGL ES 3.0 and later versions.

Overview

    This extension extends the framebuffer object framework to
    enable multisample rendering.

    The new operation RenderbufferStorageMultisampleNV() allocates
    storage for a renderbuffer object that can be used as a multisample
    buffer.  A multisample render buffer image differs from a
    single-sample render buffer image in that a multisample image has a
    number of SAMPLES that is greater than zero.  No method is provided
    for creating multisample texture images.

    All of the framebuffer-attachable images attached to a framebuffer
    object must have the same number of SAMPLES or else the framebuffer
    object is not "framebuffer complete".  If a framebuffer object with
    multisample attachments is "framebuffer complete", then the
    framebuffer object behaves as if SAMPLE_BUFFERS is one.

    A resolve operation is executed by calling
    BlitFramebufferNV (provided by the NV_framebuffer_blit
    extension) where the source is a multisample framebuffer object
    and the destination is a single-sample framebuffer object.
    Source and destination framebuffer may be either application-created
    or window-system provided.

New Procedures and Functions

    void RenderbufferStorageMultisampleNV(
            enum target, sizei samples,
            enum internalformat,
            sizei width, sizei height);

New Tokens

    Accepted by the <pname> parameter of GetRenderbufferParameteriv:

        RENDERBUFFER_SAMPLES_NV                     0x8CAB

    Returned by CheckFramebufferStatus:

        FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV       0x8D56

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    and GetFloatv:

        MAX_SAMPLES_NV                              0x8D57

Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)

    Add to the last paragraph of 3.7.2 (Alternate Texture Image Specification)
    (as modified by NV_framebuffer_blit) the following:

    "Calling CopyTexSubImage3DOES, CopyTexSubImage3DNV,
    CopyTexImage2D or CopyTexSubImage2D will result in INVALID_OPERATION
    being generated if the object bound to READ_FRAMEBUFFER_BINDING_NV
    is "framebuffer complete" and the value of SAMPLE_BUFFERS is greater
    than zero."

Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
Operations and the Framebuffer)

    Add to 4.3.1 (Reading Pixels), right before the subsection titled
    "Obtaining Pixels from the Framebuffer":

    "ReadPixels generates INVALID_OPERATION if READ_FRAMEBUFFER_BINDING_NV
    (section 4.4) is non-zero, the read framebuffer is framebuffer
    complete, and the value of SAMPLE_BUFFERS for the read framebuffer
    is greater than zero."

    In 4.3.2 (Copying Pixels), add to the section describing BlitFramebufferNV
    that was added by NV_framebuffer_blit.

    "If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    SAMPLE_BUFFERS for the draw framebuffer is zero, the samples
    corresponding to each pixel location in the source are converted to
    a single sample before being written to the destination.

    If SAMPLE_BUFFERS for the read framebuffer is zero and
    SAMPLE_BUFFERS for the draw framebuffer is greater than zero, the
    value of the source sample is replicated in each of the destination
    samples.

    If SAMPLE_BUFFERS for both the read and draw framebuffers are
    greater than zero, and the values of SAMPLES for the read and draw
    framebuffers are identical, the samples are copied without
    modification from the read framebuffer to the draw framebuffer.
    Otherwise, no copy is performed and an INVALID_OPERATION error is
    generated.

    If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    the format of the read and draw framebuffers are not identical, no
    copy is performed and an INVALID_OPERATION error is generated.

    Furthermore, if SAMPLE_BUFFERS for either the read framebuffer or
    draw framebuffer is greater than zero, no copy is performed and an
    INVALID_OPERATION error is generated if the dimensions of the source
    and destination rectangles provided to BlitFramebufferNV are not
    identical, or if the formats of the read and draw framebuffers are
    not identical.

    Modification to 4.4.3 (Renderbuffer Objects)

    Add, just above the definition of RenderbufferStorage:

    "The command

        void RenderbufferStorageMultisampleNV(
            enum target, sizei samples,
            enum internalformat,
            sizei width, sizei height);

    establishes the data storage, format, dimensions, and number of
    samples of a renderbuffer object's image.  <target> must be
    RENDERBUFFER.  <internalformat> must be one of the color-renderable,
    depth-renderable, or stencil-renderable formats described in table 4.5.
    <width> and <height> are the dimensions in pixels of the renderbuffer.  If
    either <width> or <height> is greater than the value of
    MAX_RENDERBUFFER_SIZE, or if <samples> is greater than MAX_SAMPLES_NV,
    then the error INVALID_VALUE is generated. If OpenGL ES is unable to
    create a data store of the requested size, the error OUT_OF_MEMORY
    is generated.

    Upon success, RenderbufferStorageMultisampleNV deletes any existing
    data store for the renderbuffer image and the contents of the data
    store after calling RenderbufferStorageMultisampleNV are undefined.
    RENDERBUFFER_WIDTH is set to <width>, RENDERBUFFER_HEIGHT is
    set to <height>, and RENDERBUFFER_INTERNAL_FORMAT is set to
    <internalformat>.

    If <samples> is zero, then RENDERBUFFER_SAMPLES_NV is set to zero.
    Otherwise <samples> represents a request for a desired minimum
    number of samples. Since different implementations may support
    different sample counts for multisampled rendering, the actual
    number of samples allocated for the renderbuffer image is
    implementation dependent.  However, the resulting value for
    RENDERBUFFER_SAMPLES_NV is guaranteed to be greater than or equal
    to <samples> and no more than the next larger sample count supported
    by the implementation.

    An OpenGL ES implementation may vary its allocation of internal component
    resolution based on any RenderbufferStorageMultisampleNV parameter (except
    target), but the allocation and chosen internal format must not be a
    function of any other state and cannot be changed once they are
    established. The actual resolution in bits of each component of the
    allocated image can be queried with GetRenderbufferParameteriv."

    Modify the definiton of RenderbufferStorage as follows:

    "The command

        void RenderbufferStorage(enum target, enum internalformat,
                                    sizei width, sizei height);

     is equivalent to calling RenderbufferStorageMultisampleNV with
     <samples> equal to zero."

    In section 4.4.5 (Framebuffer Completeness) in the subsection
    titled "Framebuffer Completeness" add an entry to the bullet list:

    * The value of RENDERBUFFER_SAMPLES_NV is the same for all attached
      images.
      { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV }

    Also add a paragraph to the end of the section after the definition
    of CheckFramebufferStatus:

    "The values of SAMPLE_BUFFERS and SAMPLES are derived from the
    attachments of the currently bound framebuffer object.  If the
    current DRAW_FRAMEBUFFER_BINDING_NV is not "framebuffer complete",
    then both SAMPLE_BUFFERS and SAMPLES are undefined.  Otherwise,
    SAMPLES is equal to the value of RENDERBUFFER_SAMPLES_NV for the
    attached images (which all must have the same value for
    RENDERBUFFER_SAMPLES_NV). Further, SAMPLE_BUFFERS is one if
    SAMPLES is non-zero.  Otherwise, SAMPLE_BUFFERS is zero.

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

    In section 6.1.3 (Enumeraged Queries), modify the third paragraph
    of the description of GetRenderbufferParameteriv as follows:

    "Upon successful return from GetRenderbufferParameteriv, if
    <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
    RENDERBUFFER_INTERNAL_FORMAT, or RENDERBUFFER_SAMPLES_NV, then <params>
    will contain the width in pixels, height in pixels, internal format, or
    number of samples, respectively, of the image of the renderbuffer
    currently bound to <target>."

Dependencies on OpenGL ES 3.0 and later

    If OpenGL ES 3.0 or later is supported, the described modifications to
    language for BlitFramebufferNV also apply to BlitFramebuffer:

    (Add to the end of the section describing BlitFramebuffer)

    "If SAMPLE_BUFFERS for the read framebuffer is zero and
    SAMPLE_BUFFERS for the draw framebuffer is greater than zero, the
    value of the source sample is replicated in each of the destination
    samples.

    If SAMPLE_BUFFERS for both the read and draw framebuffers are
    greater than zero, and the values of SAMPLES for the read and draw
    framebuffers are identical, the samples are copied without
    modification from the read framebuffer to the draw framebuffer.
    Otherwise, no copy is performed and an INVALID_OPERATION error is
    generated."

    (In the error list for BlitFramebuffer, modify the item "An
    INVALID_OPERATION error is generated if the draw framebuffer is
    multisampled.")

        * An INVALID_OPERATION error is generated if both the read and
          draw buffers are multisampled, and SAMPLE_BUFFERS for the read and
          draw buffers are not identical.

    (In the error list for BlitFramebuffer, add to the list)

        * An INVALID_OPERATION error is generated if either the read or draw
          buffer is multisampled, and the formats of the read and draw
          framebuffers are not identical.

Dependencies on NV_framebuffer_blit

    NV_framebuffer_blit is required.  Technically, NV_framebuffer_blit
    would not be required to support multisampled rendering, except for
    the fact that it provides the only method of doing a multisample
    resovle from a multisample renderbuffer.

Dependencies on OES_texture_3D and NV_texture_array

    On an OpenGL ES implementation, in the absense of OES_texture_3D or
    NV_texture_array, omit references to CopyTexSubImage3DOES and
    CopyTexSubImage3DNV, respectively.


Errors

    The error INVALID_OPERATION is generated if ReadPixels or
    CopyTex{Sub}Image* is called while READ_FRAMEBUFFER_BINDING_NV
    is non-zero, the read framebuffer is framebuffer complete, and the
    value of SAMPLE_BUFFERS for the read framebuffer is greater than
    zero.

    If both the draw and read framebuffers are framebuffer complete and
    both have a value of SAMPLE_BUFFERS that is greater than zero, then
    the error INVALID_OPERATION is generated if BlitFramebufferNV is
    called and the values of SAMPLES for the draw and read framebuffers
    do not match.

    If both the draw and read framebuffers are framebuffer complete and
    either has a value of SAMPLE_BUFFERS that is greater than zero, then
    the error INVALID_OPERATION is generated if BlitFramebufferNV is
    called and the formats of the draw and read framebuffers are not
    identical.

    If either the draw or read framebuffer is framebuffer complete and
    has a value of SAMPLE_BUFFERS that is greater than zero, then the
    error INVALID_OPERATION is generated if BlitFramebufferNV is called
    and the specified source and destination dimensions are not
    identical.

    If RenderbufferStorageMultisampleNV is called with <target> not
    equal to RENDERBUFFER, the error INVALID_ENUM is generated.

    If RenderbufferStorageMultisampleNV is called with an
    <internalformat> that is not listed as one of the color-, depth-
    or stencil-renderable formats in Table 4.5, then the error
    INVALID_ENUM is generated.

    If RenderbufferStorageMultisampleNV is called with <width> or
    <height> greater than MAX_RENDERBUFFER_SIZE, then the error
    INVALID_VALUE is generated.

    If RenderbufferStorageMultisampleNV is called with a value of
    <samples> that is greater than MAX_SAMPLES_NV or less than zero,
    then the error INVALID_VALUE is generated.

    The error OUT_OF_MEMORY is generated when
    RenderbufferStorageMultisampleNV cannot create storage of the
    specified size.

New State

    Add to table 6.23 (Renderbuffer State)

    Get Value                        Type    Get Command                 Initial Value  Description             Section
    -------------------------------  ------  --------------------------  -------------  --------------------    -------
    RENDERBUFFER_SAMPLES_NV          Z+      GetRenderbufferParameteriv  0              number of samples       4.4.3


    Add to table 6.21 (Framebuffer Dependent Values)
    the following new framebuffer dependent state.

    Get Value          Type  Get Command     Minimum Value    Description             Section
    -----------------  ----  -----------     -------------    -------------------     -------
    MAX_SAMPLES_NV     Z+    GetIntegerv     1                Maximum number of       4.4.3
                                                              samples supported
                                                              for multisampling



Issues

    Issues from EXT_framebuffer_multisample have been removed.

    1) How is this extension different from Halti and ARB_framebuffer_object ?
        - this extension offers the same MSAA functionality as in
          ARB_framebuffer_object
        - it is a superset of Halti in that:
            a) SINGLE-->MSAA and MSAA-->MSAA blits are possible
            b) the blit region may be relocated during the blit

Revision History
    Revision 5, 2015/03/03
      - add interaction with OpenGL ES 3.0 and later
    Revision 4, 2012/08/31
      - add interaction with NV_texture_array
    Revision 3, 2012/08/29
      - consolidate contributors list
      - be more explicit about the specification version the text is written against
    Revision 2, 2012/08/15
      - explicitly state that resolve blits from the window system provided framebuffer
        are possible
      - fix references to table 6.21 and table 6.23
    Revision 1, 2012/05/15
      - copied from revision 3 of ANGLE_framebuffer_multisample
      - re-inserted missing functionality of EXT_framebuffer_blit

