Name

    ANGLE_framebuffer_multisample

Name Strings

    GL_ANGLE_framebuffer_multisample

Contributors

    Contributors to EXT_framebuffer_multisample
    Daniel Koch, TransGaming Inc.
    Shannon Woods, TransGaming Inc.
    Kenneth Russell, Google Inc.
    Vangelis Kokkevis, Google Inc.

Contacts

    Daniel Koch, TransGaming Inc. (daniel 'at' transgaming 'dot' com)

Status

    Implemented in ANGLE ES2

Version

    Last Modified Date: Aug 6, 2010 
    Author Revision: #3

Number

    OpenGL ES Extension #84

Dependencies

    Requires OpenGL ES 2.0.

    Requires GL_ANGLE_framebuffer_blit (or equivalent functionality).

    The extension is written against the OpenGL ES 2.0 specification. 

    OES_texture_3D affects the definition of this extension.

Overview

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

    The new operation RenderbufferStorageMultisampleANGLE() 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.

    The resolve operation is affected by calling 
    BlitFramebufferANGLE (provided by the ANGLE_framebuffer_blit
    extension) where the source is a multisample application-created
    framebuffer object and the destination is a single-sample
    framebuffer object (either application-created or window-system
    provided).

New Procedures and Functions

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

New Types

    None.

New Tokens

    Accepted by the <pname> parameter of GetRenderbufferParameteriv:

        RENDERBUFFER_SAMPLES_ANGLE                  0x8CAB

    Returned by CheckFramebufferStatus:

        FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE    0x8D56

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

        MAX_SAMPLES_ANGLE                           0x8D57

Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)

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 ANGLE_framebuffer_blit) the following:

    "Calling CopyTexSubImage3DOES, CopyTexImage2D or CopyTexSubImage2D will
    result in INVALID_OPERATION being generated if the object bound to
    READ_FRAMEBUFFER_BINDING_ANGLE 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_ANGLE
    (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 BlitFramebuffer
    that was added by ANGLE_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 draw framebuffer is greater than zero, 
    no copy is performed and an INVALID_OPERATION error is generated.

    If SAMPLE_BUFFERS for the read framebuffer is greater than zero and
    <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT, 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.

    If SAMPLE_BUFFERS for the read framebuffer is greater than zero, the
    dimensions of the source and destination rectangles provided to 
    BlitFramebufferANGLE must be identical and must specify the complete 
    source and destination buffers, otherwise no copy is performed and 
    an INVALID_OPERATION error is generated."

    Modification to 4.4.3 (Renderbuffer Objects)

    Add, just above the definition of RenderbufferStorage:

    "The command

        void RenderbufferStorageMultisampleANGLE(
            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_ANGLE, 
    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, RenderbufferStorageMultisampleANGLE deletes any existing
    data store for the renderbuffer image and the contents of the data
    store after calling RenderbufferStorageMultisampleANGLE 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_ANGLE 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_ANGLE 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 RenderbufferStorageMultisampleANGLE 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 RenderbufferStorageMultisampleANGLE 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_ANGLE is the same for all attached
      images.
      { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE }

    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_ANGLE is not "framebuffer complete",
    then both SAMPLE_BUFFERS and SAMPLES are undefined.  Otherwise,
    SAMPLES is equal to the value of RENDERBUFFER_SAMPLES_ANGLE for the
    attached images (which all must have the same value for
    RENDERBUFFER_SAMPLES_ANGLE).  Further, SAMPLE_BUFFERS is one if
    SAMPLES is non-zero.  Otherwise, SAMPLE_BUFFERS is zero.

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


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_ANGLE, 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 ANGLE_framebuffer_blit    

    ANGLE_framebuffer_blit is required.  Technically, ANGLE_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

    On an OpenGL ES implementation, in the absense of OES_texture_3D,
    omit references to CopyTexSubImage3DOES.

Errors

    The error INVALID_OPERATION is generated if ReadPixels or 
    CopyTex{Sub}Image* is called while READ_FRAMEBUFFER_BINDING_ANGLE
    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
    the draw framebuffer has a value of SAMPLE_BUFFERS that is greater 
    than zero, then the error INVALID_OPERATION is generated if 
    BlitFramebufferANGLE is called.

    If both the draw and read framebuffers are framebuffer complete and
    the read framebuffer has a value of SAMPLE_BUFFERS that is greater
    than zero, the error INVALID_OPERATION is generated if 
    BlitFramebufferANGLE is called and any of the following conditions
    are true:
     - <mask> includes DEPTH_BUFFER_BIT or STENCIL_BUFFER_BIT.
     - the source or destination rectangles do not specify the entire
       source or destination buffer.

    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 BlitFramebufferANGLE 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 BlitFramebufferANGLE is called
    and the specified source and destination dimensions are not
    identical.

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

    If RenderbufferStorageMultisampleANGLE 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 RenderbufferStorageMultisampleANGLE is called with <width> or 
    <height> greater than MAX_RENDERBUFFER_SIZE, then the error 
    INVALID_VALUE is generated.

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

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

New State

    Add to table 6.22 (Renderbuffer State)

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


    Add to table 6.yy (Framebuffer Dependent Vaues) (added by 
    ANGLE_framebuffer_blit), the following new framebuffer dependent state.

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


Issues
    
    Issues from EXT_framebuffer_multisample have been removed.
 
    1) What should we call this extension?

       Resolved: ANGLE_framebuffer_blit.  

       This extension is a result of a collaboration between Google and 
       TransGaming for the open-source ANGLE project. Typically one would
       label a multi-vendor extension as EXT, but EXT_framebuffer_mulitsample 
       is already the name for this on Desktop GL.  Additionally this
       isn't truely a multi-vendor extension because there is only one
       implementation of this.  We'll follow the example of the open-source
       MESA project which uses the project name for the vendor suffix.
 
    2) How does this extension differ from EXT_framebuffer_multisample?

       This is designed to be a proper subset of EXT_framebuffer_multisample
       functionality as applicable to OpenGL ES 2.0.

       Functionality that is unchanged: 
        - creation of multisample renderbuffers.
        - whole buffer multi-sample->single-sample resolve.
        - no format conversions, stretching or flipping supported on multisample blits.

       Additional restrictions on BlitFramebufferANGLE:
        - multisample resolve is only supported on color buffers.
        - no blits to multisample destinations (no single->multi or multi-multi).
        - only entire buffers can be resolved.
         
Revision History

    Revision 1, 2010/07/08
      - copied from revision 7 of EXT_framebuffer_multisample
      - removed language that was not relevant to ES2 
      - rebase changes against the Open GL ES 2.0 specification
      - added ANGLE-specific restrictions
    Revision 2, 2010/07/19
      - fix missing error code
    Revision 3, 2010/08/06
      - add additional contributors, update implementation status
      - disallow negative samples 
